|
|
1.1 ! root 1: /* qwk.cpp */ ! 2: ! 3: /* Synchronet QWK packet-related functions */ ! 4: ! 5: /* $Id: qwk.cpp,v 1.42 2005/09/20 03:39:52 deuce Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: #include "qwk.h" ! 40: ! 41: /****************************************************************************/ ! 42: /* Converts a long to an msbin real number. required for QWK NDX file */ ! 43: /****************************************************************************/ ! 44: float ltomsbin(long val) ! 45: { ! 46: union { ! 47: uchar uc[10]; ! 48: ushort ui[5]; ! 49: ulong ul[2]; ! 50: float f[2]; ! 51: double d[1]; ! 52: } t; ! 53: int sign, exp; /* sign and exponent */ ! 54: ! 55: t.f[0]=(float)val; ! 56: sign=t.uc[3]/0x80; ! 57: exp=((t.ui[1]>>7)-0x7f+0x81)&0xff; ! 58: t.ui[1]=(t.ui[1]&0x7f)|(sign<<7)|(exp<<8); ! 59: return(t.f[0]); ! 60: } ! 61: ! 62: bool route_circ(char *via, char *id) ! 63: { ! 64: char str[256],*p,*sp; ! 65: ! 66: strcpy(str,via); ! 67: p=str; ! 68: while(*p && *p<=' ') ! 69: p++; ! 70: while(*p) { ! 71: sp=strchr(p,'/'); ! 72: if(sp) *sp=0; ! 73: if(!stricmp(p,id)) ! 74: return(true); ! 75: if(!sp) ! 76: break; ! 77: p=sp+1; } ! 78: return(false); ! 79: } ! 80: ! 81: int sbbs_t::qwk_route(char *inaddr, char *fulladdr) ! 82: { ! 83: char node[10],str[256],*p; ! 84: int file,i; ! 85: FILE *stream; ! 86: ! 87: fulladdr[0]=0; ! 88: SAFECOPY(str,inaddr); ! 89: p=strrchr(str,'/'); ! 90: if(p) p++; ! 91: else p=str; ! 92: sprintf(node,"%.8s",p); /* node = destination node */ ! 93: truncsp(node); ! 94: ! 95: for(i=0;i<cfg.total_qhubs;i++) /* Check if destination is our hub */ ! 96: if(!stricmp(cfg.qhub[i]->id,node)) ! 97: break; ! 98: if(i<cfg.total_qhubs) { ! 99: strcpy(fulladdr,node); ! 100: return(0); } ! 101: ! 102: i=matchuser(&cfg,node,FALSE); /* Check if destination is a node */ ! 103: if(i) { ! 104: getuserrec(&cfg,i,U_REST,8,str); ! 105: if(ahtoul(str)&FLAG('Q')) { ! 106: strcpy(fulladdr,node); ! 107: return(i); } } ! 108: ! 109: sprintf(node,"%.8s",inaddr); /* node = next hop */ ! 110: p=strchr(node,'/'); ! 111: if(p) *p=0; ! 112: truncsp(node); ! 113: ! 114: if(strchr(inaddr,'/')) { /* Multiple hops */ ! 115: ! 116: for(i=0;i<cfg.total_qhubs;i++) /* Check if next hop is our hub */ ! 117: if(!stricmp(cfg.qhub[i]->id,node)) ! 118: break; ! 119: if(i<cfg.total_qhubs) { ! 120: strcpy(fulladdr,inaddr); ! 121: return(0); } ! 122: ! 123: i=matchuser(&cfg,node,FALSE); /* Check if next hop is a node */ ! 124: if(i) { ! 125: getuserrec(&cfg,i,U_REST,8,str); ! 126: if(ahtoul(str)&FLAG('Q')) { ! 127: strcpy(fulladdr,inaddr); ! 128: return(i); } } } ! 129: ! 130: p=strchr(node,' '); ! 131: if(p) *p=0; ! 132: ! 133: sprintf(str,"%sqnet/route.dat",cfg.data_dir); ! 134: if((stream=fnopen(&file,str,O_RDONLY))==NULL) ! 135: return(0); ! 136: ! 137: strcat(node,":"); ! 138: fulladdr[0]=0; ! 139: while(!feof(stream)) { ! 140: if(!fgets(str,256,stream)) ! 141: break; ! 142: if(!strnicmp(str+9,node,strlen(node))) { ! 143: fclose(stream); ! 144: truncsp(str); ! 145: sprintf(fulladdr,"%s/%s",str+9+strlen(node),inaddr); ! 146: break; } } ! 147: ! 148: fclose(stream); ! 149: if(!fulladdr[0]) /* First hop not found in ROUTE.DAT */ ! 150: return(0); ! 151: ! 152: sprintf(node,"%.8s",fulladdr); ! 153: p=strchr(node,'/'); ! 154: if(p) *p=0; ! 155: truncsp(node); ! 156: ! 157: for(i=0;i<cfg.total_qhubs;i++) /* Check if first hop is our hub */ ! 158: if(!stricmp(cfg.qhub[i]->id,node)) ! 159: break; ! 160: if(i<cfg.total_qhubs) ! 161: return(0); ! 162: ! 163: i=matchuser(&cfg,node,FALSE); /* Check if first hop is a node */ ! 164: if(i) { ! 165: getuserrec(&cfg,i,U_REST,8,str); ! 166: if(ahtoul(str)&FLAG('Q')) ! 167: return(i); } ! 168: fulladdr[0]=0; ! 169: return(0); ! 170: } ! 171: ! 172: ! 173: /* Via is in format: NODE/NODE/... */ ! 174: void sbbs_t::update_qwkroute(char *via) ! 175: { ! 176: static uint total_nodes; ! 177: static char **qwk_node; ! 178: static char **qwk_path; ! 179: static time_t *qwk_time; ! 180: char str[256],*p,*tp,node[9]; ! 181: uint i; ! 182: int file; ! 183: time_t t; ! 184: FILE * stream; ! 185: ! 186: if(via==NULL) { ! 187: if(!total_nodes) ! 188: return; ! 189: sprintf(str,"%sqnet/route.dat",cfg.data_dir); ! 190: if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))!=NULL) { ! 191: t=time(NULL); ! 192: t-=(90L*24L*60L*60L); ! 193: for(i=0;i<total_nodes;i++) ! 194: if(qwk_time[i]>t) ! 195: fprintf(stream,"%s %s:%s\r\n" ! 196: ,unixtodstr(&cfg,qwk_time[i],str),qwk_node[i],qwk_path[i]); ! 197: fclose(stream); } ! 198: else ! 199: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); ! 200: for(i=0;i<total_nodes;i++) { ! 201: free(qwk_node[i]); ! 202: free(qwk_path[i]); } ! 203: if(qwk_node) { ! 204: free(qwk_node); ! 205: qwk_node=NULL; } ! 206: if(qwk_path) { ! 207: free(qwk_path); ! 208: qwk_path=NULL; } ! 209: if(qwk_time) { ! 210: free(qwk_time); ! 211: qwk_time=NULL; } ! 212: total_nodes=0; ! 213: return; } ! 214: ! 215: if(!total_nodes) { ! 216: sprintf(str,"%sqnet/route.dat",cfg.data_dir); ! 217: if((stream=fnopen(&file,str,O_RDONLY))!=NULL) { ! 218: while(!feof(stream)) { ! 219: if(!fgets(str,255,stream)) ! 220: break; ! 221: truncsp(str); ! 222: t=dstrtounix(&cfg,str); ! 223: p=strchr(str,':'); ! 224: if(!p) continue; ! 225: *p=0; ! 226: sprintf(node,"%.8s",str+9); ! 227: tp=strchr(node,' '); /* change "node bbs:" to "node:" */ ! 228: if(tp) *tp=0; ! 229: for(i=0;i<total_nodes;i++) ! 230: if(!stricmp(qwk_node[i],node)) ! 231: break; ! 232: if(i<total_nodes && qwk_time[i]>t) ! 233: continue; ! 234: if(i==total_nodes) { ! 235: if((qwk_node=(char **)realloc(qwk_node,sizeof(char *)*(i+1)))==NULL) { ! 236: errormsg(WHERE,ERR_ALLOC,str,9*(i+1)); ! 237: break; } ! 238: if((qwk_path=(char **)realloc(qwk_path,sizeof(char *)*(i+1)))==NULL) { ! 239: errormsg(WHERE,ERR_ALLOC,str,sizeof(char*)*(i+1)); ! 240: break; } ! 241: if((qwk_time=(time_t *)realloc(qwk_time,sizeof(time_t)*(i+1)))==NULL) { ! 242: errormsg(WHERE,ERR_ALLOC,str,sizeof(time_t)*(i+1)); ! 243: break; } ! 244: if((qwk_node[i]=(char *)malloc(9))==NULL) { ! 245: errormsg(WHERE,ERR_ALLOC,str,9); ! 246: break; } ! 247: if((qwk_path[i]=(char *)malloc(MAX_PATH+1))==NULL) { ! 248: errormsg(WHERE,ERR_ALLOC,str,MAX_PATH+1); ! 249: break; } ! 250: total_nodes++; } ! 251: strcpy(qwk_node[i],node); ! 252: p++; ! 253: while(*p && *p<=' ') p++; ! 254: sprintf(qwk_path[i],"%.127s",p); ! 255: qwk_time[i]=t; } ! 256: fclose(stream); } } ! 257: ! 258: strupr(via); ! 259: p=strchr(via,'/'); /* Skip uplink */ ! 260: ! 261: while(p && *p) { ! 262: p++; ! 263: sprintf(node,"%.8s",p); ! 264: tp=strchr(node,'/'); ! 265: if(tp) *tp=0; ! 266: tp=strchr(node,' '); /* no spaces allowed */ ! 267: if(tp) *tp=0; ! 268: truncsp(node); ! 269: for(i=0;i<total_nodes;i++) ! 270: if(!stricmp(qwk_node[i],node)) ! 271: break; ! 272: if(i==total_nodes) { /* Not in list */ ! 273: if((qwk_node=(char **)realloc(qwk_node,sizeof(char *)*(total_nodes+1)))==NULL) { ! 274: errormsg(WHERE,ERR_ALLOC,str,9*(total_nodes+1)); ! 275: break; } ! 276: if((qwk_path=(char **)realloc(qwk_path,sizeof(char *)*(total_nodes+1)))==NULL) { ! 277: errormsg(WHERE,ERR_ALLOC,str,sizeof(char *)*(total_nodes+1)); ! 278: break; } ! 279: if((qwk_time=(time_t *)realloc(qwk_time,sizeof(time_t)*(total_nodes+1))) ! 280: ==NULL) { ! 281: errormsg(WHERE,ERR_ALLOC,str,sizeof(time_t)*(total_nodes+1)); ! 282: break; } ! 283: if((qwk_node[total_nodes]=(char *)malloc(9))==NULL) { ! 284: errormsg(WHERE,ERR_ALLOC,str,9); ! 285: break; } ! 286: if((qwk_path[total_nodes]=(char *)malloc(MAX_PATH+1))==NULL) { ! 287: errormsg(WHERE,ERR_ALLOC,str,MAX_PATH+1); ! 288: break; } ! 289: total_nodes++; } ! 290: sprintf(qwk_node[i],"%.8s",node); ! 291: sprintf(qwk_path[i],"%.*s",(int)((p-1)-via),via); ! 292: qwk_time[i]=time(NULL); ! 293: p=strchr(p,'/'); } ! 294: } ! 295: ! 296: /****************************************************************************/ ! 297: /* Successful download of QWK packet */ ! 298: /****************************************************************************/ ! 299: void sbbs_t::qwk_success(ulong msgcnt, char bi, char prepack) ! 300: { ! 301: char str[MAX_PATH+1]; ! 302: int i; ! 303: long l,msgs,deleted=0; ! 304: mail_t *mail; ! 305: smbmsg_t msg; ! 306: ! 307: if(useron.rest&FLAG('Q')) { // Was if(!prepack) only ! 308: sprintf(str,"%sqnet/%.8s.out/",cfg.data_dir,useron.alias); ! 309: strlwr(str); ! 310: delfiles(str,ALLFILES); ! 311: } ! 312: ! 313: if(!prepack) { ! 314: sprintf(str,"%s downloaded QWK packet",useron.alias); ! 315: logline("D-",str); ! 316: posts_read+=msgcnt; ! 317: ! 318: sprintf(str,"%sfile/%04u.qwk",cfg.data_dir,useron.number); ! 319: if(fexistcase(str)) ! 320: remove(str); ! 321: ! 322: if(!bi) { ! 323: batch_download(-1); ! 324: delfiles(cfg.temp_dir,ALLFILES); } } ! 325: ! 326: if(useron.rest&FLAG('Q')) ! 327: useron.qwk|=(QWK_EMAIL|QWK_ALLMAIL|QWK_DELMAIL); ! 328: if(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL)) { ! 329: sprintf(smb.file,"%smail",cfg.data_dir); ! 330: smb.retry_time=cfg.smb_retry_time; ! 331: smb.subnum=INVALID_SUB; ! 332: if((i=smb_open(&smb))!=0) { ! 333: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 334: return; } ! 335: ! 336: mail=loadmail(&smb,&msgs,useron.number,0 ! 337: ,useron.qwk&QWK_ALLMAIL ? 0 : LM_UNREAD); ! 338: ! 339: if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */ ! 340: if(msgs) ! 341: free(mail); ! 342: smb_close(&smb); ! 343: errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); /* messes with the index */ ! 344: return; } ! 345: ! 346: if((i=smb_getstatus(&smb))!=0) { ! 347: if(msgs) ! 348: free(mail); ! 349: smb_close(&smb); ! 350: errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); ! 351: return; } ! 352: ! 353: /* Mark as READ and DELETE */ ! 354: for(l=0;l<msgs;l++) { ! 355: if(mail[l].number>qwkmail_last) ! 356: continue; ! 357: memset(&msg,0,sizeof(msg)); ! 358: /* !IMPORTANT: search by number (do not initialize msg.idx.offset) */ ! 359: if(!loadmsg(&msg,mail[l].number)) ! 360: continue; ! 361: if(!(msg.hdr.attr&MSG_READ)) { ! 362: if(thisnode.status==NODE_INUSE) ! 363: telluser(&msg); ! 364: msg.hdr.attr|=MSG_READ; ! 365: msg.idx.attr=msg.hdr.attr; ! 366: smb_putmsg(&smb,&msg); } ! 367: if(!(msg.hdr.attr&MSG_PERMANENT) ! 368: && ((msg.hdr.attr&MSG_KILLREAD && msg.hdr.attr&MSG_READ) ! 369: || (useron.qwk&QWK_DELMAIL))) { ! 370: msg.hdr.attr|=MSG_DELETE; ! 371: msg.idx.attr=msg.hdr.attr; ! 372: if((i=smb_putmsg(&smb,&msg))!=0) ! 373: errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); ! 374: else ! 375: deleted++; } ! 376: smb_freemsgmem(&msg); ! 377: smb_unlockmsghdr(&smb,&msg); } ! 378: ! 379: if(deleted && cfg.sys_misc&SM_DELEMAIL) ! 380: delmail(useron.number,MAIL_YOUR); ! 381: smb_close(&smb); ! 382: if(msgs) ! 383: free(mail); } ! 384: ! 385: } ! 386: ! 387: /****************************************************************************/ ! 388: /* QWK mail packet section */ ! 389: /****************************************************************************/ ! 390: void sbbs_t::qwk_sec() ! 391: { ! 392: char str[256],tmp2[256],ch,bi=0; ! 393: char tmp[512]; ! 394: int error; ! 395: int s; ! 396: uint i,k; ! 397: ulong msgcnt; ! 398: ulong *sav_ptr; ! 399: file_t fd; ! 400: ! 401: memset(&fd,0,sizeof(fd)); ! 402: getusrdirs(); ! 403: fd.dir=cfg.total_dirs; ! 404: if((sav_ptr=(ulong *)malloc(sizeof(ulong)*cfg.total_subs))==NULL) { ! 405: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ulong)*cfg.total_subs); ! 406: return; } ! 407: for(i=0;i<cfg.total_subs;i++) ! 408: sav_ptr[i]=subscan[i].ptr; ! 409: for(i=0;i<cfg.total_prots;i++) ! 410: if(cfg.prot[i]->bicmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) ! 411: bi++; /* number of bidirectional protocols configured */ ! 412: if(useron.rest&FLAG('Q')) ! 413: getusrsubs(); ! 414: delfiles(cfg.temp_dir,ALLFILES); ! 415: while(online) { ! 416: if((useron.misc&(WIP|RIP|HTML) || !(useron.misc&EXPERT)) ! 417: && (useron.logons<2 || !(useron.rest&FLAG('Q')))) ! 418: menu("qwk"); ! 419: action=NODE_TQWK; ! 420: ASYNC; ! 421: bputs(text[QWKPrompt]); ! 422: strcpy(str,"?UDCSPQ\r"); ! 423: if(bi) ! 424: strcat(str,"B"); ! 425: ch=(char)getkeys(str,0); ! 426: if(ch>' ') ! 427: logch(ch,0); ! 428: if(sys_status&SS_ABORT || ch=='Q' || ch==CR || !online) ! 429: break; ! 430: if(ch=='?') { ! 431: if((useron.misc&(WIP|RIP|HTML) || !(useron.misc&EXPERT)) ! 432: && !(useron.rest&FLAG('Q'))) ! 433: continue; ! 434: menu("qwk"); ! 435: continue; } ! 436: if(ch=='S') { ! 437: new_scan_cfg(SUB_CFG_NSCAN); ! 438: delfiles(cfg.temp_dir,ALLFILES); ! 439: continue; } ! 440: if(ch=='P') { ! 441: new_scan_ptr_cfg(); ! 442: for(i=0;i<cfg.total_subs;i++) ! 443: sav_ptr[i]=subscan[i].ptr; ! 444: delfiles(cfg.temp_dir,ALLFILES); ! 445: continue; } ! 446: if(ch=='C') { ! 447: while(online) { ! 448: CLS; ! 449: bputs("\1n\1gQWK Settings:\1n\r\n\r\n"); ! 450: bprintf("\1hA\1n) %-30s: \1h%s\r\n" ! 451: ,"Ctrl-A Color Codes" ! 452: ,useron.qwk&QWK_EXPCTLA ! 453: ? "Expand to ANSI" : useron.qwk&QWK_RETCTLA ? "Leave in" ! 454: : "Strip"); ! 455: bprintf("\1hT\1n) %-30s: \1h%s\r\n" ! 456: ,"Archive Type" ! 457: ,useron.tmpext); ! 458: bprintf("\1hE\1n) %-30s: \1h%s\r\n" ! 459: ,"Include E-mail Messages" ! 460: ,useron.qwk&QWK_EMAIL ? "Un-read Only" ! 461: : useron.qwk&QWK_ALLMAIL ? text[Yes] : text[No]); ! 462: bprintf("\1hI\1n) %-30s: \1h%s\r\n" ! 463: ,"Include File Attachments" ! 464: ,useron.qwk&QWK_ATTACH ? text[Yes] : text[No]); ! 465: bprintf("\1hD\1n) %-30s: \1h%s\r\n" ! 466: ,"Delete E-mail Automatically" ! 467: ,useron.qwk&QWK_DELMAIL ? text[Yes]:text[No]); ! 468: bprintf("\1hF\1n) %-30s: \1h%s\r\n" ! 469: ,"Include New Files List" ! 470: ,useron.qwk&QWK_FILES ? text[Yes]:text[No]); ! 471: bprintf("\1hN\1n) %-30s: \1h%s\r\n" ! 472: ,"Include Index Files" ! 473: ,useron.qwk&QWK_NOINDEX ? text[No]:text[Yes]); ! 474: bprintf("\1hC\1n) %-30s: \1h%s\r\n" ! 475: ,"Include Control Files" ! 476: ,useron.qwk&QWK_NOCTRL ? text[No]:text[Yes]); ! 477: bprintf("\1hY\1n) %-30s: \1h%s\r\n" ! 478: ,"Include Messages from You" ! 479: ,useron.qwk&QWK_BYSELF ? text[Yes]:text[No]); ! 480: bprintf("\1hZ\1n) %-30s: \1h%s\r\n" ! 481: ,"Include Time Zone (TZ)" ! 482: ,useron.qwk&QWK_TZ ? text[Yes]:text[No]); ! 483: bprintf("\1hV\1n) %-30s: \1h%s\1n\r\n" ! 484: ,"Include Message Path (VIA)" ! 485: ,useron.qwk&QWK_VIA ? text[Yes]:text[No]); ! 486: bprintf("\1hM\1n) %-30s: \1h%s\1n\r\n" ! 487: ,"Include Message/Reply IDs" ! 488: ,useron.qwk&QWK_MSGID ? text[Yes]:text[No]); ! 489: bprintf("\1hX\1n) %-30s: \1h%s\1n\r\n" ! 490: ,"Extended (QWKE) Packet Format" ! 491: ,useron.qwk&QWK_EXT ? text[Yes]:text[No]); ! 492: bputs(text[UserDefaultsWhich]); ! 493: ch=(char)getkeys("AEDFIOQTYMNCXZV",0); ! 494: if(sys_status&SS_ABORT || !ch || ch=='Q' || !online) ! 495: break; ! 496: switch(ch) { ! 497: case 'A': ! 498: if(!(useron.qwk&(QWK_EXPCTLA|QWK_RETCTLA))) ! 499: useron.qwk|=QWK_EXPCTLA; ! 500: else if(useron.qwk&QWK_EXPCTLA) { ! 501: useron.qwk&=~QWK_EXPCTLA; ! 502: useron.qwk|=QWK_RETCTLA; } ! 503: else ! 504: useron.qwk&=~(QWK_EXPCTLA|QWK_RETCTLA); ! 505: break; ! 506: case 'T': ! 507: for(i=0;i<cfg.total_fcomps;i++) ! 508: uselect(1,i,"Archive Types",cfg.fcomp[i]->ext,cfg.fcomp[i]->ar); ! 509: s=uselect(0,0,0,0,0); ! 510: if(s>=0) { ! 511: strcpy(useron.tmpext,cfg.fcomp[s]->ext); ! 512: putuserrec(&cfg,useron.number,U_TMPEXT,3,useron.tmpext); } ! 513: break; ! 514: case 'E': ! 515: if(!(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL))) ! 516: useron.qwk|=QWK_EMAIL; ! 517: else if(useron.qwk&QWK_EMAIL) { ! 518: useron.qwk&=~QWK_EMAIL; ! 519: useron.qwk|=QWK_ALLMAIL; } ! 520: else ! 521: useron.qwk&=~(QWK_EMAIL|QWK_ALLMAIL); ! 522: break; ! 523: case 'I': ! 524: useron.qwk^=QWK_ATTACH; ! 525: break; ! 526: case 'D': ! 527: useron.qwk^=QWK_DELMAIL; ! 528: break; ! 529: case 'F': ! 530: useron.qwk^=QWK_FILES; ! 531: break; ! 532: case 'N': /* NO IDX files */ ! 533: useron.qwk^=QWK_NOINDEX; ! 534: break; ! 535: case 'C': ! 536: useron.qwk^=QWK_NOCTRL; ! 537: break; ! 538: case 'Z': ! 539: useron.qwk^=QWK_TZ; ! 540: break; ! 541: case 'V': ! 542: useron.qwk^=QWK_VIA; ! 543: break; ! 544: case 'M': ! 545: useron.qwk^=QWK_MSGID; ! 546: break; ! 547: case 'Y': /* Yourself */ ! 548: useron.qwk^=QWK_BYSELF; ! 549: break; ! 550: case 'X': /* QWKE */ ! 551: useron.qwk^=QWK_EXT; ! 552: break; ! 553: } ! 554: putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,str,16)); } ! 555: delfiles(cfg.temp_dir,ALLFILES); ! 556: continue; } ! 557: ! 558: ! 559: if(ch=='B') { /* Bidirectional QWK and REP packet transfer */ ! 560: sprintf(str,"%s%s.qwk",cfg.temp_dir,cfg.sys_id); ! 561: if(!fexistcase(str) && !pack_qwk(str,&msgcnt,0)) { ! 562: for(i=0;i<cfg.total_subs;i++) ! 563: subscan[i].ptr=sav_ptr[i]; ! 564: remove(str); ! 565: last_ns_time=ns_time; ! 566: continue; } ! 567: bprintf(text[UploadingREP],cfg.sys_id); ! 568: xfer_prot_menu(XFER_BIDIR); ! 569: mnemonics(text[ProtocolOrQuit]); ! 570: strcpy(tmp2,"Q"); ! 571: for(i=0;i<cfg.total_prots;i++) ! 572: if(cfg.prot[i]->bicmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { ! 573: sprintf(tmp,"%c",cfg.prot[i]->mnemonic); ! 574: strcat(tmp2,tmp); } ! 575: ch=(char)getkeys(tmp2,0); ! 576: if(ch=='Q' || sys_status&SS_ABORT || !online) { ! 577: for(i=0;i<cfg.total_subs;i++) ! 578: subscan[i].ptr=sav_ptr[i]; /* re-load saved pointers */ ! 579: last_ns_time=ns_time; ! 580: continue; } ! 581: for(i=0;i<cfg.total_prots;i++) ! 582: if(cfg.prot[i]->bicmd[0] && cfg.prot[i]->mnemonic==ch ! 583: && chk_ar(cfg.prot[i]->ar,&useron)) ! 584: break; ! 585: if(i<cfg.total_prots) { ! 586: batup_total=1; ! 587: batup_dir[0]=cfg.total_dirs; ! 588: sprintf(batup_name[0],"%s.rep",cfg.sys_id); ! 589: batdn_total=1; ! 590: batdn_dir[0]=cfg.total_dirs; ! 591: sprintf(batdn_name[0],"%s.qwk",cfg.sys_id); ! 592: if(!create_batchdn_lst((cfg.prot[i]->misc&PROT_NATIVE) ? true:false) ! 593: || !create_batchup_lst() ! 594: || !create_bimodem_pth()) { ! 595: batup_total=batdn_total=0; ! 596: continue; } ! 597: sprintf(str,"%s%s.qwk",cfg.temp_dir,cfg.sys_id); ! 598: sprintf(tmp2,"%s.qwk",cfg.sys_id); ! 599: padfname(tmp2,fd.name); ! 600: sprintf(str,"%sBATCHDN.LST",cfg.node_dir); ! 601: sprintf(tmp2,"%sBATCHUP.LST",cfg.node_dir); ! 602: error=protocol(cfg.prot[i],XFER_BIDIR,str,tmp2,true); ! 603: batdn_total=batup_total=0; ! 604: if(!checkprotresult(cfg.prot[i],error,&fd)) { ! 605: last_ns_time=ns_time; ! 606: for(i=0;i<cfg.total_subs;i++) ! 607: subscan[i].ptr=sav_ptr[i]; /* re-load saved pointers */ ! 608: } ! 609: else { ! 610: qwk_success(msgcnt,1,0); ! 611: for(i=0;i<cfg.total_subs;i++) ! 612: sav_ptr[i]=subscan[i].ptr; ! 613: } ! 614: sprintf(str,"%s%s.qwk",cfg.temp_dir,cfg.sys_id); ! 615: if(fexistcase(str)) ! 616: remove(str); ! 617: unpack_rep(); ! 618: delfiles(cfg.temp_dir,ALLFILES); ! 619: //autohangup(); ! 620: } ! 621: else { ! 622: last_ns_time=ns_time; ! 623: for(i=0;i<cfg.total_subs;i++) ! 624: subscan[i].ptr=sav_ptr[i]; } } ! 625: ! 626: else if(ch=='D') { /* Download QWK Packet of new messages */ ! 627: sprintf(str,"%s%s.qwk",cfg.temp_dir,cfg.sys_id); ! 628: if(!fexistcase(str) && !pack_qwk(str,&msgcnt,0)) { ! 629: for(i=0;i<cfg.total_subs;i++) ! 630: subscan[i].ptr=sav_ptr[i]; ! 631: last_ns_time=ns_time; ! 632: remove(str); ! 633: continue; } ! 634: #if 0 /* no such thing as local logon */ ! 635: if(online==ON_LOCAL) { /* Local QWK packet creation */ ! 636: bputs(text[EnterPath]); ! 637: if(!getstr(str,60,K_LINE|K_UPPER)) { ! 638: for(i=0;i<cfg.total_subs;i++) ! 639: subscan[i].ptr=sav_ptr[i]; /* re-load saved pointers */ ! 640: last_ns_time=ns_time; ! 641: continue; } ! 642: backslashcolon(str); ! 643: sprintf(tmp2,"%s%s.qwk",str,cfg.sys_id); ! 644: if(fexistcase(tmp2)) { ! 645: for(i=0;i<10;i++) { ! 646: sprintf(tmp2,"%s%s.qw%d",str,cfg.sys_id,i); ! 647: if(!fexistcase(tmp2)) ! 648: break; } ! 649: if(i==10) { ! 650: bputs(text[FileAlreadyThere]); ! 651: last_ns_time=ns_time; ! 652: for(i=0;i<cfg.total_subs;i++) ! 653: subscan[i].ptr=sav_ptr[i]; ! 654: continue; } } ! 655: sprintf(tmp,"%s%s.qwk",cfg.temp_dir,cfg.sys_id); ! 656: if(mv(tmp,tmp2,0)) { /* unsuccessful */ ! 657: for(i=0;i<cfg.total_subs;i++) ! 658: subscan[i].ptr=sav_ptr[i]; ! 659: last_ns_time=ns_time; } ! 660: else { ! 661: bprintf(text[FileNBytesSent],tmp2,ultoac(flength(tmp2),tmp)); ! 662: qwk_success(msgcnt,0,0); ! 663: for(i=0;i<cfg.total_subs;i++) ! 664: sav_ptr[i]=subscan[i].ptr; } ! 665: continue; } ! 666: #endif ! 667: /***************/ ! 668: /* Send Packet */ ! 669: /***************/ ! 670: xfer_prot_menu(XFER_DOWNLOAD); ! 671: mnemonics(text[ProtocolOrQuit]); ! 672: strcpy(tmp2,"Q"); ! 673: for(i=0;i<cfg.total_prots;i++) ! 674: if(cfg.prot[i]->dlcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { ! 675: sprintf(tmp,"%c",cfg.prot[i]->mnemonic); ! 676: strcat(tmp2,tmp); } ! 677: ungetkey(useron.prot); ! 678: ch=(char)getkeys(tmp2,0); ! 679: if(ch=='Q' || sys_status&SS_ABORT || !online) { ! 680: for(i=0;i<cfg.total_subs;i++) ! 681: subscan[i].ptr=sav_ptr[i]; /* re-load saved pointers */ ! 682: last_ns_time=ns_time; ! 683: continue; } ! 684: for(i=0;i<cfg.total_prots;i++) ! 685: if(cfg.prot[i]->dlcmd[0] && cfg.prot[i]->mnemonic==ch ! 686: && chk_ar(cfg.prot[i]->ar,&useron)) ! 687: break; ! 688: if(i<cfg.total_prots) { ! 689: sprintf(str,"%s%s.qwk",cfg.temp_dir,cfg.sys_id); ! 690: sprintf(tmp2,"%s.qwk",cfg.sys_id); ! 691: padfname(tmp2,fd.name); ! 692: error=protocol(cfg.prot[i],XFER_DOWNLOAD,str,nulstr,false); ! 693: if(!checkprotresult(cfg.prot[i],error,&fd)) { ! 694: last_ns_time=ns_time; ! 695: for(i=0;i<cfg.total_subs;i++) ! 696: subscan[i].ptr=sav_ptr[i]; /* re-load saved pointers */ ! 697: } else { ! 698: qwk_success(msgcnt,0,0); ! 699: for(i=0;i<cfg.total_subs;i++) ! 700: sav_ptr[i]=subscan[i].ptr; ! 701: } ! 702: autohangup(); ! 703: } ! 704: else { /* if not valid protocol (hungup?) */ ! 705: for(i=0;i<cfg.total_subs;i++) ! 706: subscan[i].ptr=sav_ptr[i]; ! 707: last_ns_time=ns_time; ! 708: } ! 709: } ! 710: ! 711: else if(ch=='U') { /* Upload REP Packet */ ! 712: /* ! 713: if(useron.rest&FLAG('Q') && useron.rest&FLAG('P')) { ! 714: bputs(text[R_Post]); ! 715: continue; } ! 716: */ ! 717: ! 718: delfiles(cfg.temp_dir,ALLFILES); ! 719: bprintf(text[UploadingREP],cfg.sys_id); ! 720: for(k=0;k<cfg.total_fextrs;k++) ! 721: if(!stricmp(cfg.fextr[k]->ext,useron.tmpext) ! 722: && chk_ar(cfg.fextr[k]->ar,&useron)) ! 723: break; ! 724: if(k>=cfg.total_fextrs) { ! 725: bputs(text[QWKExtractionFailed]); ! 726: errorlog("Couldn't extract REP packet - configuration error"); ! 727: continue; } ! 728: ! 729: #if 0 /* no such thing as local logon */ ! 730: if(online==ON_LOCAL) { /* Local upload of rep packet */ ! 731: bputs(text[EnterPath]); ! 732: if(!getstr(str,60,K_LINE|K_UPPER)) ! 733: continue; ! 734: backslashcolon(str); ! 735: sprintf(tmp,"%s.rep",cfg.sys_id); ! 736: strcat(str,tmp); ! 737: sprintf(tmp,"%s%s.rep",cfg.temp_dir,cfg.sys_id); ! 738: if(!mv(str,tmp,0)) ! 739: unpack_rep(); ! 740: delfiles(cfg.temp_dir,ALLFILES); ! 741: continue; } ! 742: #endif ! 743: ! 744: /******************/ ! 745: /* Receive Packet */ ! 746: /******************/ ! 747: xfer_prot_menu(XFER_UPLOAD); ! 748: mnemonics(text[ProtocolOrQuit]); ! 749: strcpy(tmp2,"Q"); ! 750: for(i=0;i<cfg.total_prots;i++) ! 751: if(cfg.prot[i]->ulcmd[0] && chk_ar(cfg.prot[i]->ar,&useron)) { ! 752: sprintf(tmp,"%c",cfg.prot[i]->mnemonic); ! 753: strcat(tmp2,tmp); } ! 754: ch=(char)getkeys(tmp2,0); ! 755: if(ch=='Q' || sys_status&SS_ABORT || !online) ! 756: continue; ! 757: for(i=0;i<cfg.total_prots;i++) ! 758: if(cfg.prot[i]->ulcmd[0] && cfg.prot[i]->mnemonic==ch ! 759: && chk_ar(cfg.prot[i]->ar,&useron)) ! 760: break; ! 761: if(i>=cfg.total_prots) /* This shouldn't happen */ ! 762: continue; ! 763: sprintf(str,"%s%s.rep",cfg.temp_dir,cfg.sys_id); ! 764: protocol(cfg.prot[i],XFER_UPLOAD,str,nulstr,true); ! 765: unpack_rep(); ! 766: delfiles(cfg.temp_dir,ALLFILES); ! 767: //autohangup(); ! 768: } } ! 769: delfiles(cfg.temp_dir,ALLFILES); ! 770: free(sav_ptr); ! 771: } ! 772: ! 773: void sbbs_t::qwksetptr(uint subnum, char *buf, int reset) ! 774: { ! 775: long l; ! 776: ulong last; ! 777: ! 778: if(buf[2]=='/' && buf[5]=='/') { /* date specified */ ! 779: l=dstrtounix(&cfg,buf); ! 780: subscan[subnum].ptr=getmsgnum(subnum,l); ! 781: return; } ! 782: l=atol(buf); ! 783: if(l>=0) /* ptr specified */ ! 784: subscan[subnum].ptr=l; ! 785: else if(l) { /* relative ptr specified */ ! 786: getlastmsg(subnum,&last,0); ! 787: if(-l>(long)last) ! 788: subscan[subnum].ptr=0; ! 789: else ! 790: subscan[subnum].ptr=last+l; } ! 791: else if(reset) ! 792: getlastmsg(subnum,&(subscan[subnum].ptr),0); ! 793: } ! 794: ! 795: ! 796: /****************************************************************************/ ! 797: /* Process a QWK Config line */ ! 798: /****************************************************************************/ ! 799: void sbbs_t::qwkcfgline(char *buf,uint subnum) ! 800: { ! 801: char str[128]; ! 802: char tmp[512]; ! 803: uint x,y; ! 804: long l; ! 805: ulong qwk=useron.qwk; ! 806: file_t f; ! 807: ! 808: sprintf(str,"%.25s",buf); ! 809: strupr(str); ! 810: bprintf("\1n\r\n\1b\1hQWK Control [\1c%s\1b]: \1g%s\r\n" ! 811: ,subnum==INVALID_SUB ? "Mail":cfg.sub[subnum]->qwkname,str); ! 812: ! 813: if(subnum!=INVALID_SUB) { /* Only valid in sub-boards */ ! 814: ! 815: if(!strncmp(str,"DROP ",5)) { /* Drop from new-scan */ ! 816: l=atol(str+5); ! 817: if(!l) ! 818: subscan[subnum].cfg&=~SUB_CFG_NSCAN; ! 819: else { ! 820: x=l/1000; ! 821: y=l-(x*1000); ! 822: if(x>=usrgrps || y>=usrsubs[x]) { ! 823: bprintf(text[QWKInvalidConferenceN],l); ! 824: sprintf(str,"Invalid conference number %lu",l); ! 825: logline("Q!",str); } ! 826: else ! 827: subscan[usrsub[x][y]].cfg&=~SUB_CFG_NSCAN; } ! 828: return; } ! 829: ! 830: if(!strncmp(str,"ADD YOURS ",10)) { /* Add to new-scan */ ! 831: subscan[subnum].cfg|=(SUB_CFG_NSCAN|SUB_CFG_YSCAN); ! 832: qwksetptr(subnum,str+10,0); ! 833: return; } ! 834: ! 835: else if(!strncmp(str,"YOURS ",6)) { ! 836: subscan[subnum].cfg|=(SUB_CFG_NSCAN|SUB_CFG_YSCAN); ! 837: qwksetptr(subnum,str+6,0); ! 838: return; } ! 839: ! 840: else if(!strncmp(str,"ADD ",4)) { /* Add to new-scan */ ! 841: subscan[subnum].cfg|=SUB_CFG_NSCAN; ! 842: subscan[subnum].cfg&=~SUB_CFG_YSCAN; ! 843: qwksetptr(subnum,str+4,0); ! 844: return; } ! 845: ! 846: if(!strncmp(str,"RESET ",6)) { /* set msgptr */ ! 847: qwksetptr(subnum,str+6,1); ! 848: return; } ! 849: ! 850: if(!strncmp(str,"SUBPTR ",7)) { ! 851: qwksetptr(subnum,str+7,1); ! 852: return; } ! 853: } ! 854: ! 855: if(!strncmp(str,"RESETALL ",9)) { /* set all ptrs */ ! 856: for(x=y=0;x<usrgrps;x++) ! 857: for(y=0;y<usrsubs[x];y++) ! 858: if(subscan[usrsub[x][y]].cfg&SUB_CFG_NSCAN) ! 859: qwksetptr(usrsub[x][y],str+9,1); } ! 860: ! 861: else if(!strncmp(str,"ALLPTR ",7)) { /* set all ptrs */ ! 862: for(x=y=0;x<usrgrps;x++) ! 863: for(y=0;y<usrsubs[x];y++) ! 864: if(subscan[usrsub[x][y]].cfg&SUB_CFG_NSCAN) ! 865: qwksetptr(usrsub[x][y],str+7,1); } ! 866: ! 867: else if(!strncmp(str,"FILES ",6)) { /* files list */ ! 868: if(!strncmp(str+6,"ON ",3)) ! 869: useron.qwk|=QWK_FILES; ! 870: else if(str[8]=='/' && str[11]=='/') { /* set scan date */ ! 871: useron.qwk|=QWK_FILES; ! 872: ns_time=dstrtounix(&cfg,str+6); } ! 873: else ! 874: useron.qwk&=~QWK_FILES; } ! 875: ! 876: else if(!strncmp(str,"OWN ",4)) { /* message from you */ ! 877: if(!strncmp(str+4,"ON ",3)) ! 878: useron.qwk|=QWK_BYSELF; ! 879: else ! 880: useron.qwk&=~QWK_BYSELF; ! 881: return; } ! 882: ! 883: else if(!strncmp(str,"NDX ",4)) { /* include indexes */ ! 884: if(!strncmp(str+4,"OFF ",4)) ! 885: useron.qwk|=QWK_NOINDEX; ! 886: else ! 887: useron.qwk&=~QWK_NOINDEX; } ! 888: ! 889: else if(!strncmp(str,"CONTROL ",8)) { /* exclude ctrl files */ ! 890: if(!strncmp(str+8,"OFF ",4)) ! 891: useron.qwk|=QWK_NOCTRL; ! 892: else ! 893: useron.qwk&=~QWK_NOCTRL; } ! 894: ! 895: else if(!strncmp(str,"VIA ",4)) { /* include @VIA: */ ! 896: if(!strncmp(str+4,"ON ",3)) ! 897: useron.qwk|=QWK_VIA; ! 898: else ! 899: useron.qwk&=~QWK_VIA; } ! 900: ! 901: else if(!strncmp(str,"MSGID ",6)) { /* include @MSGID: */ ! 902: if(!strncmp(str+6,"ON ",3)) ! 903: useron.qwk|=QWK_MSGID; ! 904: else ! 905: useron.qwk&=~QWK_MSGID; } ! 906: ! 907: else if(!strncmp(str,"TZ ",3)) { /* include @TZ: */ ! 908: if(!strncmp(str+3,"ON ",3)) ! 909: useron.qwk|=QWK_TZ; ! 910: else ! 911: useron.qwk&=~QWK_TZ; } ! 912: ! 913: else if(!strncmp(str,"ATTACH ",7)) { /* file attachments */ ! 914: if(!strncmp(str+7,"ON ",3)) ! 915: useron.qwk|=QWK_ATTACH; ! 916: else ! 917: useron.qwk&=~QWK_ATTACH; } ! 918: ! 919: else if(!strncmp(str,"DELMAIL ",8)) { /* delete mail */ ! 920: if(!strncmp(str+8,"ON ",3)) ! 921: useron.qwk|=QWK_DELMAIL; ! 922: else ! 923: useron.qwk&=~QWK_DELMAIL; } ! 924: ! 925: else if(!strncmp(str,"CTRL-A ",7)) { /* Ctrl-a codes */ ! 926: if(!strncmp(str+7,"KEEP ",5)) { ! 927: useron.qwk|=QWK_RETCTLA; ! 928: useron.qwk&=~QWK_EXPCTLA; } ! 929: else if(!strncmp(str+7,"EXPAND ",7)) { ! 930: useron.qwk|=QWK_EXPCTLA; ! 931: useron.qwk&=~QWK_RETCTLA; } ! 932: else ! 933: useron.qwk&=~(QWK_EXPCTLA|QWK_RETCTLA); } ! 934: ! 935: else if(!strncmp(str,"MAIL ",5)) { /* include e-mail */ ! 936: if(!strncmp(str+5,"ALL ",4)) { ! 937: useron.qwk|=QWK_ALLMAIL; ! 938: useron.qwk&=~QWK_EMAIL; } ! 939: else if(!strncmp(str+5,"ON ",3)) { ! 940: useron.qwk|=QWK_EMAIL; ! 941: useron.qwk&=~QWK_ALLMAIL; } ! 942: else ! 943: useron.qwk&=~(QWK_ALLMAIL|QWK_EMAIL); } ! 944: ! 945: else if(!strncmp(str,"FREQ ",5)) { /* file request */ ! 946: padfname(str+5,f.name); ! 947: for(x=y=0;x<usrlibs;x++) { ! 948: for(y=0;y<usrdirs[x];y++) ! 949: if(findfile(&cfg,usrdir[x][y],f.name)) ! 950: break; ! 951: if(y<usrdirs[x]) ! 952: break; } ! 953: if(x>=usrlibs) { ! 954: bprintf("\r\n%s",f.name); ! 955: bputs(text[FileNotFound]); } ! 956: else { ! 957: f.dir=usrdir[x][y]; ! 958: getfileixb(&cfg,&f); ! 959: f.size=0; ! 960: getfiledat(&cfg,&f); ! 961: if(f.size==-1L) ! 962: bprintf(text[FileIsNotOnline],f.name); ! 963: else ! 964: addtobatdl(&f); } } ! 965: ! 966: else { ! 967: attr(cfg.color[clr_err]); ! 968: bputs("Unrecognized Control Command!\1n\r\n"); ! 969: } ! 970: ! 971: if(qwk!=useron.qwk) ! 972: putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,tmp,16)); ! 973: } ! 974: ! 975: ! 976: int sbbs_t::set_qwk_flag(ulong flag) ! 977: { ! 978: int i; ! 979: char str[32]; ! 980: ! 981: if((i=getuserrec(&cfg,useron.number,U_QWK,8,str))!=0) ! 982: return(i); ! 983: useron.qwk=ahtoul(str); ! 984: useron.qwk|=flag; ! 985: if((i=putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,str,16)))!=0) ! 986: return(i); ! 987: ! 988: return(0); ! 989: } ! 990:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.