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