|
|
1.1 root 1: #line 1 "UN_REP.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 .REP packet, 'repname' is the path and filename of the packet */
10: /****************************************************************************/
11: void unpack_rep()
12: {
13: uchar ch,str[256],fname[128],block[128]
14: ,*AttemptedToUploadREPpacket="Attempted to upload REP packet";
15: int file;
16: uint h,i,j,k,msgs,lastsub=INVALID_SUB;
17: ulong n;
18: long l,size,misc,crc;
19: node_t node;
20: time_t t;
21: file_t f;
22: struct ffblk ff;
23: FILE *rep;
24:
25: sprintf(str,"%s%s.REP",temp_dir,sys_id);
26: if(!fexist(str)) {
27: bputs(text[QWKReplyNotReceived]);
28: logline("U!",AttemptedToUploadREPpacket);
29: logline(nulstr,"REP file not received");
30: return; }
31: for(k=0;k<total_fextrs;k++)
32: if(!stricmp(fextr[k]->ext,useron.tmpext) && chk_ar(fextr[k]->ar,useron))
33: break;
34: if(k>=total_fextrs)
35: k=0;
36: i=external(cmdstr(fextr[k]->cmd,str,"*.*",NULL),EX_OUTL|EX_OUTR);
37: if(i) {
38: bputs(text[QWKExtractionFailed]);
39: logline("U!",AttemptedToUploadREPpacket);
40: logline(nulstr,"Extraction failed");
41: return; }
42: sprintf(str,"%s%s.MSG",temp_dir,sys_id);
43: if(!fexist(str)) {
44: bputs(text[QWKReplyNotReceived]);
45: logline("U!",AttemptedToUploadREPpacket);
46: logline(nulstr,"MSG file not received");
47: return; }
48: if((rep=fnopen(&file,str,O_RDONLY))==NULL) {
49: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
50: return; }
51: size=filelength(file);
52: fread(block,128,1,rep);
53: if(strncmpi(block,sys_id,strlen(sys_id))) {
54: fclose(rep);
55: bputs(text[QWKReplyNotReceived]);
56: logline("U!",AttemptedToUploadREPpacket);
57: logline(nulstr,"Incorrect BBSID");
58: return; }
59: logline("U+","Uploaded REP packet");
60: /********************/
61: /* Process messages */
62: /********************/
63: bputs(text[QWKUnpacking]);
64:
65: for(l=128;l<size;l+=i*128) {
66: lncntr=0; /* defeat pause */
67: fseek(rep,l,SEEK_SET);
68: fread(block,128,1,rep);
69: sprintf(tmp,"%.6s",block+116);
70: i=atoi(tmp); /* i = number of 128 byte records */
71: if(i<2) {
72: sprintf(tmp,"%s blocks",str);
73: errormsg(WHERE,ERR_CHK,tmp,i);
74: i=1;
75: continue; }
76: if(atoi(block+1)==0) { /**********/
77: if(useron.rest&FLAG('E')) { /* E-mail */
78: bputs(text[R_Email]); /**********/
79: continue; }
80:
81: sprintf(str,"%25.25s",block+21);
82: truncsp(str);
83: if(!stricmp(str,"NETMAIL")) { /* QWK to FidoNet NetMail */
84: qwktonetmail(rep,block,NULL,0);
85: continue; }
86: if(strchr(str,'@')) {
87: qwktonetmail(rep,block,str,0);
88: continue; }
89: if(!stricmp(str,"SBBS")) { /* to SBBS, config stuff */
90: qwkcfgline(block+71,INVALID_SUB);
91: continue; }
92:
93: if(useron.etoday>=level_emailperday[useron.level]
94: && !(useron.rest&FLAG('Q'))) {
95: bputs(text[TooManyEmailsToday]);
96: continue; }
97: j=atoi(str);
98: if(j && j>lastuser())
99: j=0;
100: if(!j &&
101: (!stricmp(str,"SYSOP")
102: || !stricmp(str,sys_id)
103: || !stricmp(str,sys_op)))
104: j=1;
105: if(!j)
106: j=matchuser(str);
107: if(!j) {
108: bputs(text[UnknownUser]);
109: continue; }
110: if(j==1 && useron.rest&FLAG('S')) {
111: bprintf(text[R_Feedback],sys_op);
112: continue; }
113:
114: getuserrec(j,U_MISC,8,str);
115: misc=ahtoul(str);
116: if(misc&NETMAIL && sys_misc&SM_FWDTONET) {
117: getuserrec(j,U_NETMAIL,LEN_NETMAIL,str);
118: qwktonetmail(rep,block,str,0);
119: continue; }
120:
121: sprintf(smb.file,"%sMAIL",data_dir);
122: smb.retry_time=smb_retry_time;
123:
124: if(lastsub!=INVALID_SUB) {
125: smb_close(&smb);
126: lastsub=INVALID_SUB; }
127:
128: if((k=smb_open(&smb))!=0) {
129: errormsg(WHERE,ERR_OPEN,smb.file,k);
130: continue; }
131:
132: if(!filelength(fileno(smb.shd_fp))) {
133: smb.status.max_crcs=mail_maxcrcs;
134: smb.status.max_msgs=MAX_SYSMAIL;
135: smb.status.max_age=mail_maxage;
136: smb.status.attr=SMB_EMAIL;
137: if((k=smb_create(&smb))!=0) {
138: smb_close(&smb);
139: errormsg(WHERE,ERR_CREATE,smb.file,k);
140: continue; } }
141:
142: if((k=smb_locksmbhdr(&smb))!=0) {
143: smb_close(&smb);
144: errormsg(WHERE,ERR_LOCK,smb.file,k);
145: continue; }
146:
147: if((k=smb_getstatus(&smb))!=0) {
148: smb_close(&smb);
149: errormsg(WHERE,ERR_READ,smb.file,k);
150: continue; }
151:
152: smb_unlocksmbhdr(&smb);
153:
154: if(!qwktomsg(rep,block,0,INVALID_SUB,j)) {
155: smb_close(&smb);
156: continue; }
157: smb_close(&smb);
158:
159: if(j==1) {
160: useron.fbacks++;
161: logon_fbacks++;
162: putuserrec(useron.number,U_FBACKS,5
163: ,itoa(useron.fbacks,tmp,10)); }
164: else {
165: useron.emails++;
166: logon_emails++;
167: putuserrec(useron.number,U_EMAILS,5
168: ,itoa(useron.emails,tmp,10)); }
169: useron.etoday++;
170: putuserrec(useron.number,U_ETODAY,5
171: ,itoa(useron.etoday,tmp,10));
172: bprintf(text[Emailed],username(j,tmp),j);
173: sprintf(str,"E-mailed %s #%d",username(j,tmp),j);
174: logline("E+",str);
175: if(useron.rest&FLAG('Q')) {
176: sprintf(tmp,"%-25.25s",block+46);
177: truncsp(tmp); }
178: else
179: strcpy(tmp,useron.alias);
180: for(k=1;k<=sys_nodes;k++) { /* Tell user, if online */
181: getnodedat(k,&node,0);
182: if(node.useron==j && !(node.misc&NODE_POFF)
183: && (node.status==NODE_INUSE
184: || node.status==NODE_QUIET)) {
185: sprintf(str,text[EmailNodeMsg]
186: ,node_num,tmp);
187: putnmsg(k,str);
188: break; } }
189: if(k>sys_nodes) {
190: sprintf(str,text[UserSentYouMail],tmp);
191: putsmsg(j,str); } } /* end of email */
192:
193: /**************************/
194: else { /* message on a sub-board */
195: /**************************/
196: n=atol((char *)block+1); /* conference number */
197: for(j=0;j<usrgrps;j++) {
198: for(k=0;k<usrsubs[j];k++)
199: if(sub[usrsub[j][k]]->qwkconf==n)
200: break;
201: if(k<usrsubs[j])
202: break; }
203:
204: if(j>=usrgrps) {
205: if(n<1000) { /* version 1 method, start at 101 */
206: j=n/100;
207: k=n-(j*100); }
208: else { /* version 2 method, start at 1001 */
209: j=n/1000;
210: k=n-(j*1000); }
211: j--; /* j is group */
212: k--; /* k is sub */
213: if(j>=usrgrps || k>=usrsubs[j]) {
214: bprintf(text[QWKInvalidConferenceN],n);
215: sprintf(str,"Invalid conference number %d",n);
216: logline("P!",str);
217: continue; } }
218:
219: n=usrsub[j][k];
220:
221: /* if posting, add to new-scan config for QWKnet nodes automatically */
222: if(useron.rest&FLAG('Q'))
223: sub[n]->misc|=SUB_NSCAN;
224:
225: sprintf(str,"%-25.25s","SBBS");
226: if(!strnicmp((char *)block+21,str,25)) { /* to SBBS, config stuff */
227: qwkcfgline((char *)block+71,n);
228: continue; }
229:
230: if(!SYSOP && sub[n]->misc&SUB_QNET) { /* QWK Netted */
231: sprintf(str,"%-25.25s","DROP"); /* Drop from new-scan? */
232: if(!strnicmp((char *)block+71,str,25)) /* don't allow post */
233: continue;
234: sprintf(str,"%-25.25s","ADD"); /* Add to new-scan? */
235: if(!strnicmp((char *)block+71,str,25)) /* don't allow post */
236: continue; }
237:
238: if(useron.rest&FLAG('Q') && !(sub[n]->misc&SUB_QNET)) {
239: bputs(text[CantPostOnSub]);
240: logline("P!","Attempted to post on non-QWKnet sub");
241: continue; }
242:
243: if(useron.rest&FLAG('P')) {
244: bputs(text[R_Post]);
245: logline("P!","Post attempted");
246: continue; }
247:
248: if(useron.ptoday>=level_postsperday[useron.level]
249: && !(useron.rest&FLAG('Q'))) {
250: bputs(text[TooManyPostsToday]);
251: continue; }
252:
253: if(useron.rest&FLAG('N')
254: && sub[n]->misc&(SUB_FIDO|SUB_PNET|SUB_QNET|SUB_INET)) {
255: bputs(text[CantPostOnSub]);
256: logline("P!","Networked post attempted");
257: continue; }
258:
259: if(!chk_ar(sub[n]->post_ar,useron)) {
260: bputs(text[CantPostOnSub]);
261: logline("P!","Post attempted");
262: continue; }
263:
264: if((block[0]=='*' || block[0]=='+')
265: && !(sub[n]->misc&SUB_PRIV)) {
266: bputs(text[PrivatePostsNotAllowed]);
267: logline("P!","Private post attempt");
268: continue; }
269:
270: if(block[0]=='*' || block[0]=='+' /* Private post */
271: || sub[n]->misc&SUB_PONLY) {
272: sprintf(str,"%-25.25s",nulstr);
273: sprintf(tmp,"%-25.25s","ALL");
274: if(!strnicmp((char *)block+21,str,25)
275: || !strnicmp((char *)block+21,tmp,25)) { /* to blank */
276: bputs(text[NoToUser]); /* or all */
277: continue; } }
278:
279: if(!SYSOP && !(useron.rest&FLAG('Q'))) {
280: sprintf(str,"%-25.25s","SYSOP");
281: if(!strnicmp((char *)block+21,str,25)) {
282: sprintf(str,"%-25.25s",username(1,tmp));
283: memcpy((char *)block+21,str,25); } } /* change from sysop */
284: /* to user #1 */
285:
286: #if 0 /* TWIT FILTER */
287: sprintf(str,"%25.25s",block+46); /* From user */
288: truncsp(str);
289:
290: if(!stricmp(str,"Lee Matherne")
291: || !stricmp(str,"Big Joe")
292: ) {
293: bprintf(text[Posted],grp[sub[n]->grp]->sname
294: ,sub[n]->lname);
295: continue; }
296: #endif
297:
298: if(n!=lastsub) {
299: if(lastsub!=INVALID_SUB)
300: smb_close(&smb);
301: lastsub=INVALID_SUB;
302: sprintf(smb.file,"%s%s",sub[n]->data_dir,sub[n]->code);
303: smb.retry_time=smb_retry_time;
304: if((j=smb_open(&smb))!=0) {
305: errormsg(WHERE,ERR_OPEN,smb.file,j);
306: continue; }
307:
308: if(!filelength(fileno(smb.shd_fp))) {
309: smb.status.max_crcs=sub[n]->maxcrcs;
310: smb.status.max_msgs=sub[n]->maxmsgs;
311: smb.status.max_age=sub[n]->maxage;
312: smb.status.attr=sub[n]->misc&SUB_HYPER ? SMB_HYPERALLOC:0;
313: if((j=smb_create(&smb))!=0) {
314: smb_close(&smb);
315: lastsub=INVALID_SUB;
316: errormsg(WHERE,ERR_CREATE,smb.file,j);
317: continue; } }
318:
319: if((j=smb_locksmbhdr(&smb))!=0) {
320: smb_close(&smb);
321: lastsub=INVALID_SUB;
322: errormsg(WHERE,ERR_LOCK,smb.file,j);
323: continue; }
324: if((j=smb_getstatus(&smb))!=0) {
325: smb_close(&smb);
326: lastsub=INVALID_SUB;
327: errormsg(WHERE,ERR_READ,smb.file,j);
328: continue; }
329: smb_unlocksmbhdr(&smb);
330: lastsub=n; }
331:
332: if(!qwktomsg(rep,block,0,n,0))
333: continue;
334:
335: useron.ptoday++;
336: useron.posts++;
337: // if(!(useron.rest&FLAG('Q')))
338: logon_posts++;
339: putuserrec(useron.number,U_POSTS,5,itoa(useron.posts,str,10));
340: putuserrec(useron.number,U_PTODAY,5,itoa(useron.ptoday,str,10));
341: bprintf(text[Posted],grp[sub[n]->grp]->sname
342: ,sub[n]->lname);
343: sprintf(str,"Posted on %s %s",grp[sub[n]->grp]->sname
344: ,sub[n]->lname);
345: if(sub[n]->misc&SUB_FIDO && sub[n]->echomail_sem[0]) /* semaphore */
346: if((file=nopen(sub[n]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
347: close(file);
348: logline("P+",str); } } /* end of public message */
349:
350: update_qwkroute(NULL); /* Write ROUTE.DAT */
351:
352: if(lastsub!=INVALID_SUB)
353: smb_close(&smb);
354: fclose(rep);
355:
356: if(useron.rest&FLAG('Q')) { /* QWK Net Node */
357: sprintf(str,"%s%s.MSG",temp_dir,sys_id);
358: remove(str);
359: sprintf(str,"%s%s.REP",temp_dir,sys_id);
360: remove(str);
361:
362: sprintf(str,"%s*.*",temp_dir);
363: i=findfirst(str,&ff,0);
364: if(!i) {
365: sprintf(str,"%sQNET\\%s.IN",data_dir,useron.alias);
366: mkdir(str); }
367: while(!i) { /* Extra files */
368: sprintf(str,"%s%s",temp_dir,ff.ff_name);
369: sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,useron.alias,ff.ff_name);
370: mv(str,fname,1);
371: sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,useron.alias);
372: putsmsg(1,str);
373: i=findnext(&ff); } }
374:
375: bputs(text[QWKUnpacked]);
376: CRLF;
377: /**********************************************/
378: /* Hang-up now if that's what the user wanted */
379: /**********************************************/
380: autohangup();
381:
382: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.