|
|
2.30b OS/2
#line 1 "UN_REP.C"
/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
#include "sbbs.h"
#include "qwk.h"
/****************************************************************************/
/* Unpacks .REP packet, 'repname' is the path and filename of the packet */
/****************************************************************************/
void unpack_rep()
{
uchar ch,str[256],fname[128],block[128]
,*AttemptedToUploadREPpacket="Attempted to upload REP packet";
int file;
uint h,i,j,k,msgs,lastsub=INVALID_SUB;
ulong n;
long l,size,misc,crc;
node_t node;
time_t t;
file_t f;
struct ffblk ff;
FILE *rep;
sprintf(str,"%s%s.REP",temp_dir,sys_id);
if(!fexist(str)) {
bputs(text[QWKReplyNotReceived]);
logline("U!",AttemptedToUploadREPpacket);
logline(nulstr,"REP file not received");
return; }
for(k=0;k<total_fextrs;k++)
if(!stricmp(fextr[k]->ext,useron.tmpext) && chk_ar(fextr[k]->ar,useron))
break;
if(k>=total_fextrs)
k=0;
i=external(cmdstr(fextr[k]->cmd,str,"*.*",NULL),EX_OUTL|EX_OUTR);
if(i) {
bputs(text[QWKExtractionFailed]);
logline("U!",AttemptedToUploadREPpacket);
logline(nulstr,"Extraction failed");
return; }
sprintf(str,"%s%s.MSG",temp_dir,sys_id);
if(!fexist(str)) {
bputs(text[QWKReplyNotReceived]);
logline("U!",AttemptedToUploadREPpacket);
logline(nulstr,"MSG file not received");
return; }
if((rep=fnopen(&file,str,O_RDONLY))==NULL) {
errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
return; }
size=filelength(file);
fread(block,128,1,rep);
if(strncmpi(block,sys_id,strlen(sys_id))) {
fclose(rep);
bputs(text[QWKReplyNotReceived]);
logline("U!",AttemptedToUploadREPpacket);
logline(nulstr,"Incorrect BBSID");
return; }
logline("U+","Uploaded REP packet");
/********************/
/* Process messages */
/********************/
bputs(text[QWKUnpacking]);
for(l=128;l<size;l+=i*128) {
lncntr=0; /* defeat pause */
fseek(rep,l,SEEK_SET);
fread(block,128,1,rep);
sprintf(tmp,"%.6s",block+116);
i=atoi(tmp); /* i = number of 128 byte records */
if(i<2) {
sprintf(tmp,"%s blocks",str);
errormsg(WHERE,ERR_CHK,tmp,i);
i=1;
continue; }
if(atoi(block+1)==0) { /**********/
if(useron.rest&FLAG('E')) { /* E-mail */
bputs(text[R_Email]); /**********/
continue; }
sprintf(str,"%25.25s",block+21);
truncsp(str);
if(!stricmp(str,"NETMAIL")) { /* QWK to FidoNet NetMail */
qwktonetmail(rep,block,NULL,0);
continue; }
if(strchr(str,'@')) {
qwktonetmail(rep,block,str,0);
continue; }
if(!stricmp(str,"SBBS")) { /* to SBBS, config stuff */
qwkcfgline(block+71,INVALID_SUB);
continue; }
if(useron.etoday>=level_emailperday[useron.level]
&& !(useron.rest&FLAG('Q'))) {
bputs(text[TooManyEmailsToday]);
continue; }
j=atoi(str);
if(j && j>lastuser())
j=0;
if(!j &&
(!stricmp(str,"SYSOP")
|| !stricmp(str,sys_id)
|| !stricmp(str,sys_op)))
j=1;
if(!j)
j=matchuser(str);
if(!j) {
bputs(text[UnknownUser]);
continue; }
if(j==1 && useron.rest&FLAG('S')) {
bprintf(text[R_Feedback],sys_op);
continue; }
getuserrec(j,U_MISC,8,str);
misc=ahtoul(str);
if(misc&NETMAIL && sys_misc&SM_FWDTONET) {
getuserrec(j,U_NETMAIL,LEN_NETMAIL,str);
qwktonetmail(rep,block,str,0);
continue; }
sprintf(smb.file,"%sMAIL",data_dir);
smb.retry_time=smb_retry_time;
if(lastsub!=INVALID_SUB) {
smb_close(&smb);
lastsub=INVALID_SUB; }
if((k=smb_open(&smb))!=0) {
errormsg(WHERE,ERR_OPEN,smb.file,k);
continue; }
if(!filelength(fileno(smb.shd_fp))) {
smb.status.max_crcs=mail_maxcrcs;
smb.status.max_msgs=MAX_SYSMAIL;
smb.status.max_age=mail_maxage;
smb.status.attr=SMB_EMAIL;
if((k=smb_create(&smb))!=0) {
smb_close(&smb);
errormsg(WHERE,ERR_CREATE,smb.file,k);
continue; } }
if((k=smb_locksmbhdr(&smb))!=0) {
smb_close(&smb);
errormsg(WHERE,ERR_LOCK,smb.file,k);
continue; }
if((k=smb_getstatus(&smb))!=0) {
smb_close(&smb);
errormsg(WHERE,ERR_READ,smb.file,k);
continue; }
smb_unlocksmbhdr(&smb);
if(!qwktomsg(rep,block,0,INVALID_SUB,j)) {
smb_close(&smb);
continue; }
smb_close(&smb);
if(j==1) {
useron.fbacks++;
logon_fbacks++;
putuserrec(useron.number,U_FBACKS,5
,itoa(useron.fbacks,tmp,10)); }
else {
useron.emails++;
logon_emails++;
putuserrec(useron.number,U_EMAILS,5
,itoa(useron.emails,tmp,10)); }
useron.etoday++;
putuserrec(useron.number,U_ETODAY,5
,itoa(useron.etoday,tmp,10));
bprintf(text[Emailed],username(j,tmp),j);
sprintf(str,"E-mailed %s #%d",username(j,tmp),j);
logline("E+",str);
if(useron.rest&FLAG('Q')) {
sprintf(tmp,"%-25.25s",block+46);
truncsp(tmp); }
else
strcpy(tmp,useron.alias);
for(k=1;k<=sys_nodes;k++) { /* Tell user, if online */
getnodedat(k,&node,0);
if(node.useron==j && !(node.misc&NODE_POFF)
&& (node.status==NODE_INUSE
|| node.status==NODE_QUIET)) {
sprintf(str,text[EmailNodeMsg]
,node_num,tmp);
putnmsg(k,str);
break; } }
if(k>sys_nodes) {
sprintf(str,text[UserSentYouMail],tmp);
putsmsg(j,str); } } /* end of email */
/**************************/
else { /* message on a sub-board */
/**************************/
n=atol((char *)block+1); /* conference number */
for(j=0;j<usrgrps;j++) {
for(k=0;k<usrsubs[j];k++)
if(sub[usrsub[j][k]]->qwkconf==n)
break;
if(k<usrsubs[j])
break; }
if(j>=usrgrps) {
if(n<1000) { /* version 1 method, start at 101 */
j=n/100;
k=n-(j*100); }
else { /* version 2 method, start at 1001 */
j=n/1000;
k=n-(j*1000); }
j--; /* j is group */
k--; /* k is sub */
if(j>=usrgrps || k>=usrsubs[j]) {
bprintf(text[QWKInvalidConferenceN],n);
sprintf(str,"Invalid conference number %d",n);
logline("P!",str);
continue; } }
n=usrsub[j][k];
/* if posting, add to new-scan config for QWKnet nodes automatically */
if(useron.rest&FLAG('Q'))
sub[n]->misc|=SUB_NSCAN;
sprintf(str,"%-25.25s","SBBS");
if(!strnicmp((char *)block+21,str,25)) { /* to SBBS, config stuff */
qwkcfgline((char *)block+71,n);
continue; }
if(!SYSOP && sub[n]->misc&SUB_QNET) { /* QWK Netted */
sprintf(str,"%-25.25s","DROP"); /* Drop from new-scan? */
if(!strnicmp((char *)block+71,str,25)) /* don't allow post */
continue;
sprintf(str,"%-25.25s","ADD"); /* Add to new-scan? */
if(!strnicmp((char *)block+71,str,25)) /* don't allow post */
continue; }
if(useron.rest&FLAG('Q') && !(sub[n]->misc&SUB_QNET)) {
bputs(text[CantPostOnSub]);
logline("P!","Attempted to post on non-QWKnet sub");
continue; }
if(useron.rest&FLAG('P')) {
bputs(text[R_Post]);
logline("P!","Post attempted");
continue; }
if(useron.ptoday>=level_postsperday[useron.level]
&& !(useron.rest&FLAG('Q'))) {
bputs(text[TooManyPostsToday]);
continue; }
if(useron.rest&FLAG('N')
&& sub[n]->misc&(SUB_FIDO|SUB_PNET|SUB_QNET|SUB_INET)) {
bputs(text[CantPostOnSub]);
logline("P!","Networked post attempted");
continue; }
if(!chk_ar(sub[n]->post_ar,useron)) {
bputs(text[CantPostOnSub]);
logline("P!","Post attempted");
continue; }
if((block[0]=='*' || block[0]=='+')
&& !(sub[n]->misc&SUB_PRIV)) {
bputs(text[PrivatePostsNotAllowed]);
logline("P!","Private post attempt");
continue; }
if(block[0]=='*' || block[0]=='+' /* Private post */
|| sub[n]->misc&SUB_PONLY) {
sprintf(str,"%-25.25s",nulstr);
sprintf(tmp,"%-25.25s","ALL");
if(!strnicmp((char *)block+21,str,25)
|| !strnicmp((char *)block+21,tmp,25)) { /* to blank */
bputs(text[NoToUser]); /* or all */
continue; } }
if(!SYSOP && !(useron.rest&FLAG('Q'))) {
sprintf(str,"%-25.25s","SYSOP");
if(!strnicmp((char *)block+21,str,25)) {
sprintf(str,"%-25.25s",username(1,tmp));
memcpy((char *)block+21,str,25); } } /* change from sysop */
/* to user #1 */
#if 0 /* TWIT FILTER */
sprintf(str,"%25.25s",block+46); /* From user */
truncsp(str);
if(!stricmp(str,"Lee Matherne")
|| !stricmp(str,"Big Joe")
) {
bprintf(text[Posted],grp[sub[n]->grp]->sname
,sub[n]->lname);
continue; }
#endif
if(n!=lastsub) {
if(lastsub!=INVALID_SUB)
smb_close(&smb);
lastsub=INVALID_SUB;
sprintf(smb.file,"%s%s",sub[n]->data_dir,sub[n]->code);
smb.retry_time=smb_retry_time;
if((j=smb_open(&smb))!=0) {
errormsg(WHERE,ERR_OPEN,smb.file,j);
continue; }
if(!filelength(fileno(smb.shd_fp))) {
smb.status.max_crcs=sub[n]->maxcrcs;
smb.status.max_msgs=sub[n]->maxmsgs;
smb.status.max_age=sub[n]->maxage;
smb.status.attr=sub[n]->misc&SUB_HYPER ? SMB_HYPERALLOC:0;
if((j=smb_create(&smb))!=0) {
smb_close(&smb);
lastsub=INVALID_SUB;
errormsg(WHERE,ERR_CREATE,smb.file,j);
continue; } }
if((j=smb_locksmbhdr(&smb))!=0) {
smb_close(&smb);
lastsub=INVALID_SUB;
errormsg(WHERE,ERR_LOCK,smb.file,j);
continue; }
if((j=smb_getstatus(&smb))!=0) {
smb_close(&smb);
lastsub=INVALID_SUB;
errormsg(WHERE,ERR_READ,smb.file,j);
continue; }
smb_unlocksmbhdr(&smb);
lastsub=n; }
if(!qwktomsg(rep,block,0,n,0))
continue;
useron.ptoday++;
useron.posts++;
// if(!(useron.rest&FLAG('Q')))
logon_posts++;
putuserrec(useron.number,U_POSTS,5,itoa(useron.posts,str,10));
putuserrec(useron.number,U_PTODAY,5,itoa(useron.ptoday,str,10));
bprintf(text[Posted],grp[sub[n]->grp]->sname
,sub[n]->lname);
sprintf(str,"Posted on %s %s",grp[sub[n]->grp]->sname
,sub[n]->lname);
if(sub[n]->misc&SUB_FIDO && sub[n]->echomail_sem[0]) /* semaphore */
if((file=nopen(sub[n]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
close(file);
logline("P+",str); } } /* end of public message */
update_qwkroute(NULL); /* Write ROUTE.DAT */
if(lastsub!=INVALID_SUB)
smb_close(&smb);
fclose(rep);
if(useron.rest&FLAG('Q')) { /* QWK Net Node */
sprintf(str,"%s%s.MSG",temp_dir,sys_id);
remove(str);
sprintf(str,"%s%s.REP",temp_dir,sys_id);
remove(str);
sprintf(str,"%s*.*",temp_dir);
i=findfirst(str,&ff,0);
if(!i) {
sprintf(str,"%sQNET\\%s.IN",data_dir,useron.alias);
mkdir(str); }
while(!i) { /* Extra files */
sprintf(str,"%s%s",temp_dir,ff.ff_name);
sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,useron.alias,ff.ff_name);
mv(str,fname,1);
sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,useron.alias);
putsmsg(1,str);
i=findnext(&ff); } }
bputs(text[QWKUnpacked]);
CRLF;
/**********************************************/
/* Hang-up now if that's what the user wanted */
/**********************************************/
autohangup();
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.