Annotation of sbbs/sbbs2/un_qwk.c, revision 1.1.1.1

1.1       root        1: #line 1 "UN_QWK.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: #include "qwk.h"
                      7: 
                      8: /****************************************************************************/
                      9: /* Unpacks .QWK packet, hubnum is the number of the QWK net hub                        */
                     10: /****************************************************************************/
                     11: void unpack_qwk(char *packet,uint hubnum)
                     12: {
                     13:        uchar   str[256],fname[128],block[128],ch;
                     14:        int     k,file;
                     15:        uint    i,j,n,msgs,lastsub=INVALID_SUB;
                     16:        long    l,size,misc;
                     17:        time_t  t;
                     18:     struct  ffblk ff;
                     19:        FILE    *qwk;
                     20: 
                     21: useron.number=1;
                     22: getuserdat(&useron);
                     23: console=CON_L_ECHO;
                     24: i=external(cmdstr(qhub[hubnum]->unpack,packet,"*.*",NULL),EX_OUTL);
                     25: if(i) {
                     26:        errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->unpack,packet,"*.*",NULL),i);
                     27:        return; }
                     28: sprintf(str,"%sMESSAGES.DAT",temp_dir);
                     29: if(!fexist(str)) {
                     30:        sprintf(str,"%s.QWK doesn't contain MESSAGES.DAT",qhub[hubnum]->id);
                     31:        errorlog(str);
                     32:        return; }
                     33: if((qwk=fnopen(&file,str,O_RDONLY))==NULL) {
                     34:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                     35:        return; }
                     36: size=filelength(file);
                     37: /********************/
                     38: /* Process messages */
                     39: /********************/
                     40: bputs(text[QWKUnpacking]);
                     41: 
                     42: for(l=128;l<size;l+=i*128) {
                     43:        fseek(qwk,l,SEEK_SET);
                     44:        fread(block,128,1,qwk);
                     45:        sprintf(tmp,"%.6s",block+116);
                     46:        i=atoi(tmp);  /* i = number of 128 byte records */
                     47:        if(i<2) {
                     48:                i=1;
                     49:                continue; }
                     50:        /*********************************/
                     51:        /* public message on a sub-board */
                     52:        /*********************************/
                     53:        n=(uint)block[123]|(((uint)block[124])<<8);  /* conference number */
                     54: 
                     55:        if(!n) {                /* NETMAIL */
                     56:                sprintf(str,"%25.25s",block+21);
                     57:                truncsp(str);
                     58:                if(!stricmp(str,"NETMAIL")) {  /* QWK to FidoNet NetMail */
                     59:                        qwktonetmail(qwk,block,NULL,hubnum+1);
                     60:             continue; }
                     61:                if(strchr(str,'@')) {
                     62:                        qwktonetmail(qwk,block,str,hubnum+1);
                     63:             continue; }
                     64:                j=atoi(str);
                     65:                if(j && j>lastuser())
                     66:                        j=0;
                     67:                if(!j && !stricmp(str,"SYSOP"))
                     68:                        j=1;
                     69:                if(!j)
                     70:                        j=matchuser(str);
                     71:                if(!j && !stricmp(str,sys_id))
                     72:                        j=1;
                     73:                if(!j) {
                     74:                        bputs(text[UnknownUser]);
                     75:             continue; }
                     76: 
                     77:                getuserrec(j,U_MISC,8,str);
                     78:                misc=ahtoul(str);
                     79:                if(misc&NETMAIL && sys_misc&SM_FWDTONET) {
                     80:                        getuserrec(j,U_NETMAIL,LEN_NETMAIL,str);
                     81:                        qwktonetmail(qwk,block,str,hubnum+1);
                     82:             continue; }
                     83: 
                     84:                smb_stack(&smb,SMB_STACK_PUSH);
                     85:                sprintf(smb.file,"%sMAIL",data_dir);
                     86:                smb.retry_time=smb_retry_time;
                     87:                if((k=smb_open(&smb))!=0) {
                     88:                        errormsg(WHERE,ERR_OPEN,smb.file,k);
                     89:                        smb_stack(&smb,SMB_STACK_POP);
                     90:                        continue; }
                     91:                if(!filelength(fileno(smb.shd_fp))) {
                     92:                        smb.status.max_crcs=mail_maxcrcs;
                     93:                        smb.status.max_msgs=MAX_SYSMAIL;
                     94:                        smb.status.max_age=mail_maxage;
                     95:                        smb.status.attr=SMB_EMAIL;
                     96:                        if((k=smb_create(&smb))!=0) {
                     97:                                smb_close(&smb);
                     98:                                errormsg(WHERE,ERR_CREATE,smb.file,k);
                     99:                                smb_stack(&smb,SMB_STACK_POP);
                    100:                                continue; } }
                    101:                if((k=smb_locksmbhdr(&smb))!=0) {
                    102:                        smb_close(&smb);
                    103:                        errormsg(WHERE,ERR_LOCK,smb.file,k);
                    104:                        smb_stack(&smb,SMB_STACK_POP);
                    105:                        continue; }
                    106:                if((k=smb_getstatus(&smb))!=0) {
                    107:                        smb_close(&smb);
                    108:                        errormsg(WHERE,ERR_READ,smb.file,k);
                    109:                        smb_stack(&smb,SMB_STACK_POP);
                    110:             continue; }
                    111:                smb_unlocksmbhdr(&smb);
                    112:                qwktomsg(qwk,block,hubnum+1,INVALID_SUB,j);
                    113:                smb_close(&smb);
                    114:                smb_stack(&smb,SMB_STACK_POP);
                    115:                sprintf(tmp,"%-25.25s",block+46);
                    116:                truncsp(tmp);
                    117:                sprintf(str,text[UserSentYouMail],tmp);
                    118:                putsmsg(j,str);
                    119:                continue;
                    120:                }
                    121: 
                    122:        for(j=0;j<qhub[hubnum]->subs;j++)
                    123:                if(qhub[hubnum]->conf[j]==n)
                    124:                        break;
                    125:        if(j>=qhub[hubnum]->subs)       /* ignore messages for subs not in config */
                    126:                continue;
                    127: 
                    128:        j=qhub[hubnum]->sub[j];
                    129: 
                    130:        if(j!=lastsub) {
                    131:                if(lastsub!=INVALID_SUB)
                    132:                        smb_close(&smb);
                    133:                lastsub=INVALID_SUB;
                    134:                sprintf(smb.file,"%s%s",sub[j]->data_dir,sub[j]->code);
                    135:                smb.retry_time=smb_retry_time;
                    136:                if((k=smb_open(&smb))!=0) {
                    137:                        errormsg(WHERE,ERR_OPEN,smb.file,k);
                    138:                        continue; }
                    139:                if(!filelength(fileno(smb.shd_fp))) {
                    140:                        smb.status.max_crcs=sub[j]->maxcrcs;
                    141:                        smb.status.max_msgs=sub[j]->maxmsgs;
                    142:                        smb.status.max_age=sub[j]->maxage;
                    143:                        smb.status.attr=sub[j]->misc&SUB_HYPER ? SMB_HYPERALLOC :0;
                    144:                        if((k=smb_create(&smb))!=0) {
                    145:                                smb_close(&smb);
                    146:                                errormsg(WHERE,ERR_CREATE,smb.file,k);
                    147:                                continue; } }
                    148:                if((k=smb_locksmbhdr(&smb))!=0) {
                    149:                        smb_close(&smb);
                    150:                        errormsg(WHERE,ERR_LOCK,smb.file,k);
                    151:                        continue; }
                    152:                if((k=smb_getstatus(&smb))!=0) {
                    153:                        smb_close(&smb);
                    154:                        errormsg(WHERE,ERR_READ,smb.file,k);
                    155:                        continue; }
                    156:                smb_unlocksmbhdr(&smb);
                    157:                lastsub=j; }
                    158: 
                    159:        if(!qwktomsg(qwk,block,hubnum+1,j,0))
                    160:                continue;
                    161: 
                    162:        if(sub[j]->misc&SUB_FIDO && sub[j]->echomail_sem[0]) /* update semaphore */
                    163:                if((file=nopen(sub[j]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
                    164:                        close(file);
                    165:        bprintf(text[Posted],grp[sub[j]->grp]->sname,sub[j]->lname); }
                    166: 
                    167: update_qwkroute(NULL);         /* Write ROUTE.DAT */
                    168: 
                    169: fclose(qwk);
                    170: if(lastsub!=INVALID_SUB)
                    171:        smb_close(&smb);
                    172: 
                    173: delfiles(temp_dir,"*.NDX");
                    174: sprintf(str,"%sMESSAGES.DAT",temp_dir);
                    175: remove(str);
                    176: sprintf(str,"%sDOOR.ID",temp_dir);
                    177: remove(str);
                    178: sprintf(str,"%sCONTROL.DAT",temp_dir);
                    179: remove(str);
                    180: sprintf(str,"%sNETFLAGS.DAT",temp_dir);
                    181: remove(str);
                    182: 
                    183: sprintf(str,"%s*.*",temp_dir);
                    184: i=findfirst(str,&ff,0);
                    185: if(!i) {
                    186:        sprintf(str,"%sQNET\\%s.IN",data_dir,qhub[hubnum]->id);
                    187:        mkdir(str); }
                    188: while(!i) {
                    189:        sprintf(str,"%s%s",temp_dir,ff.ff_name);
                    190:        sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,qhub[hubnum]->id,ff.ff_name);
                    191:        mv(str,fname,1);
                    192:        sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,qhub[hubnum]->id);
                    193:        putsmsg(1,str);
                    194:        i=findnext(&ff); }
                    195: 
                    196: bputs(text[QWKUnpacked]);
                    197: CRLF;
                    198: remove(packet);
                    199: 
                    200: }

unix.superglobalmegacorp.com

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