|
|
1.1 ! root 1: #line 2 "SCFGMSG.C" ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: #include "scfg.h" ! 6: ! 7: /****************************************************************************/ ! 8: /* Converts when_t.zone into ASCII format */ ! 9: /****************************************************************************/ ! 10: char *zonestr(short zone) ! 11: { ! 12: static char str[32]; ! 13: ! 14: switch((ushort)zone) { ! 15: case 0: return("UT"); ! 16: case AST: return("AST"); ! 17: case EST: return("EST"); ! 18: case CST: return("CST"); ! 19: case MST: return("MST"); ! 20: case PST: return("PST"); ! 21: case YST: return("YST"); ! 22: case HST: return("HST"); ! 23: case BST: return("BST"); ! 24: case ADT: return("ADT"); ! 25: case EDT: return("EDT"); ! 26: case CDT: return("CDT"); ! 27: case MDT: return("MDT"); ! 28: case PDT: return("PDT"); ! 29: case YDT: return("YDT"); ! 30: case HDT: return("HDT"); ! 31: case BDT: return("BDT"); ! 32: case MID: return("MID"); ! 33: case VAN: return("VAN"); ! 34: case EDM: return("EDM"); ! 35: case WIN: return("WIN"); ! 36: case BOG: return("BOG"); ! 37: case CAR: return("CAR"); ! 38: case RIO: return("RIO"); ! 39: case FER: return("FER"); ! 40: case AZO: return("AZO"); ! 41: case LON: return("LON"); ! 42: case BER: return("BER"); ! 43: case ATH: return("ATH"); ! 44: case MOS: return("MOS"); ! 45: case DUB: return("DUB"); ! 46: case KAB: return("KAB"); ! 47: case KAR: return("KAR"); ! 48: case BOM: return("BOM"); ! 49: case KAT: return("KAT"); ! 50: case DHA: return("DHA"); ! 51: case BAN: return("BAN"); ! 52: case HON: return("HON"); ! 53: case TOK: return("TOK"); ! 54: case SYD: return("SYD"); ! 55: case NOU: return("NOU"); ! 56: case WEL: return("WEL"); ! 57: } ! 58: ! 59: sprintf(str,"%02hd:%02hu",zone/60,zone<0 ? (-zone)%60 : zone%60); ! 60: return(str); ! 61: } ! 62: ! 63: char *utos(char *str) ! 64: { ! 65: static char out[128]; ! 66: int i; ! 67: ! 68: for(i=0;str[i];i++) ! 69: if(str[i]=='_') ! 70: out[i]=SP; ! 71: else ! 72: out[i]=str[i]; ! 73: out[i]=0; ! 74: return(out); ! 75: } ! 76: ! 77: char *stou(char *str) ! 78: { ! 79: static char out[128]; ! 80: int i; ! 81: ! 82: for(i=0;str[i];i++) ! 83: if(str[i]==SP) ! 84: out[i]='_'; ! 85: else ! 86: out[i]=str[i]; ! 87: out[i]=0; ! 88: return(out); ! 89: } ! 90: ! 91: ! 92: ! 93: void clearptrs(int subnum) ! 94: { ! 95: char str[256]; ! 96: ushort idx,ch; ! 97: int last,file,i; ! 98: long l=0L; ! 99: struct ffblk ff; ! 100: ! 101: upop("Clearing Pointers..."); ! 102: sprintf(str,"%sUSER\\PTRS\\*.IXB",data_dir); ! 103: last=findfirst(str,&ff,0); ! 104: while(!last) { ! 105: if(ff.ff_fsize>=((long)sub[subnum]->ptridx+1L)*10L) { ! 106: sprintf(str,"%sUSER\\PTRS\\%s",data_dir,ff.ff_name); ! 107: if((file=nopen(str,O_WRONLY))==-1) { ! 108: errormsg(WHERE,ERR_OPEN,str,O_WRONLY); ! 109: bail(1); } ! 110: while(filelength(file)<(long)(sub[subnum]->ptridx)*10) { ! 111: lseek(file,0L,SEEK_END); ! 112: idx=tell(file)/10; ! 113: for(i=0;i<total_subs;i++) ! 114: if(sub[i]->ptridx==idx) ! 115: break; ! 116: write(file,&l,4); ! 117: write(file,&l,4); ! 118: ch=0xff; /* default to scan ON for unknown sub */ ! 119: if(i<total_subs) { ! 120: if(!(sub[i]->misc&SUB_NSDEF)) ! 121: ch&=~5; ! 122: if(!(sub[i]->misc&SUB_SSDEF)) ! 123: ch&=~2; } ! 124: write(file,&ch,2); } ! 125: lseek(file,((long)sub[subnum]->ptridx)*10L,SEEK_SET); ! 126: write(file,&l,4); /* date set to null */ ! 127: write(file,&l,4); /* date set to null */ ! 128: ch=0xff; ! 129: if(!(sub[subnum]->misc&SUB_NSDEF)) ! 130: ch&=~5; ! 131: if(!(sub[subnum]->misc&SUB_SSDEF)) ! 132: ch&=~2; ! 133: write(file,&ch,2); ! 134: close(file); } ! 135: last=findnext(&ff); } ! 136: upop(0); ! 137: } ! 138: ! 139: void msgs_cfg() ! 140: { ! 141: static int dflt,msgs_dflt,bar; ! 142: char str[256],str2[256],done=0,*p; ! 143: int j,k,q,s; ! 144: int i,file,ptridx,n; ! 145: long ported; ! 146: sub_t tmpsub; ! 147: static grp_t savgrp; ! 148: FILE *stream; ! 149: ! 150: while(1) { ! 151: for(i=0;i<total_grps && i<MAX_OPTS;i++) ! 152: sprintf(opt[i],"%-25s",grp[i]->lname); ! 153: opt[i][0]=0; ! 154: j=WIN_ORG|WIN_ACT|WIN_CHE; ! 155: if(total_grps) ! 156: j|=WIN_DEL|WIN_DELACT|WIN_GET; ! 157: if(total_grps<MAX_OPTS) ! 158: j|=WIN_INS|WIN_INSACT|WIN_XTR; ! 159: if(savgrp.sname[0]) ! 160: j|=WIN_PUT; ! 161: SETHELP(WHERE); ! 162: /* ! 163: &Message Groups:& ! 164: ! 165: This is a listing of message groups for your BBS. Message groups are ! 166: used to logically separate your message &sub-boards& into groups. Every ! 167: sub-board belongs to a message group. You must have at least one message ! 168: group and one sub-board configured. ! 169: ! 170: One popular use for message groups is to separate local sub-boards and ! 171: networked sub-boards. One might have a &Local& message group that contains ! 172: non-networked sub-boards of various topics and also have a &FidoNet& ! 173: message group that contains sub-boards that are echoed across FidoNet. ! 174: Some sysops separate sub-boards into more specific areas such as &Main&, ! 175: &Technical&, or &Adult&. If you have many sub-boards that have a common ! 176: subject denominator, you may want to have a separate message group for ! 177: those sub-boards for a more organized message structure. ! 178: */ ! 179: i=ulist(j,0,0,45,&msgs_dflt,&bar,"Message Groups",opt); ! 180: savnum=0; ! 181: if(i==-1) { ! 182: j=save_changes(WIN_MID); ! 183: if(j==-1) ! 184: continue; ! 185: if(!j) ! 186: write_msgs_cfg(); ! 187: return; } ! 188: if((i&MSK_ON)==MSK_INS) { ! 189: i&=MSK_OFF; ! 190: SETHELP(WHERE); ! 191: /* ! 192: &Group Long Name:& ! 193: ! 194: This is a description of the message group which is displayed when a ! 195: user of the system uses the &/*& command from the main menu. ! 196: */*/ ! 197: strcpy(str,"Main"); ! 198: if(uinput(WIN_MID|WIN_SAV,0,0,"Group Long Name",str,LEN_GLNAME ! 199: ,K_EDIT)<1) ! 200: continue; ! 201: SETHELP(WHERE); ! 202: /* ! 203: &Group Short Name:& ! 204: ! 205: This is a short description of the message group which is used for the ! 206: main menu and reading message prompts. ! 207: */ ! 208: sprintf(str2,"%.*s",LEN_GSNAME,str); ! 209: if(uinput(WIN_MID,0,0,"Group Short Name",str2,LEN_GSNAME,K_EDIT)<1) ! 210: continue; ! 211: if((grp=(grp_t **)REALLOC(grp,sizeof(grp_t *)*(total_grps+1)))==NULL) { ! 212: errormsg(WHERE,ERR_ALLOC,nulstr,total_grps+1); ! 213: total_grps=0; ! 214: bail(1); ! 215: continue; } ! 216: ! 217: if(total_grps) { /* was total_subs (?) */ ! 218: for(j=total_grps;j>i;j--) /* insert above */ ! 219: grp[j]=grp[j-1]; ! 220: for(j=0;j<total_subs;j++) /* move sub group numbers */ ! 221: if(sub[j]->grp>=i) ! 222: sub[j]->grp++; } ! 223: ! 224: if((grp[i]=(grp_t *)MALLOC(sizeof(grp_t)))==NULL) { ! 225: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(grp_t)); ! 226: continue; } ! 227: memset((grp_t *)grp[i],0,sizeof(grp_t)); ! 228: strcpy(grp[i]->lname,str); ! 229: strcpy(grp[i]->sname,str2); ! 230: total_grps++; ! 231: changes=1; ! 232: continue; } ! 233: if((i&MSK_ON)==MSK_DEL) { ! 234: i&=MSK_OFF; ! 235: SETHELP(WHERE); ! 236: /* ! 237: &Delete All Data in Group:& ! 238: ! 239: If you wish to delete the messages in all the sub-boards in this group, ! 240: select &Yes&. ! 241: */ ! 242: j=1; ! 243: strcpy(opt[0],"Yes"); ! 244: strcpy(opt[1],"No"); ! 245: opt[2][0]=0; ! 246: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0,"Delete All Data in Group",opt); ! 247: if(j==-1) ! 248: continue; ! 249: if(j==0) ! 250: for(j=0;j<total_subs;j++) ! 251: if(sub[j]->grp==i) { ! 252: sprintf(str,"%s.s*",sub[j]->code); ! 253: if(!sub[j]->data_dir[0]) ! 254: sprintf(tmp,"%sSUBS\\",data_dir); ! 255: else ! 256: strcpy(tmp,sub[j]->data_dir); ! 257: delfiles(tmp,str); ! 258: clearptrs(j); } ! 259: FREE(grp[i]); ! 260: for(j=0;j<total_subs;) { ! 261: if(sub[j]->grp==i) { /* delete subs of this group */ ! 262: FREE(sub[j]); ! 263: total_subs--; ! 264: k=j; ! 265: while(k<total_subs) { /* move all subs down */ ! 266: sub[k]=sub[k+1]; ! 267: for(q=0;q<total_qhubs;q++) ! 268: for(s=0;s<qhub[q]->subs;s++) ! 269: if(qhub[q]->sub[s]==k) ! 270: qhub[q]->sub[s]--; ! 271: k++; } } ! 272: else j++; } ! 273: for(j=0;j<total_subs;j++) /* move sub group numbers down */ ! 274: if(sub[j]->grp>i) ! 275: sub[j]->grp--; ! 276: total_grps--; ! 277: while(i<total_grps) { ! 278: grp[i]=grp[i+1]; ! 279: i++; } ! 280: changes=1; ! 281: continue; } ! 282: if((i&MSK_ON)==MSK_GET) { ! 283: i&=MSK_OFF; ! 284: savgrp=*grp[i]; ! 285: continue; } ! 286: if((i&MSK_ON)==MSK_PUT) { ! 287: i&=MSK_OFF; ! 288: *grp[i]=savgrp; ! 289: changes=1; ! 290: continue; } ! 291: done=0; ! 292: while(!done) { ! 293: j=0; ! 294: sprintf(opt[j++],"%-27.27s%s","Long Name",grp[i]->lname); ! 295: sprintf(opt[j++],"%-27.27s%s","Short Name",grp[i]->sname); ! 296: sprintf(opt[j++],"%-27.27s%.40s","Access Requirements" ! 297: ,grp[i]->ar); ! 298: strcpy(opt[j++],"Clone Options"); ! 299: strcpy(opt[j++],"Export Areas..."); ! 300: strcpy(opt[j++],"Import Areas..."); ! 301: strcpy(opt[j++],"Message Sub-boards..."); ! 302: opt[j][0]=0; ! 303: sprintf(str,"%s Group",grp[i]->sname); ! 304: savnum=0; ! 305: SETHELP(WHERE); ! 306: /* ! 307: &Message Group Configuration:& ! 308: ! 309: This menu allows you to configure the security requirements for access ! 310: to this message group. You can also add, delete, and configure the ! 311: sub-boards of this group by selecting the &Messages Sub-boards...& option. ! 312: */ ! 313: switch(ulist(WIN_ACT,6,4,60,&dflt,0,str,opt)) { ! 314: case -1: ! 315: done=1; ! 316: break; ! 317: case 0: ! 318: SETHELP(WHERE); ! 319: /* ! 320: &Group Long Name:& ! 321: ! 322: This is a description of the message group which is displayed when a ! 323: user of the system uses the &/*& command from the main menu. ! 324: */*/ ! 325: strcpy(str,grp[i]->lname); /* save incase setting to null */ ! 326: if(!uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Listings" ! 327: ,grp[i]->lname,LEN_GLNAME,K_EDIT)) ! 328: strcpy(grp[i]->lname,str); ! 329: break; ! 330: case 1: ! 331: SETHELP(WHERE); ! 332: /* ! 333: &Group Short Name:& ! 334: ! 335: This is a short description of the message group which is used for ! 336: main menu and reading messages prompts. ! 337: */ ! 338: uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts" ! 339: ,grp[i]->sname,LEN_GSNAME,K_EDIT); ! 340: break; ! 341: case 2: ! 342: sprintf(str,"%s Group",grp[i]->sname); ! 343: getar(str,grp[i]->ar); ! 344: break; ! 345: case 3: /* Clone Options */ ! 346: j=0; ! 347: strcpy(opt[0],"Yes"); ! 348: strcpy(opt[1],"No"); ! 349: opt[2][0]=0; ! 350: SETHELP(WHERE); ! 351: /* ! 352: &Clone Sub-board Options:& ! 353: ! 354: If you want to clone the options of the first sub-board of this group ! 355: into all sub-boards of this group, select &Yes&. ! 356: ! 357: The options cloned are posting requirements, reading requirements, ! 358: operator requirments, moderated user requirments, toggle options, ! 359: network options (including EchoMail origin line, EchoMail address, ! 360: and QWK Network tagline), maximum number of messages, maximum number ! 361: of CRCs, maximum age of messages, storage method, and data directory. ! 362: */ ! 363: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 364: ,"Clone Options of First Sub-board into All of Group",opt); ! 365: if(j==0) { ! 366: k=-1; ! 367: for(j=0;j<total_subs;j++) ! 368: if(sub[j]->grp==i) { ! 369: if(k==-1) ! 370: k=j; ! 371: else { ! 372: changes=1; ! 373: sub[j]->misc=(sub[k]->misc|SUB_HDRMOD); ! 374: strcpy(sub[j]->post_ar,sub[k]->post_ar); ! 375: strcpy(sub[j]->read_ar,sub[k]->read_ar); ! 376: strcpy(sub[j]->op_ar,sub[k]->op_ar); ! 377: strcpy(sub[j]->mod_ar,sub[k]->mod_ar); ! 378: strcpy(sub[j]->origline,sub[k]->origline); ! 379: strcpy(sub[j]->tagline,sub[k]->tagline); ! 380: strcpy(sub[j]->data_dir,sub[k]->data_dir); ! 381: strcpy(sub[j]->echomail_sem ! 382: ,sub[k]->echomail_sem); ! 383: sub[j]->maxmsgs=sub[k]->maxmsgs; ! 384: sub[j]->maxcrcs=sub[k]->maxcrcs; ! 385: sub[j]->maxage=sub[k]->maxage; ! 386: ! 387: sub[j]->faddr=sub[k]->faddr; } } } ! 388: break; ! 389: case 4: ! 390: k=0; ! 391: ported=0; ! 392: q=changes; ! 393: strcpy(opt[k++],"SUBS.TXT (Synchronet)"); ! 394: strcpy(opt[k++],"AREAS.BBS (MSG)"); ! 395: strcpy(opt[k++],"AREAS.BBS (SMB)"); ! 396: strcpy(opt[k++],"AREAS.BBS (SBBSECHO)"); ! 397: strcpy(opt[k++],"FIDONET.NA (Fido)"); ! 398: opt[k][0]=0; ! 399: SETHELP(WHERE); ! 400: /* ! 401: &Export Area File Format:& ! 402: ! 403: This menu allows you to choose the format of the area file you wish to ! 404: export the current message group into. ! 405: */ ! 406: k=0; ! 407: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 ! 408: ,"Export Area File Format",opt); ! 409: if(k==-1) ! 410: break; ! 411: if(k==0) ! 412: sprintf(str,"%sSUBS.TXT",ctrl_dir); ! 413: else if(k==1 || k==2) ! 414: sprintf(str,"AREAS.BBS"); ! 415: else if(k==3) ! 416: sprintf(str,"%sAREAS.BBS",data_dir); ! 417: else if(k==4) ! 418: sprintf(str,"FIDONET.NA"); ! 419: strupr(str); ! 420: if(k && k<4) ! 421: if(uinput(WIN_MID|WIN_SAV,0,0,"Uplinks" ! 422: ,str2,40,K_UPPER)<=0) { ! 423: changes=q; ! 424: break; } ! 425: if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" ! 426: ,str,40,K_UPPER|K_EDIT)<=0) { ! 427: changes=q; ! 428: break; } ! 429: if(fexist(str)) { ! 430: strcpy(opt[0],"Overwrite"); ! 431: strcpy(opt[1],"Append"); ! 432: opt[2][0]=0; ! 433: j=0; ! 434: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 435: ,"File Exists",opt); ! 436: if(j==-1) ! 437: break; ! 438: if(j==0) j=O_WRONLY|O_TRUNC; ! 439: else j=O_WRONLY|O_APPEND; } ! 440: else ! 441: j=O_WRONLY|O_CREAT; ! 442: if((stream=fnopen(&file,str,j))==NULL) { ! 443: umsg("Open Failure"); ! 444: break; } ! 445: upop("Exporting Areas..."); ! 446: for(j=0;j<total_subs;j++) { ! 447: if(sub[j]->grp!=i) ! 448: continue; ! 449: ported++; ! 450: if(k==1) { /* AREAS.BBS *.MSG */ ! 451: if(!sub[j]->echopath[0]) ! 452: sprintf(str,"%s%s\\",echomail_dir,sub[j]->code); ! 453: else ! 454: strcpy(str,sub[j]->echopath); ! 455: fprintf(stream,"%-30s %-20s %s\r\n" ! 456: ,str,stou(sub[j]->sname),str2); ! 457: continue; } ! 458: if(k==2) { /* AREAS.BBS SMB */ ! 459: if(!sub[j]->data_dir[0]) ! 460: sprintf(str,"%sSUBS\\%s",data_dir,sub[j]->code); ! 461: else ! 462: sprintf(str,"%s%s",sub[j]->data_dir,sub[j]->code); ! 463: fprintf(stream,"%-30s %-20s %s\r\n" ! 464: ,str,stou(sub[j]->sname),str2); ! 465: continue; } ! 466: if(k==3) { /* AREAS.BBS SBBSECHO */ ! 467: fprintf(stream,"%-30s %-20s %s\r\n" ! 468: ,sub[j]->code,stou(sub[j]->sname),str2); ! 469: continue; } ! 470: if(k==4) { /* FIDONET.NA */ ! 471: fprintf(stream,"%-20s %s\r\n" ! 472: ,stou(sub[j]->sname),sub[j]->lname); ! 473: continue; } ! 474: fprintf(stream,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" ! 475: "%s\r\n%s\r\n%s\r\n" ! 476: ,sub[j]->lname ! 477: ,sub[j]->sname ! 478: ,sub[j]->qwkname ! 479: ,sub[j]->code ! 480: ,sub[j]->data_dir ! 481: ,sub[j]->ar ! 482: ,sub[j]->read_ar ! 483: ,sub[j]->post_ar ! 484: ,sub[j]->op_ar ! 485: ); ! 486: fprintf(stream,"%lX\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" ! 487: ,sub[j]->misc ! 488: ,sub[j]->tagline ! 489: ,sub[j]->origline ! 490: ,sub[j]->echomail_sem ! 491: ,sub[j]->echopath ! 492: ,faddrtoa(sub[j]->faddr) ! 493: ); ! 494: fprintf(stream,"%lu\r\n%lu\r\n%u\r\n%u\r\n%s\r\n" ! 495: ,sub[j]->maxmsgs ! 496: ,sub[j]->maxcrcs ! 497: ,sub[j]->maxage ! 498: ,sub[j]->ptridx ! 499: ,sub[j]->mod_ar ! 500: ); ! 501: fprintf(stream,"***END-OF-SUB***\r\n\r\n"); } ! 502: fclose(stream); ! 503: upop(0); ! 504: sprintf(str,"%lu Message Areas Exported Successfully",ported); ! 505: umsg(str); ! 506: changes=q; ! 507: break; ! 508: case 5: ! 509: ported=0; ! 510: k=0; ! 511: strcpy(opt[k++],"SUBS.TXT (Synchronet)"); ! 512: strcpy(opt[k++],"AREAS.BBS (MSG)"); ! 513: strcpy(opt[k++],"AREAS.BBS (SMB)"); ! 514: strcpy(opt[k++],"AREAS.BBS (SBBSECHO)"); ! 515: strcpy(opt[k++],"FIDONET.NA (Fido)"); ! 516: opt[k][0]=0; ! 517: SETHELP(WHERE); ! 518: /* ! 519: &Import Area File Format:& ! 520: ! 521: This menu allows you to choose the format of the area file you wish to ! 522: import into the current message group. ! 523: */ ! 524: k=0; ! 525: k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 ! 526: ,"Import Area File Format",opt); ! 527: if(k==-1) ! 528: break; ! 529: if(k==0) ! 530: sprintf(str,"%sSUBS.TXT",ctrl_dir); ! 531: else if(k==1 || k==2) ! 532: sprintf(str,"AREAS.BBS"); ! 533: else if(k==3) ! 534: sprintf(str,"%sAREAS.BBS",data_dir); ! 535: else if(k==4) ! 536: sprintf(str,"FIDONET.NA"); ! 537: strupr(str); ! 538: if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" ! 539: ,str,40,K_UPPER|K_EDIT)<=0) ! 540: break; ! 541: if((stream=fnopen(&file,str,O_RDONLY))==NULL) { ! 542: umsg("Open Failure"); ! 543: break; } ! 544: upop("Importing Areas..."); ! 545: while(!feof(stream)) { ! 546: if(!fgets(str,128,stream)) break; ! 547: truncsp(str); ! 548: if(!str[0]) ! 549: continue; ! 550: if(k) { ! 551: p=str; ! 552: while(*p && *p<=SP) p++; ! 553: if(!*p || *p==';') ! 554: continue; ! 555: memset(&tmpsub,0,sizeof(sub_t)); ! 556: tmpsub.misc|= ! 557: (SUB_FIDO|SUB_NAME|SUB_TOUSER|SUB_QUOTE|SUB_HYPER); ! 558: if(k==1) { /* AREAS.BBS *.MSG */ ! 559: p=strrchr(str,'\\'); ! 560: if(p) *p=0; ! 561: else p=str; ! 562: sprintf(tmpsub.echopath,"%.*s",LEN_DIR,str); ! 563: p++; ! 564: sprintf(tmpsub.code,"%.8s",p); ! 565: while(*p && *p<=SP) p++; ! 566: sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,p); ! 567: p=strchr(tmpsub.sname,SP); ! 568: if(p) *p=0; ! 569: strcpy(tmpsub.sname,utos(tmpsub.sname)); ! 570: sprintf(tmpsub.lname,"%.*s",LEN_SLNAME ! 571: ,tmpsub.sname); ! 572: sprintf(tmpsub.qwkname,"%.*s",10 ! 573: ,tmpsub.sname); ! 574: } ! 575: if(k==2) { /* AREAS.BBS SMB */ ! 576: p=strrchr(str,'\\'); ! 577: if(p) *p=0; ! 578: else p=str; ! 579: sprintf(tmpsub.data_dir,"%.*s",LEN_DIR,str); ! 580: p++; ! 581: sprintf(tmpsub.code,"%.8s",p); ! 582: while(*p && *p<=SP) p++; ! 583: sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,p); ! 584: p=strchr(tmpsub.sname,SP); ! 585: if(p) *p=0; ! 586: strcpy(tmpsub.sname,utos(tmpsub.sname)); ! 587: sprintf(tmpsub.lname,"%.*s",LEN_SLNAME ! 588: ,tmpsub.sname); ! 589: sprintf(tmpsub.qwkname,"%.*s",10 ! 590: ,tmpsub.sname); ! 591: } ! 592: else if(k==3) { /* AREAS.BBS SBBSECHO */ ! 593: p=str; ! 594: while(*p && *p>SP) p++; ! 595: *p=0; ! 596: sprintf(tmpsub.code,"%.8s",str); ! 597: p++; ! 598: while(*p && *p<=SP) p++; ! 599: sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,p); ! 600: p=strchr(tmpsub.sname,SP); ! 601: if(p) *p=0; ! 602: strcpy(tmpsub.sname,utos(tmpsub.sname)); ! 603: sprintf(tmpsub.lname,"%.*s",LEN_SLNAME ! 604: ,tmpsub.sname); ! 605: sprintf(tmpsub.qwkname,"%.*s",10 ! 606: ,tmpsub.sname); ! 607: } ! 608: else if(k==4) { /* FIDONET.NA */ ! 609: p=str; ! 610: while(*p && *p>SP) p++; ! 611: *p=0; ! 612: sprintf(tmpsub.code,"%.8s",str); ! 613: sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,utos(str)); ! 614: sprintf(tmpsub.qwkname,"%.10s",tmpsub.sname); ! 615: p++; ! 616: while(*p && *p<=SP) p++; ! 617: sprintf(tmpsub.lname,"%.*s",LEN_SLNAME,p); ! 618: } ! 619: ported++; } ! 620: else { ! 621: memset(&tmpsub,0,sizeof(sub_t)); ! 622: tmpsub.grp=i; ! 623: sprintf(tmpsub.lname,"%.*s",LEN_SLNAME,str); ! 624: if(!fgets(str,128,stream)) break; ! 625: truncsp(str); ! 626: sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,str); ! 627: if(!fgets(str,128,stream)) break; ! 628: truncsp(str); ! 629: sprintf(tmpsub.qwkname,"%.*s",10,str); ! 630: if(!fgets(str,128,stream)) break; ! 631: truncsp(str); ! 632: sprintf(tmpsub.code,"%.*s",8,str); ! 633: if(!fgets(str,128,stream)) break; ! 634: truncsp(str); ! 635: sprintf(tmpsub.data_dir,"%.*s",LEN_DIR,str); ! 636: if(!fgets(str,128,stream)) break; ! 637: truncsp(str); ! 638: sprintf(tmpsub.ar,"%.*s",LEN_ARSTR,str); ! 639: if(!fgets(str,128,stream)) break; ! 640: truncsp(str); ! 641: sprintf(tmpsub.read_ar,"%.*s",LEN_ARSTR,str); ! 642: if(!fgets(str,128,stream)) break; ! 643: truncsp(str); ! 644: sprintf(tmpsub.post_ar,"%.*s",LEN_ARSTR,str); ! 645: if(!fgets(str,128,stream)) break; ! 646: truncsp(str); ! 647: sprintf(tmpsub.op_ar,"%.*s",LEN_ARSTR,str); ! 648: if(!fgets(str,128,stream)) break; ! 649: truncsp(str); ! 650: tmpsub.misc=ahtoul(str); ! 651: if(!fgets(str,128,stream)) break; ! 652: truncsp(str); ! 653: sprintf(tmpsub.tagline,"%.*s",80,str); ! 654: if(!fgets(str,128,stream)) break; ! 655: truncsp(str); ! 656: sprintf(tmpsub.origline,"%.*s",50,str); ! 657: if(!fgets(str,128,stream)) break; ! 658: truncsp(str); ! 659: sprintf(tmpsub.echomail_sem,"%.*s",LEN_DIR,str); ! 660: if(!fgets(str,128,stream)) break; ! 661: truncsp(str); ! 662: sprintf(tmpsub.echopath,"%.*s",LEN_DIR,str); ! 663: if(!fgets(str,128,stream)) break; ! 664: truncsp(str); ! 665: tmpsub.faddr=atofaddr(str); ! 666: if(!fgets(str,128,stream)) break; ! 667: truncsp(str); ! 668: tmpsub.maxmsgs=atol(str); ! 669: if(!fgets(str,128,stream)) break; ! 670: truncsp(str); ! 671: tmpsub.maxcrcs=atol(str); ! 672: if(!fgets(str,128,stream)) break; ! 673: truncsp(str); ! 674: tmpsub.maxage=atoi(str); ! 675: if(!fgets(str,128,stream)) break; ! 676: truncsp(str); ! 677: tmpsub.ptridx=atoi(str); ! 678: if(!fgets(str,128,stream)) break; ! 679: truncsp(str); ! 680: sprintf(tmpsub.mod_ar,"%.*s",LEN_ARSTR,str); ! 681: ! 682: ported++; ! 683: while(!feof(stream) ! 684: && strcmp(str,"***END-OF-SUB***")) { ! 685: if(!fgets(str,128,stream)) break; ! 686: truncsp(str); } } ! 687: ! 688: truncsp(tmpsub.code); ! 689: truncsp(tmpsub.sname); ! 690: truncsp(tmpsub.lname); ! 691: truncsp(tmpsub.qwkname); ! 692: for(j=0;j<total_subs;j++) { ! 693: if(sub[j]->grp!=i) ! 694: continue; ! 695: if(!stricmp(sub[j]->code,tmpsub.code)) ! 696: break; } ! 697: if(j==total_subs) { ! 698: ! 699: if((sub=(sub_t **)REALLOC(sub ! 700: ,sizeof(sub_t *)*(total_subs+1)))==NULL) { ! 701: errormsg(WHERE,ERR_ALLOC,nulstr,total_subs+1); ! 702: total_subs=0; ! 703: bail(1); ! 704: break; } ! 705: ! 706: for(ptridx=0;ptridx>-1;ptridx++) { ! 707: for(n=0;n<total_subs;n++) ! 708: if(sub[n]->ptridx==ptridx) ! 709: break; ! 710: if(n==total_subs) ! 711: break; } ! 712: ! 713: if((sub[j]=(sub_t *)MALLOC(sizeof(sub_t))) ! 714: ==NULL) { ! 715: errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t)); ! 716: break; } ! 717: memset(sub[j],0,sizeof(sub_t)); } ! 718: if(!k) ! 719: memcpy(sub[j],&tmpsub,sizeof(sub_t)); ! 720: else { ! 721: sub[j]->grp=i; ! 722: if(total_faddrs) ! 723: sub[j]->faddr=faddr[0]; ! 724: strcpy(sub[j]->code,tmpsub.code); ! 725: strcpy(sub[j]->sname,tmpsub.sname); ! 726: strcpy(sub[j]->lname,tmpsub.lname); ! 727: strcpy(sub[j]->qwkname,tmpsub.qwkname); ! 728: strcpy(sub[j]->echopath,tmpsub.echopath); ! 729: strcpy(sub[j]->data_dir,tmpsub.data_dir); ! 730: if(j==total_subs) ! 731: sub[j]->maxmsgs=1000; ! 732: } ! 733: if(j==total_subs) { ! 734: sub[j]->ptridx=ptridx; ! 735: sub[j]->misc=tmpsub.misc; ! 736: total_subs++; } ! 737: changes=1; } ! 738: fclose(stream); ! 739: upop(0); ! 740: sprintf(str,"%lu Message Areas Imported Successfully",ported); ! 741: umsg(str); ! 742: break; ! 743: ! 744: case 6: ! 745: sub_cfg(i); ! 746: break; } } } ! 747: ! 748: } ! 749: ! 750: void msg_opts() ! 751: { ! 752: char str[128],*p; ! 753: static int msg_dflt; ! 754: int i,j; ! 755: ! 756: while(1) { ! 757: i=0; ! 758: sprintf(opt[i++],"%-33.33s%s" ! 759: ,"BBS ID for QWK Packets",sys_id); ! 760: sprintf(opt[i++],"%-33.33s%s" ! 761: ,"Local Time Zone",zonestr(sys_timezone)); ! 762: sprintf(opt[i++],"%-33.33s%u seconds" ! 763: ,"Maximum Retry Time",smb_retry_time); ! 764: if(max_qwkmsgs) ! 765: sprintf(str,"%lu",max_qwkmsgs); ! 766: else ! 767: sprintf(str,"Unlimited"); ! 768: sprintf(opt[i++],"%-33.33s%s" ! 769: ,"Maximum QWK Messages",str); ! 770: sprintf(opt[i++],"%-33.33s%s","Pre-pack QWK Requirements",preqwk_ar); ! 771: if(mail_maxage) ! 772: sprintf(str,"Enabled (%u days old)",mail_maxage); ! 773: else ! 774: strcpy(str,"Disabled"); ! 775: sprintf(opt[i++],"%-33.33s%s","Purge E-mail by Age",str); ! 776: if(sys_misc&SM_DELEMAIL) ! 777: strcpy(str,"Immediately"); ! 778: else ! 779: strcpy(str,"Daily"); ! 780: sprintf(opt[i++],"%-33.33s%s","Purge Deleted E-mail",str); ! 781: if(mail_maxcrcs) ! 782: sprintf(str,"Enabled (%lu mail CRCs)",mail_maxcrcs); ! 783: else ! 784: strcpy(str,"Disabled"); ! 785: sprintf(opt[i++],"%-33.33s%s","Duplicate E-mail Checking",str); ! 786: sprintf(opt[i++],"%-33.33s%s","Allow Anonymous E-mail" ! 787: ,sys_misc&SM_ANON_EM ? "Yes" : "No"); ! 788: sprintf(opt[i++],"%-33.33s%s","Allow Quoting in E-mail" ! 789: ,sys_misc&SM_QUOTE_EM ? "Yes" : "No"); ! 790: sprintf(opt[i++],"%-33.33s%s","Allow Uploads in E-mail" ! 791: ,sys_misc&SM_FILE_EM ? "Yes" : "No"); ! 792: sprintf(opt[i++],"%-33.33s%s","Allow Forwarding to NetMail" ! 793: ,sys_misc&SM_FWDTONET ? "Yes" : "No"); ! 794: sprintf(opt[i++],"%-33.33s%s","Kill Read E-mail" ! 795: ,sys_misc&SM_DELREADM ? "Yes" : "No"); ! 796: sprintf(opt[i++],"%-33.33s%s","Users Can View Deleted Messages" ! 797: ,sys_misc&SM_USRVDELM ? "Yes" : sys_misc&SM_SYSVDELM ! 798: ? "Sysops Only":"No"); ! 799: strcpy(opt[i++],"Extra Attribute Codes..."); ! 800: opt[i][0]=0; ! 801: savnum=0; ! 802: SETHELP(WHERE); ! 803: /* ! 804: &Message Options:& ! 805: ! 806: This is a menu of system-wide message related options. Messages include ! 807: E-mail and public posts (on sub-boards). ! 808: */ ! 809: ! 810: switch(ulist(WIN_ORG|WIN_ACT|WIN_MID|WIN_CHE,0,0,72,&msg_dflt,0 ! 811: ,"Message Options",opt)) { ! 812: case -1: ! 813: i=save_changes(WIN_MID); ! 814: if(i==-1) ! 815: continue; ! 816: if(!i) { ! 817: write_msgs_cfg(); ! 818: write_main_cfg(); } ! 819: return; ! 820: case 0: ! 821: strcpy(str,sys_id); ! 822: SETHELP(WHERE); ! 823: /* ! 824: &BBS ID for QWK Packets:& ! 825: ! 826: This is a short system ID for your BBS that is used for QWK packets. ! 827: It should be an abbreviation of your BBS name or other related string. ! 828: This ID will be used for your outgoing and incoming QWK packets. If ! 829: you plan on networking via QWK packets with another Synchronet BBS, ! 830: this ID should not begin with a number. The maximum length of the ID ! 831: is eight characters and cannot contain spaces or other invalid DOS ! 832: filename characters. In a QWK packet network, each system must have ! 833: a unique QWK system ID. ! 834: */ ! 835: ! 836: uinput(WIN_MID|WIN_SAV,0,0,"BBS ID for QWK Packets" ! 837: ,str,8,K_EDIT|K_UPPER); ! 838: if(code_ok(str)) ! 839: strcpy(sys_id,str); ! 840: else ! 841: umsg("Invalid ID"); ! 842: break; ! 843: case 1: ! 844: strcpy(opt[0],"Yes"); ! 845: strcpy(opt[1],"No"); ! 846: opt[2][0]=0; ! 847: i=0; ! 848: SETHELP(WHERE); ! 849: /* ! 850: &United States Time Zone:& ! 851: ! 852: If your local time zone is the United States, select &Yes&. ! 853: */ ! 854: ! 855: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 856: ,"United States Time Zone",opt); ! 857: if(i==-1) ! 858: break; ! 859: if(i==0) { ! 860: strcpy(opt[i++],"Atlantic"); ! 861: strcpy(opt[i++],"Eastern"); ! 862: strcpy(opt[i++],"Central"); ! 863: strcpy(opt[i++],"Mountain"); ! 864: strcpy(opt[i++],"Pacific"); ! 865: strcpy(opt[i++],"Yukon"); ! 866: strcpy(opt[i++],"Hawaii/Alaska"); ! 867: strcpy(opt[i++],"Bering"); ! 868: opt[i][0]=0; ! 869: i=0; ! 870: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 871: ,"Time Zone",opt); ! 872: if(i==-1) ! 873: break; ! 874: changes=1; ! 875: switch(i) { ! 876: case 0: ! 877: sys_timezone=AST; ! 878: break; ! 879: case 1: ! 880: sys_timezone=EST; ! 881: break; ! 882: case 2: ! 883: sys_timezone=CST; ! 884: break; ! 885: case 3: ! 886: sys_timezone=MST; ! 887: break; ! 888: case 4: ! 889: sys_timezone=PST; ! 890: break; ! 891: case 5: ! 892: sys_timezone=YST; ! 893: break; ! 894: case 6: ! 895: sys_timezone=HST; ! 896: break; ! 897: case 7: ! 898: sys_timezone=BST; ! 899: break; } ! 900: strcpy(opt[0],"Yes"); ! 901: strcpy(opt[1],"No"); ! 902: opt[2][0]=0; ! 903: i=1; ! 904: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 905: ,"Daylight Savings",opt); ! 906: if(i==-1) ! 907: break; ! 908: if(!i) ! 909: sys_timezone|=DAYLIGHT; ! 910: break; } ! 911: i=0; ! 912: strcpy(opt[i++],"Midway"); ! 913: strcpy(opt[i++],"Vancouver"); ! 914: strcpy(opt[i++],"Edmonton"); ! 915: strcpy(opt[i++],"Winnipeg"); ! 916: strcpy(opt[i++],"Bogota"); ! 917: strcpy(opt[i++],"Caracas"); ! 918: strcpy(opt[i++],"Rio de Janeiro"); ! 919: strcpy(opt[i++],"Fernando de Noronha"); ! 920: strcpy(opt[i++],"Azores"); ! 921: strcpy(opt[i++],"London"); ! 922: strcpy(opt[i++],"Berlin"); ! 923: strcpy(opt[i++],"Athens"); ! 924: strcpy(opt[i++],"Moscow"); ! 925: strcpy(opt[i++],"Dubai"); ! 926: strcpy(opt[i++],"Kabul"); ! 927: strcpy(opt[i++],"Karachi"); ! 928: strcpy(opt[i++],"Bombay"); ! 929: strcpy(opt[i++],"Kathmandu"); ! 930: strcpy(opt[i++],"Dhaka"); ! 931: strcpy(opt[i++],"Bangkok"); ! 932: strcpy(opt[i++],"Hong Kong"); ! 933: strcpy(opt[i++],"Tokyo"); ! 934: strcpy(opt[i++],"Sydney"); ! 935: strcpy(opt[i++],"Noumea"); ! 936: strcpy(opt[i++],"Wellington"); ! 937: strcpy(opt[i++],"Other..."); ! 938: opt[i][0]=0; ! 939: i=0; ! 940: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 941: ,"Time Zone",opt); ! 942: if(i==-1) ! 943: break; ! 944: changes=1; ! 945: switch(i) { ! 946: case 0: ! 947: sys_timezone=MID; ! 948: break; ! 949: case 1: ! 950: sys_timezone=VAN; ! 951: break; ! 952: case 2: ! 953: sys_timezone=EDM; ! 954: break; ! 955: case 3: ! 956: sys_timezone=WIN; ! 957: break; ! 958: case 4: ! 959: sys_timezone=BOG; ! 960: break; ! 961: case 5: ! 962: sys_timezone=CAR; ! 963: break; ! 964: case 6: ! 965: sys_timezone=RIO; ! 966: break; ! 967: case 7: ! 968: sys_timezone=FER; ! 969: break; ! 970: case 8: ! 971: sys_timezone=AZO; ! 972: break; ! 973: case 9: ! 974: sys_timezone=LON; ! 975: break; ! 976: case 10: ! 977: sys_timezone=BER; ! 978: break; ! 979: case 11: ! 980: sys_timezone=ATH; ! 981: break; ! 982: case 12: ! 983: sys_timezone=MOS; ! 984: break; ! 985: case 13: ! 986: sys_timezone=DUB; ! 987: break; ! 988: case 14: ! 989: sys_timezone=KAB; ! 990: break; ! 991: case 15: ! 992: sys_timezone=KAR; ! 993: break; ! 994: case 16: ! 995: sys_timezone=BOM; ! 996: break; ! 997: case 17: ! 998: sys_timezone=KAT; ! 999: break; ! 1000: case 18: ! 1001: sys_timezone=DHA; ! 1002: break; ! 1003: case 19: ! 1004: sys_timezone=BAN; ! 1005: break; ! 1006: case 20: ! 1007: sys_timezone=HON; ! 1008: break; ! 1009: case 21: ! 1010: sys_timezone=TOK; ! 1011: break; ! 1012: case 22: ! 1013: sys_timezone=SYD; ! 1014: break; ! 1015: case 23: ! 1016: sys_timezone=NOU; ! 1017: break; ! 1018: case 24: ! 1019: sys_timezone=WEL; ! 1020: break; ! 1021: default: ! 1022: if(sys_timezone>720 || sys_timezone<-720) ! 1023: sys_timezone=0; ! 1024: sprintf(str,"%02d:%02d" ! 1025: ,sys_timezone/60,sys_timezone<0 ! 1026: ? (-sys_timezone)%60 : sys_timezone%60); ! 1027: uinput(WIN_MID|WIN_SAV,0,0 ! 1028: ,"Time (HH:MM) East (+) or West (-) of Universal " ! 1029: "Time" ! 1030: ,str,6,K_EDIT|K_UPPER); ! 1031: sys_timezone=atoi(str)*60; ! 1032: p=strchr(str,':'); ! 1033: if(p) { ! 1034: if(sys_timezone<0) ! 1035: sys_timezone-=atoi(p+1); ! 1036: else ! 1037: sys_timezone+=atoi(p+1); } ! 1038: break; ! 1039: } ! 1040: break; ! 1041: case 2: ! 1042: SETHELP(WHERE); ! 1043: /* ! 1044: &Maximum Message Base Retry Time:& ! 1045: ! 1046: This is the maximum number of seconds to allow while attempting to open ! 1047: or lock a message base (a value in the range of 10 to 45 seconds should ! 1048: be fine). ! 1049: */ ! 1050: itoa(smb_retry_time,str,10); ! 1051: uinput(WIN_MID|WIN_SAV,0,0 ! 1052: ,"Maximum Message Base Retry Time (in seconds)" ! 1053: ,str,2,K_NUMBER|K_EDIT); ! 1054: smb_retry_time=atoi(str); ! 1055: break; ! 1056: case 3: ! 1057: SETHELP(WHERE); ! 1058: /* ! 1059: &Maximum Messages Per QWK Packet:& ! 1060: ! 1061: This is the maximum number of messages (excluding E-mail), that a user ! 1062: can have in one QWK packet for download. This limit does not effect ! 1063: QWK network nodes (&Q& restriction). If set to &0&, no limit is imposed. ! 1064: */ ! 1065: ! 1066: ultoa(max_qwkmsgs,str,10); ! 1067: uinput(WIN_MID|WIN_SAV,0,0 ! 1068: ,"Maximum Messages Per QWK Packet (0=No Limit)" ! 1069: ,str,6,K_NUMBER|K_EDIT); ! 1070: max_qwkmsgs=atoi(str); ! 1071: break; ! 1072: case 4: ! 1073: SETHELP(WHERE); ! 1074: /* ! 1075: &Pre-pack QWK Requirements:& ! 1076: ! 1077: ALL user accounts on the BBS meeting this requirmenet will have a QWK ! 1078: packet automatically created for them every day after midnight ! 1079: (during the internal daily event). ! 1080: ! 1081: This is mainly intended for QWK network nodes that wish to save connect ! 1082: time by having their packets pre-packed. If a large number of users meet ! 1083: this requirement, it can take up a large amount of disk space on your ! 1084: system (in the &DATA\FILE& directory). ! 1085: */ ! 1086: getar("Pre-pack QWK (Use with caution!)",preqwk_ar); ! 1087: break; ! 1088: case 5: ! 1089: sprintf(str,"%u",mail_maxage); ! 1090: SETHELP(WHERE); ! 1091: /* ! 1092: &Maximum Age of Mail:& ! 1093: ! 1094: This value is the maximum number of days that mail will be kept. ! 1095: */ ! 1096: uinput(WIN_MID|WIN_SAV,0,17,"Maximum Age of Mail " ! 1097: "(in days)",str,5,K_EDIT|K_NUMBER); ! 1098: mail_maxage=atoi(str); ! 1099: break; ! 1100: case 6: ! 1101: strcpy(opt[0],"Daily"); ! 1102: strcpy(opt[1],"Immediately"); ! 1103: opt[2][0]=0; ! 1104: i=0; ! 1105: SETHELP(WHERE); ! 1106: /* ! 1107: &Purge Deleted E-mail:& ! 1108: ! 1109: If you wish to have deleted e-mail physically (and permanently) removed ! 1110: from your e-mail database immediately after a users exits the reading ! 1111: e-mail prompt, set this option to &Immediately&. ! 1112: ! 1113: For the best system performance and to avoid delays when deleting e-mail ! 1114: from a large e-mail database, set this option to &Daily& (the default). ! 1115: Your system maintenance will automatically purge deleted e-mail once a ! 1116: day. ! 1117: */ ! 1118: ! 1119: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1120: ,"Purge Deleted E-mail",opt); ! 1121: if(!i && sys_misc&SM_DELEMAIL) { ! 1122: sys_misc&=~SM_DELEMAIL; ! 1123: changes=1; } ! 1124: else if(i==1 && !(sys_misc&SM_DELEMAIL)) { ! 1125: sys_misc|=SM_DELEMAIL; ! 1126: changes=1; } ! 1127: break; ! 1128: case 7: ! 1129: sprintf(str,"%lu",mail_maxcrcs); ! 1130: SETHELP(WHERE); ! 1131: /* ! 1132: &Maximum Number of Mail CRCs:& ! 1133: ! 1134: This value is the maximum number of CRCs that will be kept for duplicate ! 1135: mail checking. Once this maximum number of CRCs is reached, the oldest ! 1136: CRCs will be automatically purged. ! 1137: */ ! 1138: uinput(WIN_MID|WIN_SAV,0,17,"Maximum Number of Mail " ! 1139: "CRCs",str,5,K_EDIT|K_NUMBER); ! 1140: mail_maxcrcs=atol(str); ! 1141: break; ! 1142: case 8: ! 1143: strcpy(opt[0],"Yes"); ! 1144: strcpy(opt[1],"No"); ! 1145: opt[2][0]=0; ! 1146: i=1; ! 1147: SETHELP(WHERE); ! 1148: /* ! 1149: &Allow Anonymous E-mail:& ! 1150: ! 1151: If you want users with the &A& exemption to be able to send E-mail ! 1152: anonymously, set this option to &Yes&. ! 1153: */ ! 1154: ! 1155: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1156: ,"Allow Anonymous E-mail",opt); ! 1157: if(!i && !(sys_misc&SM_ANON_EM)) { ! 1158: sys_misc|=SM_ANON_EM; ! 1159: changes=1; } ! 1160: else if(i==1 && sys_misc&SM_ANON_EM) { ! 1161: sys_misc&=~SM_ANON_EM; ! 1162: changes=1; } ! 1163: break; ! 1164: case 9: ! 1165: strcpy(opt[0],"Yes"); ! 1166: strcpy(opt[1],"No"); ! 1167: opt[2][0]=0; ! 1168: i=0; ! 1169: SETHELP(WHERE); ! 1170: /* ! 1171: &Allow Quoting in E-mail:& ! 1172: ! 1173: If you want your users to be allowed to use message quoting when ! 1174: responding in E-mail, set this option to &Yes&. ! 1175: */ ! 1176: ! 1177: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1178: ,"Allow Quoting in E-mail",opt); ! 1179: if(!i && !(sys_misc&SM_QUOTE_EM)) { ! 1180: sys_misc|=SM_QUOTE_EM; ! 1181: changes=1; } ! 1182: else if(i==1 && sys_misc&SM_QUOTE_EM) { ! 1183: sys_misc&=~SM_QUOTE_EM; ! 1184: changes=1; } ! 1185: break; ! 1186: case 10: ! 1187: strcpy(opt[0],"Yes"); ! 1188: strcpy(opt[1],"No"); ! 1189: opt[2][0]=0; ! 1190: i=0; ! 1191: SETHELP(WHERE); ! 1192: /* ! 1193: &Allow File Attachment Uploads in E-mail:& ! 1194: ! 1195: If you want your users to be allowed to attach an uploaded file to ! 1196: an E-mail message, set this option to &Yes&. ! 1197: */ ! 1198: ! 1199: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1200: ,"Allow File Attachment Uploads in E-mail",opt); ! 1201: if(!i && !(sys_misc&SM_FILE_EM)) { ! 1202: sys_misc|=SM_FILE_EM; ! 1203: changes=1; } ! 1204: else if(i==1 && sys_misc&SM_FILE_EM) { ! 1205: sys_misc&=~SM_FILE_EM; ! 1206: changes=1; } ! 1207: break; ! 1208: case 11: ! 1209: strcpy(opt[0],"Yes"); ! 1210: strcpy(opt[1],"No"); ! 1211: opt[2][0]=0; ! 1212: i=0; ! 1213: SETHELP(WHERE); ! 1214: /* ! 1215: &Allow Users to Have Their E-mail Forwarded to NetMail:& ! 1216: ! 1217: If you want your users to be able to have any e-mail sent to them ! 1218: optionally (at the sender's discretion) forwarded to a NetMail address, ! 1219: set this option to &Yes&. ! 1220: */ ! 1221: ! 1222: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1223: ,"Allow Forwarding of E-mail to NetMail",opt); ! 1224: if(!i && !(sys_misc&SM_FWDTONET)) { ! 1225: sys_misc|=SM_FWDTONET; ! 1226: changes=1; } ! 1227: else if(i==1 && sys_misc&SM_FWDTONET) { ! 1228: sys_misc&=~SM_FWDTONET; ! 1229: changes=1; } ! 1230: break; ! 1231: case 12: ! 1232: strcpy(opt[0],"Yes"); ! 1233: strcpy(opt[1],"No"); ! 1234: opt[2][0]=0; ! 1235: i=1; ! 1236: SETHELP(WHERE); ! 1237: /* ! 1238: &Kill Read E-mail Automatically:& ! 1239: ! 1240: If this option is set to &Yes&, e-mail that has been read will be ! 1241: automatically deleted when message base maintenance is run. ! 1242: */ ! 1243: ! 1244: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1245: ,"Kill Read E-mail Automatically",opt); ! 1246: if(!i && !(sys_misc&SM_DELREADM)) { ! 1247: sys_misc|=SM_DELREADM; ! 1248: changes=1; } ! 1249: else if(i==1 && sys_misc&SM_DELREADM) { ! 1250: sys_misc&=~SM_DELREADM; ! 1251: changes=1; } ! 1252: break; ! 1253: case 13: ! 1254: strcpy(opt[0],"Yes"); ! 1255: strcpy(opt[1],"No"); ! 1256: strcpy(opt[2],"Sysops Only"); ! 1257: opt[3][0]=0; ! 1258: i=1; ! 1259: SETHELP(WHERE); ! 1260: /* ! 1261: &Users Can View Deleted Messages:& ! 1262: ! 1263: If this option is set to &Yes&, then users will be able to view messages ! 1264: they've sent and deleted or messages sent to them and they've deleted ! 1265: with the option of un-deleting the message before the message is ! 1266: physically purged from the e-mail database. ! 1267: ! 1268: If this option is set to &No&, then when a message is deleted, it is no ! 1269: longer viewable (with SBBS) by anyone. ! 1270: ! 1271: If this option is set to &Sysops Only&, then only sysops and sub-ops (when ! 1272: appropriate) can view deleted messages. ! 1273: */ ! 1274: ! 1275: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1276: ,"Users Can View Deleted Messages",opt); ! 1277: if(!i && (sys_misc&(SM_USRVDELM|SM_SYSVDELM)) ! 1278: !=(SM_USRVDELM|SM_SYSVDELM)) { ! 1279: sys_misc|=(SM_USRVDELM|SM_SYSVDELM); ! 1280: changes=1; } ! 1281: else if(i==1 && sys_misc&(SM_USRVDELM|SM_SYSVDELM)) { ! 1282: sys_misc&=~(SM_USRVDELM|SM_SYSVDELM); ! 1283: changes=1; } ! 1284: else if(i==2 && (sys_misc&(SM_USRVDELM|SM_SYSVDELM)) ! 1285: !=SM_SYSVDELM) { ! 1286: sys_misc|=SM_SYSVDELM; ! 1287: sys_misc&=~SM_USRVDELM; ! 1288: changes=1; } ! 1289: break; ! 1290: case 14: ! 1291: SETHELP(WHERE); ! 1292: /* ! 1293: &Extra Attribute Codes...& ! 1294: ! 1295: Synchronet can suppport the native text attribute codes of other BBS ! 1296: programs in messages (menus, posts, e-mail, etc.) To enable the extra ! 1297: attribute codes for another BBS program, set the corresponding option ! 1298: to &Yes&. ! 1299: */ ! 1300: ! 1301: j=0; ! 1302: while(1) { ! 1303: i=0; ! 1304: sprintf(opt[i++],"%-15.15s %-3.3s","WWIV" ! 1305: ,sys_misc&SM_WWIV ? "Yes":"No"); ! 1306: sprintf(opt[i++],"%-15.15s %-3.3s","PCBoard" ! 1307: ,sys_misc&SM_PCBOARD ? "Yes":"No"); ! 1308: sprintf(opt[i++],"%-15.15s %-3.3s","Wildcat" ! 1309: ,sys_misc&SM_WILDCAT ? "Yes":"No"); ! 1310: sprintf(opt[i++],"%-15.15s %-3.3s","Celerity" ! 1311: ,sys_misc&SM_CELERITY ? "Yes":"No"); ! 1312: sprintf(opt[i++],"%-15.15s %-3.3s","Renegade" ! 1313: ,sys_misc&SM_RENEGADE ? "Yes":"No"); ! 1314: opt[i][0]=0; ! 1315: j=ulist(WIN_BOT|WIN_RHT|WIN_SAV,2,2,0,&j,0 ! 1316: ,"Extra Attribute Codes",opt); ! 1317: if(j==-1) ! 1318: break; ! 1319: ! 1320: changes=1; ! 1321: switch(j) { ! 1322: case 0: ! 1323: sys_misc^=SM_WWIV; ! 1324: break; ! 1325: case 1: ! 1326: sys_misc^=SM_PCBOARD; ! 1327: break; ! 1328: case 2: ! 1329: sys_misc^=SM_WILDCAT; ! 1330: break; ! 1331: case 3: ! 1332: sys_misc^=SM_CELERITY; ! 1333: break; ! 1334: case 4: ! 1335: sys_misc^=SM_RENEGADE; ! 1336: break; } } } } ! 1337: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.