Annotation of sbbs/sbbs3/un_rep.cpp, revision 1.1

1.1     ! root        1: /* un_rep.cpp */
        !             2: 
        !             3: /* Synchronet QWK replay (REP) packet unpacking routine */
        !             4: 
        !             5: /* $Id: un_rep.cpp,v 1.9 2000/12/31 03:41:55 rswindell Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: #include "sbbs.h"
        !            39: #include "qwk.h"
        !            40: 
        !            41: /****************************************************************************/
        !            42: /* Unpacks .REP packet, 'repname' is the path and filename of the packet    */
        !            43: /****************************************************************************/
        !            44: bool sbbs_t::unpack_rep(char* repfile)
        !            45: {
        !            46:        char    str[256],fname[128]
        !            47:                        ,*AttemptedToUploadREPpacket="Attempted to upload REP packet";
        !            48:        char    tmp[512];
        !            49:        char    block[128];
        !            50:        int     file;
        !            51:        uint    i,j,k,lastsub=INVALID_SUB;
        !            52:        long    l,size,misc;
        !            53:        ulong   n;
        !            54:        ulong   ex;
        !            55:        node_t  node;
        !            56:        FILE*   rep;
        !            57:        DIR*    dir;
        !            58:        DIRENT* dirent;
        !            59: 
        !            60:        if(repfile!=NULL)
        !            61:                strcpy(str,repfile);
        !            62:        else
        !            63:                sprintf(str,"%s%s.rep",cfg.temp_dir,cfg.sys_id);
        !            64:        if(!fexist(str)) {
        !            65:                bputs(text[QWKReplyNotReceived]);
        !            66:                logline("U!",AttemptedToUploadREPpacket);
        !            67:                logline(nulstr,"REP file not received");
        !            68:                return(false); 
        !            69:        }
        !            70:        for(k=0;k<cfg.total_fextrs;k++)
        !            71:                if(!stricmp(cfg.fextr[k]->ext,useron.tmpext) && chk_ar(cfg.fextr[k]->ar,&useron))
        !            72:                        break;
        !            73:        if(k>=cfg.total_fextrs)
        !            74:                k=0;
        !            75:        ex=EX_OUTL|EX_OUTR;
        !            76:        if(!online)
        !            77:                ex|=EX_OFFLINE;
        !            78:        i=external(cmdstr(cfg.fextr[k]->cmd,str,ALLFILES,NULL),ex);
        !            79:        if(i) {
        !            80:                bputs(text[QWKExtractionFailed]);
        !            81:                logline("U!",AttemptedToUploadREPpacket);
        !            82:                logline(nulstr,"Extraction failed");
        !            83:                return(false); 
        !            84:        }
        !            85:        sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.sys_id);
        !            86:        if(!fexist(str)) {
        !            87:                bputs(text[QWKReplyNotReceived]);
        !            88:                logline("U!",AttemptedToUploadREPpacket);
        !            89:                logline(nulstr,"MSG file not received");
        !            90:                return(false); 
        !            91:        }
        !            92:        if((rep=fnopen(&file,str,O_RDONLY))==NULL) {
        !            93:                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
        !            94:                return(false); 
        !            95:        }
        !            96:        size=filelength(file);
        !            97:        fread(block,128,1,rep);
        !            98:        if(strnicmp((char *)block,cfg.sys_id,strlen(cfg.sys_id))) {
        !            99:                fclose(rep);
        !           100:                bputs(text[QWKReplyNotReceived]);
        !           101:                logline("U!",AttemptedToUploadREPpacket);
        !           102:                logline(nulstr,"Incorrect BBSID");
        !           103:                return(false); 
        !           104:        }
        !           105:        logline("U+","Uploaded REP packet");
        !           106:        /********************/
        !           107:        /* Process messages */
        !           108:        /********************/
        !           109:        bputs(text[QWKUnpacking]);
        !           110: 
        !           111:        for(l=128;l<size;l+=i*128) {
        !           112:                lncntr=0;                                       /* defeat pause */
        !           113:                if(fseek(rep,l,SEEK_SET)!=0) {
        !           114:                        sprintf(str,"%s.msg", cfg.sys_id);
        !           115:                        errormsg(WHERE,ERR_SEEK,str,l);
        !           116:                        break;
        !           117:                }
        !           118:                if(fread(block,1,128,rep)!=128) {
        !           119:                        sprintf(str,"%s.msg", cfg.sys_id);
        !           120:                        errormsg(WHERE,ERR_READ,str,ftell(rep));
        !           121:                        break;
        !           122:                }
        !           123:                sprintf(tmp,"%.6s",block+116);
        !           124:                i=atoi(tmp);  /* i = number of 128 byte records */
        !           125:                if(i<2) {
        !           126:                        sprintf(str,"%s.msg blocks (read '%s' at offset %ld)", cfg.sys_id, tmp, l);
        !           127:                        errormsg(WHERE,ERR_CHK,str,i);
        !           128:                        i=1;
        !           129:                        continue; }
        !           130:                if(atoi(block+1)==0) {                                  /**********/
        !           131:                        if(useron.rest&FLAG('E')) {         /* E-mail */
        !           132:                                bputs(text[R_Email]);                   /**********/
        !           133:                                continue; }
        !           134: 
        !           135:                        sprintf(str,"%25.25s",block+21);
        !           136:                        truncsp(str);
        !           137:                        if(!stricmp(str,"NETMAIL")) {  /* QWK to FidoNet NetMail */
        !           138:                                qwktonetmail(rep,block,NULL,0);
        !           139:                                continue; }
        !           140:                        if(strchr(str,'@')) {
        !           141:                                qwktonetmail(rep,block,str,0);
        !           142:                                continue; }
        !           143:                        if(!stricmp(str,"SBBS")) {    /* to SBBS, config stuff */
        !           144:                                qwkcfgline(block+71,INVALID_SUB);
        !           145:                                continue; }
        !           146: 
        !           147:                        if(useron.etoday>=cfg.level_emailperday[useron.level]
        !           148:                                && !(useron.rest&FLAG('Q'))) {
        !           149:                                bputs(text[TooManyEmailsToday]);
        !           150:                                continue; }
        !           151:                        j=atoi(str);
        !           152:                        if(j && j>lastuser(&cfg))
        !           153:                                j=0;
        !           154:                        if(!j &&
        !           155:                                (!stricmp(str,"SYSOP")
        !           156:                                || !stricmp(str,cfg.sys_id)
        !           157:                                || !stricmp(str,cfg.sys_op)))
        !           158:                                j=1;
        !           159:                        if(!j)
        !           160:                                j=matchuser(&cfg,str);
        !           161:                        if(!j) {
        !           162:                                bputs(text[UnknownUser]);
        !           163:                                continue; }
        !           164:                        if(j==1 && useron.rest&FLAG('S')) {
        !           165:                                bprintf(text[R_Feedback],cfg.sys_op);
        !           166:                                continue; }
        !           167: 
        !           168:                        getuserrec(&cfg,j,U_MISC,8,str);
        !           169:                        misc=ahtoul(str);
        !           170:                        if(misc&NETMAIL && cfg.sys_misc&SM_FWDTONET) {
        !           171:                                getuserrec(&cfg,j,U_NETMAIL,LEN_NETMAIL,str);
        !           172:                                qwktonetmail(rep,block,str,0);
        !           173:                                continue; }
        !           174: 
        !           175:                        sprintf(smb.file,"%smail",cfg.data_dir);
        !           176:                        smb.retry_time=cfg.smb_retry_time;
        !           177: 
        !           178:                        if(lastsub!=INVALID_SUB) {
        !           179:                                smb_close(&smb);
        !           180:                                lastsub=INVALID_SUB; }
        !           181: 
        !           182:                        if((k=smb_open(&smb))!=0) {
        !           183:                                errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error);
        !           184:                                continue; }
        !           185: 
        !           186:                        if(!filelength(fileno(smb.shd_fp))) {
        !           187:                                smb.status.max_crcs=cfg.mail_maxcrcs;
        !           188:                                smb.status.max_msgs=MAX_SYSMAIL;
        !           189:                                smb.status.max_age=cfg.mail_maxage;
        !           190:                                smb.status.attr=SMB_EMAIL;
        !           191:                                if((k=smb_create(&smb))!=0) {
        !           192:                                        smb_close(&smb);
        !           193:                                        errormsg(WHERE,ERR_CREATE,smb.file,k);
        !           194:                                        continue; } }
        !           195: 
        !           196:                        if((k=smb_locksmbhdr(&smb))!=0) {
        !           197:                                smb_close(&smb);
        !           198:                                errormsg(WHERE,ERR_LOCK,smb.file,k);
        !           199:                                continue; }
        !           200: 
        !           201:                        if((k=smb_getstatus(&smb))!=0) {
        !           202:                                smb_close(&smb);
        !           203:                                errormsg(WHERE,ERR_READ,smb.file,k);
        !           204:                                continue; }
        !           205: 
        !           206:                        smb_unlocksmbhdr(&smb);
        !           207: 
        !           208:                        if(!qwktomsg(rep,block,0,INVALID_SUB,j)) {
        !           209:                                smb_close(&smb);
        !           210:                                continue; }
        !           211:                        smb_close(&smb);
        !           212: 
        !           213:                        if(j==1) {
        !           214:                                useron.fbacks++;
        !           215:                                logon_fbacks++;
        !           216:                                putuserrec(&cfg,useron.number,U_FBACKS,5
        !           217:                                        ,ultoa(useron.fbacks,tmp,10)); }
        !           218:                        else {
        !           219:                                useron.emails++;
        !           220:                                logon_emails++;
        !           221:                                putuserrec(&cfg,useron.number,U_EMAILS,5
        !           222:                                        ,ultoa(useron.emails,tmp,10)); }
        !           223:                        useron.etoday++;
        !           224:                        putuserrec(&cfg,useron.number,U_ETODAY,5
        !           225:                                ,ultoa(useron.etoday,tmp,10));
        !           226:                        bprintf(text[Emailed],username(&cfg,j,tmp),j);
        !           227:                        sprintf(str,"E-mailed %s #%d",username(&cfg,j,tmp),j);
        !           228:                        logline("E+",str);
        !           229:                        if(useron.rest&FLAG('Q')) {
        !           230:                                sprintf(tmp,"%-25.25s",block+46);
        !           231:                                truncsp(tmp); }
        !           232:                        else
        !           233:                                strcpy(tmp,useron.alias);
        !           234:                        for(k=1;k<=cfg.sys_nodes;k++) { /* Tell user, if online */
        !           235:                                getnodedat(k,&node,0);
        !           236:                                if(node.useron==j && !(node.misc&NODE_POFF)
        !           237:                                        && (node.status==NODE_INUSE
        !           238:                                        || node.status==NODE_QUIET)) {
        !           239:                                        sprintf(str,text[EmailNodeMsg]
        !           240:                                                ,cfg.node_num,tmp);
        !           241:                                        putnmsg(k,str);
        !           242:                                        break; } }
        !           243:                        if(k>cfg.sys_nodes) {
        !           244:                                sprintf(str,text[UserSentYouMail],tmp);
        !           245:                                putsmsg(&cfg,j,str); } }    /* end of email */
        !           246: 
        !           247:                                /**************************/
        !           248:                else {  /* message on a sub-board */
        !           249:                                /**************************/
        !           250:                        n=atol((char *)block+1); /* conference number */
        !           251:                        for(j=0;j<usrgrps;j++) {
        !           252:                                for(k=0;k<usrsubs[j];k++)
        !           253:                                        if(cfg.sub[usrsub[j][k]]->qwkconf==n)
        !           254:                                                break;
        !           255:                                if(k<usrsubs[j])
        !           256:                                        break; }
        !           257: 
        !           258:                        if(j>=usrgrps) {
        !           259:                                if(n<1000) {                     /* version 1 method, start at 101 */
        !           260:                                        j=n/100;
        !           261:                                        k=n-(j*100); }
        !           262:                                else {                                   /* version 2 method, start at 1001 */
        !           263:                                        j=n/1000;
        !           264:                                        k=n-(j*1000); }
        !           265:                                j--;    /* j is group */
        !           266:                                k--;    /* k is sub */
        !           267:                                if(j>=usrgrps || k>=usrsubs[j] || cfg.sub[usrsub[j][k]]->qwkconf) {
        !           268:                                        bprintf(text[QWKInvalidConferenceN],n);
        !           269:                                        sprintf(str,"Invalid conference number %d",n);
        !           270:                                        logline("P!",str);
        !           271:                                        continue; } }
        !           272: 
        !           273:                        n=usrsub[j][k];
        !           274: 
        !           275:                        /* if posting, add to new-scan config for QWKnet nodes automatically */
        !           276:                        if(useron.rest&FLAG('Q'))
        !           277:                                sub_cfg[n]|=SUB_CFG_NSCAN;
        !           278: 
        !           279:                        sprintf(str,"%-25.25s","SBBS");
        !           280:                        if(!strnicmp((char *)block+21,str,25)) {        /* to SBBS, config stuff */
        !           281:                                qwkcfgline((char *)block+71,n);
        !           282:                                continue; }
        !           283: 
        !           284:                        if(!SYSOP && cfg.sub[n]->misc&SUB_QNET) {       /* QWK Netted */
        !           285:                                sprintf(str,"%-25.25s","DROP");         /* Drop from new-scan? */
        !           286:                                if(!strnicmp((char *)block+71,str,25))  /* don't allow post */
        !           287:                                        continue;
        !           288:                                sprintf(str,"%-25.25s","ADD");          /* Add to new-scan? */
        !           289:                                if(!strnicmp((char *)block+71,str,25))  /* don't allow post */
        !           290:                                        continue; }
        !           291: 
        !           292:                        if(useron.rest&FLAG('Q') && !(cfg.sub[n]->misc&SUB_QNET)) {
        !           293:                                bputs(text[CantPostOnSub]);
        !           294:                                logline("P!","Attempted to post on non-QWKnet sub");
        !           295:                                continue; }
        !           296: 
        !           297:                        if(useron.rest&FLAG('P')) {
        !           298:                                bputs(text[R_Post]);
        !           299:                                logline("P!","Post attempted");
        !           300:                                continue; }
        !           301: 
        !           302:                        if(useron.ptoday>=cfg.level_postsperday[useron.level]
        !           303:                                && !(useron.rest&FLAG('Q'))) {
        !           304:                                bputs(text[TooManyPostsToday]);
        !           305:                                continue; }
        !           306: 
        !           307:                        if(useron.rest&FLAG('N')
        !           308:                                && cfg.sub[n]->misc&(SUB_FIDO|SUB_PNET|SUB_QNET|SUB_INET)) {
        !           309:                                bputs(text[CantPostOnSub]);
        !           310:                                logline("P!","Networked post attempted");
        !           311:                                continue; }
        !           312: 
        !           313:                        if(!chk_ar(cfg.sub[n]->post_ar,&useron)) {
        !           314:                                bputs(text[CantPostOnSub]);
        !           315:                                logline("P!","Post attempted");
        !           316:                                continue; }
        !           317: 
        !           318:                        if((block[0]=='*' || block[0]=='+')
        !           319:                                && !(cfg.sub[n]->misc&SUB_PRIV)) {
        !           320:                                bputs(text[PrivatePostsNotAllowed]);
        !           321:                                logline("P!","Private post attempt");
        !           322:                                continue; }
        !           323: 
        !           324:                        if(block[0]=='*' || block[0]=='+'           /* Private post */
        !           325:                                || cfg.sub[n]->misc&SUB_PONLY) {
        !           326:                                sprintf(str,"%-25.25s",nulstr);
        !           327:                                sprintf(tmp,"%-25.25s","ALL");
        !           328:                                if(!strnicmp((char *)block+21,str,25)
        !           329:                                        || !strnicmp((char *)block+21,tmp,25)) {        /* to blank */
        !           330:                                        bputs(text[NoToUser]);                                          /* or all */
        !           331:                                        continue; } }
        !           332: 
        !           333:                        if(!SYSOP && !(useron.rest&FLAG('Q'))) {
        !           334:                                sprintf(str,"%-25.25s","SYSOP");
        !           335:                                if(!strnicmp((char *)block+21,str,25)) {
        !           336:                                        sprintf(str,"%-25.25s",username(&cfg,1,tmp));
        !           337:                                        memcpy((char *)block+21,str,25); } }    /* change from sysop */
        !           338:                                                                                                                        /* to user name */
        !           339: 
        !           340:        #if 0   /* TWIT FILTER */
        !           341:                        sprintf(str,"%25.25s",block+46);  /* From user */
        !           342:                        truncsp(str);
        !           343: 
        !           344:                        if(!stricmp(str,"Lee Matherne")
        !           345:                                || !stricmp(str,"Big Joe")
        !           346:                                ) {
        !           347:                                bprintf(text[Posted],cfg.grp[cfg.sub[n]->grp]->sname
        !           348:                                        ,cfg.sub[n]->lname);
        !           349:                                continue; }
        !           350:        #endif
        !           351: 
        !           352:                        if(n!=lastsub) {
        !           353:                                if(lastsub!=INVALID_SUB)
        !           354:                                        smb_close(&smb);
        !           355:                                lastsub=INVALID_SUB;
        !           356:                                sprintf(smb.file,"%s%s",cfg.sub[n]->data_dir,cfg.sub[n]->code);
        !           357:                                smb.retry_time=cfg.smb_retry_time;
        !           358:                                if((j=smb_open(&smb))!=0) {
        !           359:                                        errormsg(WHERE,ERR_OPEN,smb.file,j,smb.last_error);
        !           360:                                        continue; }
        !           361: 
        !           362:                                if(!filelength(fileno(smb.shd_fp))) {
        !           363:                                        smb.status.max_crcs=cfg.sub[n]->maxcrcs;
        !           364:                                        smb.status.max_msgs=cfg.sub[n]->maxmsgs;
        !           365:                                        smb.status.max_age=cfg.sub[n]->maxage;
        !           366:                                        smb.status.attr=cfg.sub[n]->misc&SUB_HYPER ? SMB_HYPERALLOC:0;
        !           367:                                        if((j=smb_create(&smb))!=0) {
        !           368:                                                smb_close(&smb);
        !           369:                                                lastsub=INVALID_SUB;
        !           370:                                                errormsg(WHERE,ERR_CREATE,smb.file,j);
        !           371:                                                continue; } }
        !           372: 
        !           373:                                if((j=smb_locksmbhdr(&smb))!=0) {
        !           374:                                        smb_close(&smb);
        !           375:                                        lastsub=INVALID_SUB;
        !           376:                                        errormsg(WHERE,ERR_LOCK,smb.file,j);
        !           377:                                        continue; }
        !           378:                                if((j=smb_getstatus(&smb))!=0) {
        !           379:                                        smb_close(&smb);
        !           380:                                        lastsub=INVALID_SUB;
        !           381:                                        errormsg(WHERE,ERR_READ,smb.file,j);
        !           382:                                        continue; }
        !           383:                                smb_unlocksmbhdr(&smb);
        !           384:                                lastsub=n; }
        !           385: 
        !           386:                        if(!qwktomsg(rep,block,0,n,0))
        !           387:                                continue;
        !           388: 
        !           389:                        useron.ptoday++;
        !           390:                        useron.posts++;
        !           391:                        logon_posts++;
        !           392:                        putuserrec(&cfg,useron.number,U_POSTS,5,ultoa(useron.posts,str,10));
        !           393:                        putuserrec(&cfg,useron.number,U_PTODAY,5,ultoa(useron.ptoday,str,10));
        !           394:                        bprintf(text[Posted],cfg.grp[cfg.sub[n]->grp]->sname
        !           395:                                ,cfg.sub[n]->lname);
        !           396:                        sprintf(str,"Posted on %s/%s",cfg.grp[cfg.sub[n]->grp]->sname
        !           397:                                ,cfg.sub[n]->lname);
        !           398:                        if(cfg.sub[n]->misc&SUB_FIDO && cfg.sub[n]->echomail_sem[0])  /* semaphore */
        !           399:                                if((file=nopen(cmdstr(cfg.sub[n]->echomail_sem,nulstr,nulstr,NULL)
        !           400:                                        ,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
        !           401:                                        close(file);
        !           402:                        logline("P+",str); } }         /* end of public message */
        !           403: 
        !           404:        update_qwkroute(NULL);                  /* Write ROUTE.DAT */
        !           405: 
        !           406:        if(lastsub!=INVALID_SUB)
        !           407:                smb_close(&smb);
        !           408:        fclose(rep);
        !           409: 
        !           410:        if(useron.rest&FLAG('Q')) {             /* QWK Net Node */
        !           411:                sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.sys_id);
        !           412:                remove(str);
        !           413:                sprintf(str,"%s%s.rep",cfg.temp_dir,cfg.sys_id);
        !           414:                remove(str);
        !           415: 
        !           416:                dir=opendir(cfg.temp_dir);
        !           417:                while((dirent=readdir(dir))!=NULL) {                            /* Extra files */
        !           418:                        // Create directory if necessary
        !           419:                        sprintf(str,"%sqnet/%s.in",cfg.data_dir,useron.alias);
        !           420:                        _mkdir(str); 
        !           421:                        // Move files
        !           422:                        sprintf(str,"%s%s",cfg.temp_dir,dirent->d_name);
        !           423:                        if(isdir(str))
        !           424:                                continue;
        !           425:                        sprintf(fname,"%sqnet/%s.in/%s",cfg.data_dir,useron.alias,dirent->d_name);
        !           426:                        mv(str,fname,1);
        !           427:                        sprintf(str,text[ReceivedFileViaQWK],dirent->d_name,useron.alias);
        !           428:                        putsmsg(&cfg,1,str);
        !           429:                } 
        !           430:                closedir(dir);
        !           431:                sprintf(str,"%sqnet-rep.now",cfg.data_dir);
        !           432:                if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
        !           433:                        close(file);
        !           434:        }
        !           435: 
        !           436:        bputs(text[QWKUnpacked]);
        !           437:        CRLF;
        !           438:        /**********************************************/
        !           439:        /* Hang-up now if that's what the user wanted */
        !           440:        /**********************************************/
        !           441:        autohangup();
        !           442: 
        !           443:        return(true);
        !           444: }

unix.superglobalmegacorp.com

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