|
|
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.