|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.