|
|
1.1 root 1: #line 1 "PACK_REP.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6: #include "post.h"
7: #include "qwk.h"
8:
9: /****************************************************************************/
10: /* Creates an REP packet for upload to QWK hub 'hubnum'. */
11: /* Returns 1 if successful, 0 if not. */
12: /****************************************************************************/
13: char pack_rep(uint hubnum)
14: {
15: uchar str[256],tmp2[256],ch,*p;
16: uchar HUGE16 *qwkbuf;
17: int file,mode;
18: uint i,j,k,n;
19: long l,size,msgcnt,submsgs,mailmsgs,packedmail,netfiles=0,deleted;
20: ulong last,ptr,posts,msgs;
21: post_t HUGE16 *post;
22: mail_t *mail;
23: struct ffblk ff;
24: FILE *rep;
25: smbmsg_t msg;
26:
27: msgcnt=0L;
28: delfiles(temp_dir,"*.*");
29: sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id);
30: if(fexist(str))
31: external(cmdstr(qhub[hubnum]->unpack,str,"*.*",NULL),EX_OUTL);
32: /*************************************************/
33: /* Create SYSID.MSG, write header and leave open */
34: /*************************************************/
35: sprintf(str,"%s%s.MSG",temp_dir,qhub[hubnum]->id);
36: if((rep=fnopen(&file,str,O_CREAT|O_WRONLY))==NULL) {
37: errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY);
38: return(0); }
39: if(!filelength(file)) { /* New REP packet */
40: sprintf(str,"%-128s",qhub[hubnum]->id); /* So write header */
41: fwrite(str,128,1,rep); }
42: fseek(rep,0L,SEEK_END);
43: /*********************/
44: /* Pack new messages */
45: /*********************/
46: console|=CON_L_ECHO;
47:
48: sprintf(smb.file,"%sMAIL",data_dir);
49: smb.retry_time=smb_retry_time;
50: if((i=smb_open(&smb))!=0) {
51: fclose(rep);
52: errormsg(WHERE,ERR_OPEN,smb.file,i);
53: return(0); }
54:
55: /***********************/
56: /* Pack E-mail, if any */
57: /***********************/
58: qwkmail_time=time(NULL);
59: mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK);
60: packedmail=0;
61: if(mailmsgs) {
62: bputs(text[QWKPackingEmail]);
63: for(l=0;l<mailmsgs;l++) {
64: bprintf("\b\b\b\b\b%-5lu",l+1);
65:
66: msg.idx.offset=mail[l].offset;
67: if(!loadmsg(&msg,mail[l].number))
68: continue;
69:
70: sprintf(str,"%s/",qhub[hubnum]->id);
71: if(msg.to_net.type!=NET_QWK
72: || (strcmp(msg.to_net.addr,qhub[hubnum]->id)
73: && strncmp(msg.to_net.addr,str,strlen(str)))) {
74: smb_unlockmsghdr(&smb,&msg);
75: smb_freemsgmem(&msg);
76: continue; }
77:
78: msgtoqwk(msg,rep,TO_QNET|REP|A_LEAVE,INVALID_SUB,0);
79: packedmail++;
80: smb_unlockmsghdr(&smb,&msg);
81: smb_freemsgmem(&msg); }
82: bprintf(text[QWKPackedEmail],packedmail); }
83: smb_close(&smb); /* Close the e-mail */
84: if(mailmsgs)
85: FREE(mail);
86:
87: useron.number=1;
88: getuserdat(&useron);
89: for(i=0;i<qhub[hubnum]->subs;i++) {
90: j=qhub[hubnum]->sub[i]; /* j now equals the real sub num */
91: msgs=getlastmsg(j,&last,0);
92: lncntr=0; /* defeat pause */
93: if(!msgs || last<=sub[j]->ptr) {
94: if(sub[j]->ptr>last) {
95: sub[j]->ptr=last;
96: sub[j]->last=last; }
97: bprintf(text[NScanStatusFmt]
98: ,grp[sub[j]->grp]->sname
99: ,sub[j]->lname,0L,msgs);
100: continue; }
101:
102: sprintf(smb.file,"%s%s"
103: ,sub[j]->data_dir,sub[j]->code);
104: smb.retry_time=smb_retry_time;
105: if((k=smb_open(&smb))!=0) {
106: errormsg(WHERE,ERR_OPEN,smb.file,k);
107: continue; }
108:
109: post=loadposts(&posts,j,sub[j]->ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP);
110: bprintf(text[NScanStatusFmt]
111: ,grp[sub[j]->grp]->sname
112: ,sub[j]->lname,posts,msgs);
113: if(!posts) { /* no new messages */
114: smb_close(&smb);
115: continue; }
116:
117: sub[j]->ptr=last; /* set pointer */
118: bputs(text[QWKPackingSubboard]); /* ptr to last msg */
119: submsgs=0;
120: for(l=0;l<posts;l++) {
121: bprintf("\b\b\b\b\b%-5lu",l+1);
122:
123: msg.idx.offset=post[l].offset;
124: if(!loadmsg(&msg,post[l].number))
125: continue;
126:
127: if(msg.from_net.type && msg.from_net.type!=NET_QWK &&
128: !(sub[j]->misc&SUB_GATE)) {
129: smb_freemsgmem(&msg);
130: smb_unlockmsghdr(&smb,&msg);
131: continue; }
132:
133: if(!strncmpi(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK &&
134: route_circ(msg.from_net.addr,qhub[hubnum]->id))) {
135: smb_freemsgmem(&msg);
136: smb_unlockmsghdr(&smb,&msg);
137: continue; }
138:
139: mode=qhub[hubnum]->mode[i]|TO_QNET|REP;
140: if(mode&A_LEAVE) mode|=(VIA|TZ);
141: if(msg.from_net.type!=NET_QWK)
142: mode|=TAGLINE;
143:
144: msgtoqwk(msg,rep,mode,j,qhub[hubnum]->conf[i]);
145:
146: smb_freemsgmem(&msg);
147: smb_unlockmsghdr(&smb,&msg);
148: msgcnt++;
149: submsgs++; }
150: bprintf(text[QWKPackedSubboard],submsgs,msgcnt);
151: LFREE(post);
152: smb_close(&smb); }
153:
154: fclose(rep); /* close MESSAGE.DAT */
155: CRLF;
156: /* Look for extra files to send out */
157: sprintf(str,"%sQNET\\%s.OUT\\*.*",data_dir,qhub[hubnum]->id);
158: i=findfirst(str,&ff,0);
159: while(!i) {
160: sprintf(str,"%sQNET\\%s.OUT\\%s",data_dir,qhub[hubnum]->id,ff.ff_name);
161: sprintf(tmp2,"%s%s",temp_dir,ff.ff_name);
162: bprintf(text[RetrievingFile],str);
163: if(!mv(str,tmp2,1))
164: netfiles++;
165: i=findnext(&ff); }
166: if(netfiles)
167: CRLF;
168:
169: if(!msgcnt && !netfiles && !packedmail) {
170: bputs(text[QWKNoNewMessages]);
171: return(0); }
172:
173: /*******************/
174: /* Compress Packet */
175: /*******************/
176: sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id);
177: sprintf(tmp2,"%s*.*",temp_dir);
178: i=external(cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),EX_OUTL);
179: if(!fexist(str)) {
180: bputs(text[QWKCompressionFailed]);
181: if(i)
182: errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),i);
183: else
184: errorlog("Couldn't compress REP packet");
185: return(0); }
186: sprintf(str,"%sQNET\\%s.OUT\\",data_dir,qhub[hubnum]->id);
187: delfiles(str,"*.*");
188:
189: if(packedmail) { /* Delete NetMail */
190: sprintf(smb.file,"%sMAIL",data_dir);
191: smb.retry_time=smb_retry_time;
192: if((i=smb_open(&smb))!=0) {
193: errormsg(WHERE,ERR_OPEN,smb.file,i);
194: return(1); }
195:
196: mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK);
197:
198: if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */
199: if(mailmsgs)
200: FREE(mail);
201: smb_close(&smb);
202: errormsg(WHERE,ERR_LOCK,smb.file,i); /* messes with the index */
203: return(1); }
204:
205: if((i=smb_getstatus(&smb))!=0) {
206: if(mailmsgs)
207: FREE(mail);
208: smb_close(&smb);
209: errormsg(WHERE,ERR_READ,smb.file,i);
210: return(1); }
211:
212: deleted=0;
213: /* Mark as READ and DELETE */
214: for(l=0;l<mailmsgs;l++) {
215: if(mail[l].time>qwkmail_time)
216: continue;
217: msg.idx.offset=0;
218: if(!loadmsg(&msg,mail[l].number))
219: continue;
220:
221: sprintf(str,"%s/",qhub[hubnum]->id);
222: if(msg.to_net.type!=NET_QWK
223: || (strcmp(msg.to_net.addr,qhub[hubnum]->id)
224: && strncmp(msg.to_net.addr,str,strlen(str)))) {
225: smb_unlockmsghdr(&smb,&msg);
226: smb_freemsgmem(&msg);
227: continue; }
228:
229: msg.hdr.attr|=MSG_DELETE;
230: msg.idx.attr=msg.hdr.attr;
231: if((i=smb_putmsg(&smb,&msg))!=0)
232: errormsg(WHERE,ERR_WRITE,smb.file,i);
233: else
234: deleted++;
235: smb_unlockmsghdr(&smb,&msg);
236: smb_freemsgmem(&msg); }
237:
238: if(deleted && sys_misc&SM_DELEMAIL)
239: delmail(0,MAIL_YOUR);
240: smb_close(&smb);
241: if(mailmsgs)
242: FREE(mail); }
243:
244: return(1);
245: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.