Annotation of sbbs/sbbs3/un_qwk.cpp, revision 1.1.1.1

1.1       root        1: /* un_qwk.cpp */
                      2: 
                      3: /* Synchronet QWK unpacking routine */
                      4: 
                      5: /* $Id: un_qwk.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 .QWK packet, hubnum is the number of the QWK net hub                        */
                     43: /****************************************************************************/
                     44: bool sbbs_t::unpack_qwk(char *packet,uint hubnum)
                     45: {
                     46:        char    str[256],fname[128];
                     47:        char    tmp[512];
                     48:        uchar   block[128];
                     49:        int     k,file;
                     50:        uint    i,j,n,lastsub=INVALID_SUB;
                     51:        uint    blocks;
                     52:        long    l,size,misc;
                     53:        DIR*    dir;
                     54:        DIRENT* dirent;
                     55:        FILE*   qwk;
                     56: 
                     57:        if((l=flength(packet))<1) {
                     58:                errormsg(WHERE,ERR_LEN,packet,l);
                     59:                return(false);
                     60:        }
                     61:        i=external(cmdstr(cfg.qhub[hubnum]->unpack,packet,ALLFILES,NULL),EX_OFFLINE);
                     62:        if(i) {
                     63:                errormsg(WHERE,ERR_EXEC,cmdstr(cfg.qhub[hubnum]->unpack,packet,ALLFILES,NULL),i);
                     64:                return(false); 
                     65:        }
                     66:        sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir);
                     67:        if(!fexist(str)) {
                     68:                sprintf(str,"%s doesn't contain MESSAGES.DAT",packet);
                     69:                errorlog(str);
                     70:                return(false); 
                     71:        }
                     72:        if((qwk=fnopen(&file,str,O_RDONLY))==NULL) {
                     73:                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                     74:                return(false); 
                     75:        }
                     76:        size=filelength(file);
                     77:        /********************/
                     78:        /* Process messages */
                     79:        /********************/
                     80:        lprintf("Importing QWK Network Packet: %s",packet);
                     81: 
                     82:        for(l=128;l<size;l+=blocks*128) {
                     83:                fseek(qwk,l,SEEK_SET);
                     84:                fread(block,128,1,qwk);
                     85:                if(block[0]<' ' || block[0]&0x80) {
                     86:                        lprintf("!Invalid message status (%02X) at offset %lu in %s"
                     87:                                ,block[0], l, packet);
                     88:                        blocks=1;
                     89:                        continue;
                     90:                }
                     91:                sprintf(tmp,"%.6s",block+116);
                     92:                blocks=atoi(tmp);  /* i = number of 128 byte records */
                     93:                if(blocks<2) {
                     94:                        lprintf("!Invalid number of blocks (%d) at offset %lu in %s"
                     95:                                ,blocks, l+116, packet);
                     96:                        blocks=1;
                     97:                        continue; 
                     98:                }
                     99:                /*********************************/
                    100:                /* public message on a sub-board */
                    101:                /*********************************/
                    102:                n=(uint)block[123]|(((uint)block[124])<<8);  /* conference number */
                    103: 
                    104:                if(!n) {                /* NETMAIL */
                    105:                        sprintf(str,"%25.25s",block+21);
                    106:                        truncsp(str);
                    107:                        lprintf("NetMail from %s to %s", cfg.qhub[hubnum]->id, str);
                    108:                        if(!stricmp(str,"NETMAIL")) {  /* QWK to FidoNet NetMail */
                    109:                                qwktonetmail(qwk,(char *)block,NULL,hubnum+1);
                    110:                                continue; 
                    111:                        }
                    112:                        if(strchr(str,'@')) {
                    113:                                qwktonetmail(qwk,(char *)block,str,hubnum+1);
                    114:                                continue; 
                    115:                        }
                    116:                        j=atoi(str);
                    117:                        if(j && j>lastuser(&cfg))
                    118:                                j=0;
                    119:                        if(!j && !stricmp(str,"SYSOP"))
                    120:                                j=1;
                    121:                        if(!j)
                    122:                                j=matchuser(&cfg,str);
                    123:                        if(!j && !stricmp(str,cfg.sys_id))
                    124:                                j=1;
                    125:                        if(!j) {
                    126:                                lprintf("!NetMail from %s to UNKNOWN USER: %s", cfg.qhub[hubnum]->id, str);
                    127:                                continue; 
                    128:                        }
                    129: 
                    130:                        getuserrec(&cfg,j,U_MISC,8,str);
                    131:                        misc=ahtoul(str);
                    132:                        if(misc&NETMAIL && cfg.sys_misc&SM_FWDTONET) {
                    133:                                getuserrec(&cfg,j,U_NETMAIL,LEN_NETMAIL,str);
                    134:                                qwktonetmail(qwk,(char*)block,str,hubnum+1);
                    135:                                continue; 
                    136:                        }
                    137: 
                    138:                        smb_stack(&smb,SMB_STACK_PUSH);
                    139:                        sprintf(smb.file,"%smail",cfg.data_dir);
                    140:                        smb.retry_time=cfg.smb_retry_time;
                    141:                        if((k=smb_open(&smb))!=0) {
                    142:                                errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error);
                    143:                                smb_stack(&smb,SMB_STACK_POP);
                    144:                                continue; 
                    145:                        }
                    146:                        if(!filelength(fileno(smb.shd_fp))) {
                    147:                                smb.status.max_crcs=cfg.mail_maxcrcs;
                    148:                                smb.status.max_msgs=MAX_SYSMAIL;
                    149:                                smb.status.max_age=cfg.mail_maxage;
                    150:                                smb.status.attr=SMB_EMAIL;
                    151:                                if((k=smb_create(&smb))!=0) {
                    152:                                        smb_close(&smb);
                    153:                                        errormsg(WHERE,ERR_CREATE,smb.file,k);
                    154:                                        smb_stack(&smb,SMB_STACK_POP);
                    155:                                        continue; 
                    156:                                } 
                    157:                        }
                    158:                        if((k=smb_locksmbhdr(&smb))!=0) {
                    159:                                smb_close(&smb);
                    160:                                errormsg(WHERE,ERR_LOCK,smb.file,k);
                    161:                                smb_stack(&smb,SMB_STACK_POP);
                    162:                                continue; 
                    163:                        }
                    164:                        if((k=smb_getstatus(&smb))!=0) {
                    165:                                smb_close(&smb);
                    166:                                errormsg(WHERE,ERR_READ,smb.file,k);
                    167:                                smb_stack(&smb,SMB_STACK_POP);
                    168:                                continue; 
                    169:                        }
                    170:                        smb_unlocksmbhdr(&smb);
                    171:                        qwktomsg(qwk,(char *)block,hubnum+1,INVALID_SUB,j);
                    172:                        smb_close(&smb);
                    173:                        smb_stack(&smb,SMB_STACK_POP);
                    174:                        sprintf(tmp,"%-25.25s",block+46);
                    175:                        truncsp(tmp);
                    176:                        sprintf(str,text[UserSentYouMail],tmp);
                    177:                        putsmsg(&cfg,j,str);
                    178:                        continue;
                    179:                        }
                    180: 
                    181:                for(j=0;j<cfg.qhub[hubnum]->subs;j++)
                    182:                        if(cfg.qhub[hubnum]->conf[j]==n)
                    183:                                break;
                    184:                if(j>=cfg.qhub[hubnum]->subs) { /* ignore messages for subs not in config */
                    185:                        lprintf("!Message from %s on UNKNOWN CONFERENCE NUMBER: %u"
                    186:                                ,cfg.qhub[hubnum]->id, n);
                    187:                        continue;
                    188:                }
                    189: 
                    190:                j=cfg.qhub[hubnum]->sub[j];
                    191: 
                    192:                if(j!=lastsub) {
                    193:                        if(lastsub!=INVALID_SUB)
                    194:                                smb_close(&smb);
                    195:                        lastsub=INVALID_SUB;
                    196:                        sprintf(smb.file,"%s%s",cfg.sub[j]->data_dir,cfg.sub[j]->code);
                    197:                        smb.retry_time=cfg.smb_retry_time;
                    198:                        if((k=smb_open(&smb))!=0) {
                    199:                                errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error);
                    200:                                continue; 
                    201:                        }
                    202:                        if(!filelength(fileno(smb.shd_fp))) {
                    203:                                smb.status.max_crcs=cfg.sub[j]->maxcrcs;
                    204:                                smb.status.max_msgs=cfg.sub[j]->maxmsgs;
                    205:                                smb.status.max_age=cfg.sub[j]->maxage;
                    206:                                smb.status.attr=cfg.sub[j]->misc&SUB_HYPER ? SMB_HYPERALLOC :0;
                    207:                                if((k=smb_create(&smb))!=0) {
                    208:                                        smb_close(&smb);
                    209:                                        errormsg(WHERE,ERR_CREATE,smb.file,k);
                    210:                                        continue; 
                    211:                                } 
                    212:                        }
                    213:                        if((k=smb_locksmbhdr(&smb))!=0) {
                    214:                                smb_close(&smb);
                    215:                                errormsg(WHERE,ERR_LOCK,smb.file,k);
                    216:                                continue; 
                    217:                        }
                    218:                        if((k=smb_getstatus(&smb))!=0) {
                    219:                                smb_close(&smb);
                    220:                                errormsg(WHERE,ERR_READ,smb.file,k);
                    221:                                continue; 
                    222:                        }
                    223:                        smb_unlocksmbhdr(&smb);
                    224:                        lastsub=j; 
                    225:                }
                    226: 
                    227:                lprintf("Importing message from %s on %s %s"
                    228:                        ,cfg.qhub[hubnum]->id, cfg.grp[cfg.sub[j]->grp]->sname,cfg.sub[j]->lname);
                    229:                if(!qwktomsg(qwk,(char *)block,hubnum+1,j,0)) {
                    230:                        lprintf("!QWKTOMSG failed");
                    231:                        continue;
                    232:                }
                    233: 
                    234:                if(cfg.sub[j]->misc&SUB_FIDO && cfg.sub[j]->echomail_sem[0]) /* update semaphore */
                    235:                        if((file=nopen(cmdstr(cfg.sub[j]->echomail_sem,nulstr,nulstr,NULL)
                    236:                                ,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
                    237:                                close(file);
                    238:                lprintf("Message from %s Posted on %s %s"
                    239:                        ,cfg.qhub[hubnum]->id,cfg.grp[cfg.sub[j]->grp]->sname,cfg.sub[j]->lname); 
                    240:        }
                    241: 
                    242:        update_qwkroute(NULL);          /* Write ROUTE.DAT */
                    243: 
                    244:        fclose(qwk);
                    245:        if(lastsub!=INVALID_SUB)
                    246:                smb_close(&smb);
                    247: 
                    248:        delfiles(cfg.temp_dir,"*.NDX");
                    249:        sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir);
                    250:        remove(str);
                    251:        sprintf(str,"%sDOOR.ID",cfg.temp_dir);
                    252:        remove(str);
                    253:        sprintf(str,"%sCONTROL.DAT",cfg.temp_dir);
                    254:        remove(str);
                    255:        sprintf(str,"%sNETFLAGS.DAT",cfg.temp_dir);
                    256:        remove(str);
                    257: 
                    258:        dir=opendir(cfg.temp_dir);
                    259:        while((dirent=readdir(dir))!=NULL) {
                    260:                // Create directory if necessary
                    261:                sprintf(str,"%sqnet/%s.in",cfg.data_dir,cfg.qhub[hubnum]->id);
                    262:                _mkdir(str);
                    263:                sprintf(str,"%s%s",cfg.temp_dir,dirent->d_name);
                    264:                if(isdir(str))  /* sub-dir */
                    265:                        continue;
                    266:                // Copy files
                    267:                sprintf(fname,"%sqnet/%s.in/%s",cfg.data_dir,cfg.qhub[hubnum]->id,dirent->d_name);
                    268:                mv(str,fname,1 /* overwrite */);
                    269:                sprintf(str,text[ReceivedFileViaQWK],dirent->d_name,cfg.qhub[hubnum]->id);
                    270:                putsmsg(&cfg,1,str);
                    271:                lprintf("Received %s from %s", dirent->d_name, cfg.qhub[hubnum]->id);
                    272:        }
                    273:        closedir(dir);
                    274: 
                    275:        lprintf("Finished Importing QWK Network Packet: %s",packet);
                    276:        delfiles(cfg.temp_dir,ALLFILES);
                    277:        return(true);
                    278: }

unix.superglobalmegacorp.com

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