|
|
1.1 ! root 1: /* scfgnet.c */ ! 2: ! 3: /* $Id: scfgnet.c,v 1.24 2005/11/27 23:34:28 deuce Exp $ */ ! 4: ! 5: /**************************************************************************** ! 6: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 8: * * ! 9: * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * ! 10: * * ! 11: * This program is free software; you can redistribute it and/or * ! 12: * modify it under the terms of the GNU General Public License * ! 13: * as published by the Free Software Foundation; either version 2 * ! 14: * of the License, or (at your option) any later version. * ! 15: * See the GNU General Public License for more details: gpl.txt or * ! 16: * http://www.fsf.org/copyleft/gpl.html * ! 17: * * ! 18: * Anonymous FTP access to the most recent released source is available at * ! 19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 20: * * ! 21: * Anonymous CVS access to the development source and modification history * ! 22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 24: * (just hit return, no password is necessary) * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 26: * * ! 27: * For Synchronet coding style and modification guidelines, see * ! 28: * http://www.synchro.net/source.html * ! 29: * * ! 30: * You are encouraged to submit any modifications (preferably in Unix diff * ! 31: * format) via e-mail to [email protected] * ! 32: * * ! 33: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 34: ****************************************************************************/ ! 35: ! 36: #include "scfg.h" ! 37: ! 38: void qhub_edit(int num); ! 39: void phub_edit(int num); ! 40: char *daystr(char days); ! 41: void qhub_sub_edit(uint num); ! 42: /****************************************************************************/ ! 43: /* Returns the FidoNet address kept in str as ASCII. */ ! 44: /****************************************************************************/ ! 45: faddr_t atofaddr(char *str) ! 46: { ! 47: char *p; ! 48: faddr_t addr; ! 49: ! 50: addr.zone=addr.net=addr.node=addr.point=0; ! 51: if((p=strchr(str,':'))!=NULL) { ! 52: addr.zone=atoi(str); ! 53: addr.net=atoi(p+1); } ! 54: else { ! 55: if(cfg.total_faddrs) ! 56: addr.zone=cfg.faddr[0].zone; ! 57: else ! 58: addr.zone=1; ! 59: addr.net=atoi(str); } ! 60: if(!addr.zone) /* no such thing as zone 0 */ ! 61: addr.zone=1; ! 62: if((p=strchr(str,'/'))!=NULL) ! 63: addr.node=atoi(p+1); ! 64: else { ! 65: if(cfg.total_faddrs) ! 66: addr.net=cfg.faddr[0].net; ! 67: else ! 68: addr.net=1; ! 69: addr.node=atoi(str); } ! 70: if((p=strchr(str,'.'))!=NULL) ! 71: addr.point=atoi(p+1); ! 72: return(addr); ! 73: } ! 74: ! 75: uint getsub(void) ! 76: { ! 77: static int grp_dflt,sub_dflt,grp_bar,sub_bar; ! 78: char str[81]; ! 79: int i,j,k; ! 80: uint subnum[MAX_OPTS+1]; ! 81: ! 82: while(1) { ! 83: for(i=0;i<cfg.total_grps && i<MAX_OPTS;i++) ! 84: sprintf(opt[i],"%-25s",cfg.grp[i]->lname); ! 85: opt[i][0]=0; ! 86: i=uifc.list(WIN_SAV|WIN_RHT|WIN_BOT,0,0,45,&grp_dflt,&grp_bar ! 87: ,"Message Groups" ! 88: ,opt); ! 89: if(i==-1) ! 90: return(-1); ! 91: for(j=k=0;j<cfg.total_subs && k<MAX_OPTS;j++) ! 92: if(cfg.sub[j]->grp==i) { ! 93: sprintf(opt[k],"%-25s",cfg.sub[j]->lname); ! 94: subnum[k++]=j; } ! 95: opt[k][0]=0; ! 96: sprintf(str,"%s Sub-boards",cfg.grp[i]->sname); ! 97: j=uifc.list(WIN_RHT|WIN_BOT|WIN_SAV,0,0,45,&sub_dflt,&sub_bar,str,opt); ! 98: if(j==-1) ! 99: continue; ! 100: return(subnum[j]); } ! 101: ! 102: } ! 103: ! 104: void net_cfg() ! 105: { ! 106: static int net_dflt,qnet_dflt,pnet_dflt,fnet_dflt,inet_dflt ! 107: ,qhub_dflt,phub_dflt; ! 108: char str[81],done; ! 109: int i,j,k,l; ! 110: ! 111: while(1) { ! 112: i=0; ! 113: strcpy(opt[i++],"Internet E-mail"); ! 114: strcpy(opt[i++],"QWK Packet Networks"); ! 115: strcpy(opt[i++],"FidoNet EchoMail and NetMail"); ! 116: strcpy(opt[i++],"PostLink Networks"); ! 117: opt[i][0]=0; ! 118: SETHELP(WHERE); ! 119: /* ! 120: &Configure Networks:& ! 121: ! 122: This is the network configuration menu. Select the type of network ! 123: technology that you want to configure. ! 124: */ ! 125: i=uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&net_dflt,0,"Networks",opt); ! 126: if(i==1) { /* QWK net stuff */ ! 127: done=0; ! 128: while(!done) { ! 129: i=0; ! 130: strcpy(opt[i++],"Network Hubs..."); ! 131: strcpy(opt[i++],"Default Tagline"); ! 132: opt[i][0]=0; ! 133: SETHELP(WHERE); ! 134: /* ! 135: &QWK Packet Networks:& ! 136: ! 137: From this menu you can configure the default tagline to use for ! 138: outgoing messages on QWK networked sub-boards, or you can select ! 139: &Network Hubs...& to add, delete, or configure QWK hubs that your system ! 140: calls to exchange packets with. ! 141: */ ! 142: i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&qnet_dflt,0 ! 143: ,"QWK Packet Networks",opt); ! 144: switch(i) { ! 145: case -1: /* ESC */ ! 146: done=1; ! 147: break; ! 148: case 1: ! 149: SETHELP(WHERE); ! 150: /* ! 151: &QWK Network Default Tagline:& ! 152: ! 153: This is the default tagline to use for outgoing messages on QWK ! 154: networked sub-boards. This default can be overridden on a per sub-board ! 155: basis with the sub-board configuration &Network Options...&. ! 156: */ ! 157: uifc.input(WIN_MID|WIN_SAV,0,0,nulstr ! 158: ,cfg.qnet_tagline,sizeof(cfg.qnet_tagline)-1,K_MSG|K_EDIT); ! 159: break; ! 160: case 0: ! 161: while(1) { ! 162: for(i=0;i<cfg.total_qhubs && i<MAX_OPTS;i++) ! 163: sprintf(opt[i],"%-8.8s",cfg.qhub[i]->id); ! 164: opt[i][0]=0; ! 165: i=WIN_ACT|WIN_RHT|WIN_SAV; ! 166: if(cfg.total_qhubs<MAX_OPTS) ! 167: i|=WIN_INS|WIN_INSACT|WIN_XTR; ! 168: if(cfg.total_qhubs) ! 169: i|=WIN_DEL; ! 170: SETHELP(WHERE); ! 171: /* ! 172: &QWK Network Hubs:& ! 173: ! 174: This is a list of QWK network hubs that your system calls to exchange ! 175: packets with. ! 176: ! 177: To add a hub, select the desired location with the arrow keys and hit ! 178: INS . ! 179: ! 180: To delete a hub, select it and hit DEL . ! 181: ! 182: To configure a hub, select it and hit ENTER . ! 183: */ ! 184: i=uifc.list(i,0,0,0,&qhub_dflt,0 ! 185: ,"QWK Network Hubs",opt); ! 186: if(i==-1) ! 187: break; ! 188: if((i&MSK_ON)==MSK_INS) { ! 189: i&=MSK_OFF; ! 190: if((cfg.qhub=(qhub_t **)realloc(cfg.qhub ! 191: ,sizeof(qhub_t *)*(cfg.total_qhubs+1)))==NULL) { ! 192: errormsg(WHERE,ERR_ALLOC,nulstr ! 193: ,sizeof(qhub_t *)*(cfg.total_qhubs+1)); ! 194: cfg.total_qhubs=0; ! 195: bail(1); ! 196: continue; } ! 197: ! 198: SETHELP(WHERE); ! 199: /* ! 200: &QWK Network Hub System ID:& ! 201: ! 202: This is the QWK System ID of this hub. It is used for incoming and ! 203: outgoing network packets and must be accurate. ! 204: */ ! 205: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 206: ,"System ID",str,LEN_QWKID,K_UPPER)<1) ! 207: continue; ! 208: ! 209: for(j=cfg.total_qhubs;j>i;j--) ! 210: cfg.qhub[j]=cfg.qhub[j-1]; ! 211: if((cfg.qhub[i]=(qhub_t *)malloc(sizeof(qhub_t))) ! 212: ==NULL) { ! 213: errormsg(WHERE,ERR_ALLOC,nulstr ! 214: ,sizeof(qhub_t)); ! 215: continue; } ! 216: memset(cfg.qhub[i],0,sizeof(qhub_t)); ! 217: strcpy(cfg.qhub[i]->id,str); ! 218: strcpy(cfg.qhub[i]->pack,"%@zip -jD %f %s"); ! 219: strcpy(cfg.qhub[i]->unpack,"%@unzip -Coj %f %s -d %g"); ! 220: strcpy(cfg.qhub[i]->call,"*qnet-ftp VERT vert.synchro.net YOURPASS"); ! 221: cfg.qhub[i]->node=1; ! 222: cfg.qhub[i]->days=0xff; /* all days */ ! 223: cfg.total_qhubs++; ! 224: uifc.changes=1; ! 225: continue; } ! 226: if((i&MSK_ON)==MSK_DEL) { ! 227: i&=MSK_OFF; ! 228: free(cfg.qhub[i]->mode); ! 229: free(cfg.qhub[i]->conf); ! 230: free(cfg.qhub[i]->sub); ! 231: free(cfg.qhub[i]); ! 232: cfg.total_qhubs--; ! 233: while(i<cfg.total_qhubs) { ! 234: cfg.qhub[i]=cfg.qhub[i+1]; ! 235: i++; } ! 236: uifc.changes=1; ! 237: continue; } ! 238: qhub_edit(i); } ! 239: break; } } } ! 240: ! 241: else if(i==2) { /* FidoNet Stuff */ ! 242: done=0; ! 243: while(!done) { ! 244: i=0; ! 245: sprintf(opt[i++],"%-27.27s%s" ! 246: ,"System Addresses",cfg.total_faddrs ! 247: ? smb_faddrtoa(&cfg.faddr[0],tmp) : nulstr); ! 248: sprintf(opt[i++],"%-27.27s%s" ! 249: ,"Default Outbound Address" ! 250: ,cfg.dflt_faddr.zone ! 251: ? smb_faddrtoa(&cfg.dflt_faddr,tmp) : "No"); ! 252: sprintf(opt[i++],"%-27.27s" ! 253: ,"Default Origin Line"); ! 254: sprintf(opt[i++],"%-27.27s%.40s" ! 255: ,"NetMail Semaphore",cfg.netmail_sem); ! 256: sprintf(opt[i++],"%-27.27s%.40s" ! 257: ,"EchoMail Semaphore",cfg.echomail_sem); ! 258: sprintf(opt[i++],"%-27.27s%.40s" ! 259: ,"Inbound File Directory",cfg.fidofile_dir); ! 260: sprintf(opt[i++],"%-27.27s%.40s" ! 261: ,"EchoMail Base Directory",cfg.echomail_dir); ! 262: sprintf(opt[i++],"%-27.27s%.40s" ! 263: ,"NetMail Directory",cfg.netmail_dir); ! 264: sprintf(opt[i++],"%-27.27s%s" ! 265: ,"Allow Sending of NetMail" ! 266: ,cfg.netmail_misc&NMAIL_ALLOW ? "Yes":"No"); ! 267: sprintf(opt[i++],"%-27.27s%s" ! 268: ,"Allow File Attachments" ! 269: ,cfg.netmail_misc&NMAIL_FILE ? "Yes":"No"); ! 270: sprintf(opt[i++],"%-27.27s%s" ! 271: ,"Send NetMail Using Alias" ! 272: ,cfg.netmail_misc&NMAIL_ALIAS ? "Yes":"No"); ! 273: sprintf(opt[i++],"%-27.27s%s" ! 274: ,"NetMail Defaults to Crash" ! 275: ,cfg.netmail_misc&NMAIL_CRASH ? "Yes":"No"); ! 276: sprintf(opt[i++],"%-27.27s%s" ! 277: ,"NetMail Defaults to Direct" ! 278: ,cfg.netmail_misc&NMAIL_DIRECT ? "Yes":"No"); ! 279: sprintf(opt[i++],"%-27.27s%s" ! 280: ,"NetMail Defaults to Hold" ! 281: ,cfg.netmail_misc&NMAIL_HOLD ? "Yes":"No"); ! 282: sprintf(opt[i++],"%-27.27s%s" ! 283: ,"Kill NetMail After Sent" ! 284: ,cfg.netmail_misc&NMAIL_KILL ? "Yes":"No"); ! 285: sprintf(opt[i++],"%-27.27s%lu" ! 286: ,"Cost to Send NetMail",cfg.netmail_cost); ! 287: opt[i][0]=0; ! 288: SETHELP(WHERE); ! 289: /* ! 290: &FidoNet EchoMail and NetMail:& ! 291: ! 292: This menu contains configuration options that pertain specifically to ! 293: networking E-mail (NetMail) and sub-boards (EchoMail) through networks ! 294: using FidoNet technology. ! 295: */ ! 296: i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&fnet_dflt,0 ! 297: ,"FidoNet EchoMail and NetMail",opt); ! 298: switch(i) { ! 299: case -1: /* ESC */ ! 300: done=1; ! 301: break; ! 302: case 0: ! 303: SETHELP(WHERE); ! 304: /* ! 305: &System FidoNet Addresses:& ! 306: ! 307: This is the FidoNet address of this system used to receive NetMail. ! 308: The Main address is also used as the default address for sub-boards. ! 309: Format: &Zone:Net/Node[.Point]& ! 310: */ ! 311: k=l=0; ! 312: while(1) { ! 313: for(i=0;i<cfg.total_faddrs && i<MAX_OPTS;i++) { ! 314: if(i==0) ! 315: strcpy(str,"Main"); ! 316: else ! 317: sprintf(str,"AKA %u",i); ! 318: sprintf(opt[i],"%-8.8s %-16s" ! 319: ,str,smb_faddrtoa(&cfg.faddr[i],tmp)); } ! 320: opt[i][0]=0; ! 321: j=WIN_RHT|WIN_SAV|WIN_ACT|WIN_INSACT; ! 322: if(cfg.total_faddrs<MAX_OPTS) ! 323: j|=WIN_INS|WIN_XTR; ! 324: if(cfg.total_faddrs) ! 325: j|=WIN_DEL; ! 326: i=uifc.list(j,0,0,0,&k,&l ! 327: ,"System Addresses",opt); ! 328: if(i==-1) ! 329: break; ! 330: if((i&MSK_ON)==MSK_INS) { ! 331: i&=MSK_OFF; ! 332: ! 333: if(!cfg.total_faddrs) ! 334: strcpy(str,"1:1/0"); ! 335: else ! 336: smb_faddrtoa(&cfg.faddr[0],str); ! 337: if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Address" ! 338: ,str,25,K_EDIT|K_UPPER)) ! 339: continue; ! 340: ! 341: if((cfg.faddr=(faddr_t *)realloc(cfg.faddr ! 342: ,sizeof(faddr_t)*(cfg.total_faddrs+1)))==NULL) { ! 343: errormsg(WHERE,ERR_ALLOC,nulstr ! 344: ,sizeof(faddr_t)*cfg.total_faddrs+1); ! 345: cfg.total_faddrs=0; ! 346: bail(1); ! 347: continue; } ! 348: ! 349: for(j=cfg.total_faddrs;j>i;j--) ! 350: cfg.faddr[j]=cfg.faddr[j-1]; ! 351: ! 352: cfg.faddr[i]=atofaddr(str); ! 353: cfg.total_faddrs++; ! 354: uifc.changes=1; ! 355: continue; } ! 356: if((i&MSK_ON)==MSK_DEL) { ! 357: i&=MSK_OFF; ! 358: cfg.total_faddrs--; ! 359: while(i<cfg.total_faddrs) { ! 360: cfg.faddr[i]=cfg.faddr[i+1]; ! 361: i++; } ! 362: uifc.changes=1; ! 363: continue; } ! 364: smb_faddrtoa(&cfg.faddr[i],str); ! 365: uifc.input(WIN_MID|WIN_SAV,0,0,"Address" ! 366: ,str,25,K_EDIT); ! 367: cfg.faddr[i]=atofaddr(str); } ! 368: break; ! 369: case 1: ! 370: i=0; ! 371: strcpy(opt[0],"Yes"); ! 372: strcpy(opt[1],"No"); ! 373: opt[2][0]=0; ! 374: SETHELP(WHERE); ! 375: /* ! 376: &Use Default Outbound NetMail Address:& ! 377: ! 378: If you would like to have a default FidoNet address adding to outbound ! 379: NetMail mail messages that do not have an address specified, select ! 380: &Yes&. ! 381: */ ! 382: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 383: ,"Use Default Outbound NetMail Address",opt); ! 384: if(i==1) { ! 385: if(cfg.dflt_faddr.zone) ! 386: uifc.changes=1; ! 387: cfg.dflt_faddr.zone=0; ! 388: break; } ! 389: if(i==-1) ! 390: break; ! 391: if(!cfg.dflt_faddr.zone) { ! 392: cfg.dflt_faddr.zone=1; ! 393: uifc.changes=1; } ! 394: smb_faddrtoa(&cfg.dflt_faddr,str); ! 395: SETHELP(WHERE); ! 396: /* ! 397: &Default Outbound FidoNet NetMail Address:& ! 398: ! 399: If you would like to automatically add a FidoNet address to outbound ! 400: NetMail that does not have an address specified, set this option ! 401: to that address. This is useful for Fido/UUCP gateway mail. ! 402: Format: &Zone:Net/Node[.Point]& ! 403: */ ! 404: if(uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Address" ! 405: ,str,25,K_EDIT)) { ! 406: cfg.dflt_faddr=atofaddr(str); ! 407: uifc.changes=1; } ! 408: break; ! 409: case 2: ! 410: SETHELP(WHERE); ! 411: /* ! 412: &Default Origin Line:& ! 413: ! 414: This is the default origin line used for sub-boards networked via ! 415: EchoMail. This origin line can be overridden on a per sub-board basis ! 416: with the sub-board configuration &Network Options...&. ! 417: */ ! 418: uifc.input(WIN_MID|WIN_SAV,0,0,"* Origin" ! 419: ,cfg.origline,sizeof(cfg.origline)-1,K_EDIT); ! 420: break; ! 421: case 3: ! 422: SETHELP(WHERE); ! 423: /* ! 424: &NetMail Semaphore File:& ! 425: ! 426: This is a filename that will be used as a semaphore (signal) to your ! 427: FidoNet front-end that new NetMail has been created and the messages ! 428: should be re-scanned. ! 429: */ ! 430: uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail Semaphore" ! 431: ,cfg.netmail_sem,sizeof(cfg.netmail_sem)-1,K_EDIT); ! 432: break; ! 433: case 4: ! 434: SETHELP(WHERE); ! 435: /* ! 436: &EchoMail Semaphore File:& ! 437: ! 438: This is a filename that will be used as a semaphore (signal) to your ! 439: FidoNet front-end that new EchoMail has been created and the messages ! 440: should be re-scanned. ! 441: */ ! 442: uifc.input(WIN_MID|WIN_SAV,0,0,"EchoMail Semaphore" ! 443: ,cfg.echomail_sem,sizeof(cfg.echomail_sem)-1,K_EDIT); ! 444: break; ! 445: case 5: ! 446: SETHELP(WHERE); ! 447: /* ! 448: &Inbound File Directory:& ! 449: ! 450: This directory is where inbound files are placed. This directory is ! 451: only used when an incoming message has a file attached. ! 452: */ ! 453: uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound Files" ! 454: ,cfg.fidofile_dir,sizeof(cfg.fidofile_dir)-1,K_EDIT); ! 455: break; ! 456: case 6: ! 457: SETHELP(WHERE); ! 458: /* ! 459: &EchoMail Base Directory:& ! 460: ! 461: This is an optional field used as a base directory for the location ! 462: of EchoMail messages for sub-boards that do not have a specified ! 463: &EchoMail Storage Directory&. If a sub-board does not have a specified ! 464: storage directory for EchoMail, its messages will be imported from and ! 465: exported to a sub-directory off of this base directory. The name of the ! 466: sub-directory is the same as the internal code for the sub-directory. ! 467: ! 468: If all EchoMail sub-boards have specified EchoMail storage directories, ! 469: this option is not used at all. ! 470: */ ! 471: uifc.input(WIN_MID|WIN_SAV,0,0,"EchoMail Base" ! 472: ,cfg.echomail_dir,sizeof(cfg.echomail_dir)-1,K_EDIT); ! 473: break; ! 474: case 7: ! 475: SETHELP(WHERE); ! 476: /* ! 477: &NetMail Directory:& ! 478: ! 479: This is the directory where NetMail will be imported from and exported ! 480: to. ! 481: */ ! 482: uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail" ! 483: ,cfg.netmail_dir,sizeof(cfg.netmail_dir)-1,K_EDIT); ! 484: break; ! 485: case 8: ! 486: i=0; ! 487: strcpy(opt[0],"Yes"); ! 488: strcpy(opt[1],"No"); ! 489: opt[2][0]=0; ! 490: SETHELP(WHERE); ! 491: /* ! 492: &Allow Users to Send NetMail:& ! 493: ! 494: If you are on a FidoNet style network and want your users to be allowed ! 495: to send NetMail, set this option to &Yes&. ! 496: */ ! 497: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 498: ,"Allow Users to Send NetMail",opt); ! 499: if(!i && !(cfg.netmail_misc&NMAIL_ALLOW)) { ! 500: uifc.changes=1; ! 501: cfg.netmail_misc|=NMAIL_ALLOW; } ! 502: else if(i==1 && cfg.netmail_misc&NMAIL_ALLOW) { ! 503: uifc.changes=1; ! 504: cfg.netmail_misc&=~NMAIL_ALLOW; } ! 505: break; ! 506: case 9: ! 507: i=0; ! 508: strcpy(opt[0],"Yes"); ! 509: strcpy(opt[1],"No"); ! 510: opt[2][0]=0; ! 511: SETHELP(WHERE); ! 512: /* ! 513: &Allow Users to Send NetMail File Attachments:& ! 514: ! 515: If you are on a FidoNet style network and want your users to be allowed ! 516: to send NetMail file attachments, set this option to &Yes&. ! 517: */ ! 518: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 519: ,"Allow Users to Send NetMail File Attachments",opt); ! 520: if(!i && !(cfg.netmail_misc&NMAIL_FILE)) { ! 521: uifc.changes=1; ! 522: cfg.netmail_misc|=NMAIL_FILE; } ! 523: else if(i==1 && cfg.netmail_misc&NMAIL_FILE) { ! 524: uifc.changes=1; ! 525: cfg.netmail_misc&=~NMAIL_FILE; } ! 526: break; ! 527: case 10: ! 528: i=1; ! 529: strcpy(opt[0],"Yes"); ! 530: strcpy(opt[1],"No"); ! 531: opt[2][0]=0; ! 532: SETHELP(WHERE); ! 533: /* ! 534: &Use Aliases in NetMail:& ! 535: ! 536: If you allow aliases on your system and wish users to have their NetMail ! 537: contain their alias as the &From User&, set this option to &Yes&. If you ! 538: want all NetMail to be sent using users' real names, set this option to ! 539: &No&. ! 540: */ ! 541: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 542: ,"Use Aliases in NetMail",opt); ! 543: if(!i && !(cfg.netmail_misc&NMAIL_ALIAS)) { ! 544: uifc.changes=1; ! 545: cfg.netmail_misc|=NMAIL_ALIAS; } ! 546: else if(i==1 && cfg.netmail_misc&NMAIL_ALIAS) { ! 547: uifc.changes=1; ! 548: cfg.netmail_misc&=~NMAIL_ALIAS; } ! 549: break; ! 550: case 11: ! 551: i=1; ! 552: strcpy(opt[0],"Yes"); ! 553: strcpy(opt[1],"No"); ! 554: opt[2][0]=0; ! 555: SETHELP(WHERE); ! 556: /* ! 557: &NetMail Defaults to Crash Status:& ! 558: ! 559: If you want all NetMail to default to crash (send immediately) status, ! 560: set this option to &Yes&. ! 561: */ ! 562: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 563: ,"NetMail Defaults to Crash Status",opt); ! 564: if(!i && !(cfg.netmail_misc&NMAIL_CRASH)) { ! 565: uifc.changes=1; ! 566: cfg.netmail_misc|=NMAIL_CRASH; } ! 567: else if(i==1 && cfg.netmail_misc&NMAIL_CRASH) { ! 568: uifc.changes=1; ! 569: cfg.netmail_misc&=~NMAIL_CRASH; } ! 570: break; ! 571: case 12: ! 572: i=1; ! 573: strcpy(opt[0],"Yes"); ! 574: strcpy(opt[1],"No"); ! 575: opt[2][0]=0; ! 576: SETHELP(WHERE); ! 577: /* ! 578: &NetMail Defaults to Direct Status:& ! 579: ! 580: If you want all NetMail to default to direct (send directly) status, ! 581: set this option to &Yes&. ! 582: */ ! 583: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 584: ,"NetMail Defaults to Direct Status",opt); ! 585: if(!i && !(cfg.netmail_misc&NMAIL_DIRECT)) { ! 586: uifc.changes=1; ! 587: cfg.netmail_misc|=NMAIL_DIRECT; } ! 588: else if(i==1 && cfg.netmail_misc&NMAIL_DIRECT) { ! 589: uifc.changes=1; ! 590: cfg.netmail_misc&=~NMAIL_DIRECT; } ! 591: break; ! 592: case 13: ! 593: i=1; ! 594: strcpy(opt[0],"Yes"); ! 595: strcpy(opt[1],"No"); ! 596: opt[2][0]=0; ! 597: SETHELP(WHERE); ! 598: /* ! 599: &NetMail Defaults to Hold Status:& ! 600: ! 601: If you want all NetMail to default to hold status, set this option to ! 602: &Yes&. ! 603: */ ! 604: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 605: ,"NetMail Defaults to Hold Status",opt); ! 606: if(!i && !(cfg.netmail_misc&NMAIL_HOLD)) { ! 607: uifc.changes=1; ! 608: cfg.netmail_misc|=NMAIL_HOLD; } ! 609: else if(i==1 && cfg.netmail_misc&NMAIL_HOLD) { ! 610: uifc.changes=1; ! 611: cfg.netmail_misc&=~NMAIL_HOLD; } ! 612: break; ! 613: case 14: ! 614: i=0; ! 615: strcpy(opt[0],"Yes"); ! 616: strcpy(opt[1],"No"); ! 617: opt[2][0]=0; ! 618: SETHELP(WHERE); ! 619: /* ! 620: &Kill NetMail After it is Sent:& ! 621: ! 622: If you want NetMail messages to be deleted after they are successfully ! 623: sent, set this option to &Yes&. ! 624: */ ! 625: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 626: ,"Kill NetMail After it is Sent",opt); ! 627: if(!i && !(cfg.netmail_misc&NMAIL_KILL)) { ! 628: uifc.changes=1; ! 629: cfg.netmail_misc|=NMAIL_KILL; } ! 630: else if(i==1 && cfg.netmail_misc&NMAIL_KILL) { ! 631: uifc.changes=1; ! 632: cfg.netmail_misc&=~NMAIL_KILL; } ! 633: break; ! 634: case 15: ! 635: ultoa(cfg.netmail_cost,str,10); ! 636: SETHELP(WHERE); ! 637: /* ! 638: &Cost in Credits to Send NetMail:& ! 639: ! 640: This is the number of credits it will cost your users to send NetMail. ! 641: If you want the sending of NetMail to be free, set this value to &0&. ! 642: */ ! 643: uifc.input(WIN_MID|WIN_SAV,0,0 ! 644: ,"Cost in Credits to Send NetMail" ! 645: ,str,10,K_EDIT|K_NUMBER); ! 646: cfg.netmail_cost=atol(str); ! 647: break; } } } ! 648: else if(i==3) { ! 649: done=0; ! 650: while(!done) { ! 651: i=0; ! 652: strcpy(opt[i++],"Network Hubs..."); ! 653: sprintf(opt[i++],"%-20.20s%-12s","Site Name",cfg.sys_psname); ! 654: sprintf(opt[i++],"%-20.20s%-lu","Site Number",cfg.sys_psnum); ! 655: opt[i][0]=0; ! 656: SETHELP(WHERE); ! 657: /* ! 658: &PostLink Networks:& ! 659: ! 660: From this menu you can configure PostLink or PCRelay Networks. ! 661: */ ! 662: i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&pnet_dflt,0 ! 663: ,"PostLink Networks",opt); ! 664: switch(i) { ! 665: case -1: /* ESC */ ! 666: done=1; ! 667: break; ! 668: case 1: ! 669: SETHELP(WHERE); ! 670: /* ! 671: &PostLink Site Name:& ! 672: ! 673: If your system is networked via PostLink or PCRelay, this should be the ! 674: Site Name for your BBS. ! 675: */ ! 676: uifc.input(WIN_MID|WIN_SAV,0,0,"Site Name" ! 677: ,cfg.sys_psname,sizeof(cfg.sys_psname)-1,K_UPPER|K_EDIT); ! 678: break; ! 679: case 2: ! 680: SETHELP(WHERE); ! 681: /* ! 682: &PostLink Site Number:& ! 683: ! 684: If your system is networked via PostLink or PCRelay, this should be the ! 685: Site Number for your BBS. ! 686: */ ! 687: ultoa(cfg.sys_psnum,str,10); ! 688: uifc.input(WIN_MID|WIN_SAV,0,0,"Site Number" ! 689: ,str,10,K_NUMBER|K_EDIT); ! 690: cfg.sys_psnum=atol(str); ! 691: break; ! 692: case 0: ! 693: while(1) { ! 694: for(i=0;i<cfg.total_phubs && i<MAX_OPTS;i++) ! 695: sprintf(opt[i],"%-10.10s",cfg.phub[i]->name); ! 696: opt[i][0]=0; ! 697: i=WIN_ACT|WIN_RHT|WIN_SAV; ! 698: if(cfg.total_phubs<MAX_OPTS) ! 699: i|=WIN_INS|WIN_INSACT|WIN_XTR; ! 700: if(cfg.total_phubs) ! 701: i|=WIN_DEL; ! 702: SETHELP(WHERE); ! 703: /* ! 704: &PostLink Network Hubs:& ! 705: ! 706: This is a list of PostLink and/or PCRelay network hubs that your system ! 707: calls to exchange packets with. ! 708: ! 709: To add a hub, select the desired location with the arrow keys and hit ! 710: INS . ! 711: ! 712: To delete a hub, select it and hit DEL . ! 713: ! 714: To configure a hub, select it and hit ENTER . ! 715: */ ! 716: i=uifc.list(i,0,0,0,&phub_dflt,0 ! 717: ,"PostLink Hubs",opt); ! 718: if(i==-1) ! 719: break; ! 720: if((i&MSK_ON)==MSK_INS) { ! 721: i&=MSK_OFF; ! 722: if((cfg.phub=(phub_t **)realloc(cfg.phub ! 723: ,sizeof(phub_t *)*(cfg.total_phubs+1)))==NULL) { ! 724: errormsg(WHERE,ERR_ALLOC,nulstr ! 725: ,sizeof(phub_t *)*(cfg.total_phubs+1)); ! 726: cfg.total_phubs=0; ! 727: bail(1); ! 728: continue; } ! 729: ! 730: SETHELP(WHERE); ! 731: /* ! 732: &Network Hub Site Name:& ! 733: ! 734: This is the Site Name of this hub. It is used for only for reference. ! 735: */ ! 736: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 737: ,"Site Name",str,10,K_UPPER)<1) ! 738: continue; ! 739: ! 740: for(j=cfg.total_phubs;j>i;j--) ! 741: cfg.phub[j]=cfg.phub[j-1]; ! 742: ! 743: if((cfg.phub[i]=(phub_t *)malloc(sizeof(phub_t))) ! 744: ==NULL) { ! 745: errormsg(WHERE,ERR_ALLOC,nulstr ! 746: ,sizeof(phub_t)); ! 747: continue; } ! 748: memset(cfg.phub[i],0,sizeof(phub_t)); ! 749: strcpy(cfg.phub[i]->name,str); ! 750: strcpy(cfg.phub[i]->call,"%!pnet"); ! 751: cfg.phub[i]->node=1; ! 752: cfg.phub[i]->days=0xff; /* all days */ ! 753: cfg.total_phubs++; ! 754: uifc.changes=1; ! 755: continue; } ! 756: if((i&MSK_ON)==MSK_DEL) { ! 757: i&=MSK_OFF; ! 758: free(cfg.phub[i]); ! 759: cfg.total_phubs--; ! 760: while(i<cfg.total_phubs) { ! 761: cfg.phub[i]=cfg.phub[i+1]; ! 762: i++; } ! 763: uifc.changes=1; ! 764: continue; } ! 765: phub_edit(i); } ! 766: break; } } } ! 767: ! 768: else if(i==0) { /* Internet E-mail */ ! 769: done=0; ! 770: while(!done) { ! 771: i=0; ! 772: sprintf(opt[i++],"%-27.27s%s" ! 773: ,"System Address",cfg.sys_inetaddr); ! 774: sprintf(opt[i++],"%-27.27s%.40s" ! 775: ,"Inbound E-mail Semaphore",cfg.smtpmail_sem); ! 776: sprintf(opt[i++],"%-27.27s%.40s" ! 777: ,"Outbound E-mail Semaphore",cfg.inetmail_sem); ! 778: sprintf(opt[i++],"%-27.27s%s" ! 779: ,"Allow Sending of E-mail" ! 780: ,cfg.inetmail_misc&NMAIL_ALLOW ? "Yes":"No"); ! 781: sprintf(opt[i++],"%-27.27s%s" ! 782: ,"Allow File Attachments" ! 783: ,cfg.inetmail_misc&NMAIL_FILE ? "Yes":"No"); ! 784: sprintf(opt[i++],"%-27.27s%s" ! 785: ,"Send E-mail Using Alias" ! 786: ,cfg.inetmail_misc&NMAIL_ALIAS ? "Yes":"No"); ! 787: sprintf(opt[i++],"%-27.27s%lu" ! 788: ,"Cost to Send E-mail",cfg.inetmail_cost); ! 789: opt[i][0]=0; ! 790: SETHELP(WHERE); ! 791: /* ! 792: &Internet E-mail:& ! 793: ! 794: This menu contains configuration options that pertain specifically to ! 795: Internet E-mail. ! 796: */ ! 797: i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&inet_dflt,0 ! 798: ,"Internet E-mail",opt); ! 799: switch(i) { ! 800: case -1: /* ESC */ ! 801: done=1; ! 802: break; ! 803: case 0: ! 804: SETHELP(WHERE); ! 805: /* ! 806: &Sytem Internet Address:& ! 807: ! 808: Enter your system's Internet address (hostname or IP address) here ! 809: (e.g. &joesbbs.com&). ! 810: */ ! 811: uifc.input(WIN_MID|WIN_SAV,0,0,"" ! 812: ,cfg.sys_inetaddr,sizeof(cfg.sys_inetaddr)-1,K_EDIT); ! 813: break; ! 814: case 1: ! 815: SETHELP(WHERE); ! 816: /* ! 817: &Inbound Internet E-mail Semaphore File:& ! 818: ! 819: This is a filename that will be used as a semaphore (signal) to any ! 820: external Internet e-mail processors that new mail has been received ! 821: and the message base should be re-scanned. ! 822: */ ! 823: uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound Semaphore" ! 824: ,cfg.smtpmail_sem,sizeof(cfg.smtpmail_sem)-1,K_EDIT); ! 825: break; ! 826: case 2: ! 827: SETHELP(WHERE); ! 828: /* ! 829: &Outbound Internet E-mail Semaphore File:& ! 830: ! 831: This is a filename that will be used as a semaphore (signal) to any ! 832: external Internet gateways (if supported) that new mail has been created ! 833: and the message base should be re-scanned. ! 834: */ ! 835: uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Semaphore" ! 836: ,cfg.inetmail_sem,sizeof(cfg.inetmail_sem)-1,K_EDIT); ! 837: break; ! 838: case 3: ! 839: i=0; ! 840: strcpy(opt[0],"Yes"); ! 841: strcpy(opt[1],"No"); ! 842: opt[2][0]=0; ! 843: SETHELP(WHERE); ! 844: /* ! 845: &Allow Users to Send Internet E-mail:& ! 846: ! 847: If you want your users to be allowed to send Internet E-mail, set this ! 848: option to &Yes&. ! 849: */ ! 850: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 851: ,"Allow Users to Send E-mail",opt); ! 852: if(!i && !(cfg.inetmail_misc&NMAIL_ALLOW)) { ! 853: uifc.changes=1; ! 854: cfg.inetmail_misc|=NMAIL_ALLOW; } ! 855: else if(i==1 && cfg.inetmail_misc&NMAIL_ALLOW) { ! 856: uifc.changes=1; ! 857: cfg.inetmail_misc&=~NMAIL_ALLOW; } ! 858: break; ! 859: case 4: ! 860: i=0; ! 861: strcpy(opt[0],"Yes"); ! 862: strcpy(opt[1],"No"); ! 863: opt[2][0]=0; ! 864: SETHELP(WHERE); ! 865: /* ! 866: &Allow Users to Send Internet E-mail File Attachments:& ! 867: ! 868: If you want your users to be allowed to send Internet E-mail with file ! 869: attachments, set this option to &Yes&. ! 870: */ ! 871: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 872: ,"Allow Users to Send E-mail with File Attachments",opt); ! 873: if(!i && !(cfg.inetmail_misc&NMAIL_FILE)) { ! 874: uifc.changes=1; ! 875: cfg.inetmail_misc|=NMAIL_FILE; } ! 876: else if(i==1 && cfg.inetmail_misc&NMAIL_FILE) { ! 877: uifc.changes=1; ! 878: cfg.inetmail_misc&=~NMAIL_FILE; } ! 879: break; ! 880: case 5: ! 881: i=1; ! 882: strcpy(opt[0],"Yes"); ! 883: strcpy(opt[1],"No"); ! 884: opt[2][0]=0; ! 885: SETHELP(WHERE); ! 886: /* ! 887: &Use Aliases in Internet E-mail:& ! 888: ! 889: If you allow aliases on your system and wish users to have their ! 890: Internet E-mail contain their alias as the &From User&, set this option to ! 891: &Yes&. If you want all E-mail to be sent using users' real names, set this ! 892: option to &No&. ! 893: */ ! 894: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 895: ,"Use Aliases in Internet E-mail",opt); ! 896: if(!i && !(cfg.inetmail_misc&NMAIL_ALIAS)) { ! 897: uifc.changes=1; ! 898: cfg.inetmail_misc|=NMAIL_ALIAS; } ! 899: else if(i==1 && cfg.inetmail_misc&NMAIL_ALIAS) { ! 900: uifc.changes=1; ! 901: cfg.inetmail_misc&=~NMAIL_ALIAS; } ! 902: break; ! 903: case 6: ! 904: ultoa(cfg.inetmail_cost,str,10); ! 905: SETHELP(WHERE); ! 906: /* ! 907: &Cost in Credits to Send Internet E-mail:& ! 908: ! 909: This is the number of credits it will cost your users to send Internet ! 910: E-mail. If you want the sending of Internet E-mail to be free, set this ! 911: value to &0&. ! 912: */ ! 913: uifc.input(WIN_MID|WIN_SAV,0,0 ! 914: ,"Cost in Credits to Send Internet E-mail" ! 915: ,str,10,K_EDIT|K_NUMBER); ! 916: cfg.inetmail_cost=atol(str); ! 917: break; } } } ! 918: ! 919: else { /* ESC */ ! 920: i=save_changes(WIN_MID|WIN_SAV); ! 921: if(i==-1) ! 922: continue; ! 923: if(!i) { ! 924: write_msgs_cfg(&cfg,backup_level); ! 925: refresh_cfg(&cfg); ! 926: } ! 927: break; ! 928: } ! 929: } ! 930: } ! 931: ! 932: void qhub_edit(int num) ! 933: { ! 934: static int qhub_dflt; ! 935: char *p,done=0,str[256]; ! 936: int i,j; ! 937: ! 938: while(!done) { ! 939: i=0; ! 940: sprintf(opt[i++],"%-27.27s%s","Hub System ID",cfg.qhub[num]->id); ! 941: sprintf(opt[i++],"%-27.27s%.40s","Pack Command Line",cfg.qhub[num]->pack); ! 942: sprintf(opt[i++],"%-27.27s%.40s","Unpack Command Line",cfg.qhub[num]->unpack); ! 943: sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.qhub[num]->call); ! 944: sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.qhub[num]->node); ! 945: sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.qhub[num]->days)); ! 946: if(cfg.qhub[num]->freq) { ! 947: sprintf(str,"%u times a day",1440/cfg.qhub[num]->freq); ! 948: sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); } ! 949: else { ! 950: sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60,cfg.qhub[num]->time%60); ! 951: sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); } ! 952: strcpy(opt[i++],"Networked Sub-boards..."); ! 953: opt[i][0]=0; ! 954: sprintf(str,"%s Network Hub",cfg.qhub[num]->id); ! 955: SETHELP(WHERE); ! 956: /* ! 957: &QWK Network Hub Configuration:& ! 958: ! 959: This menu allows you to configure options specific to this QWK network ! 960: hub. ! 961: */ ! 962: switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&qhub_dflt,0 ! 963: ,str,opt)) { ! 964: case -1: ! 965: done=1; ! 966: break; ! 967: case 0: ! 968: SETHELP(WHERE); ! 969: /* ! 970: &QWK Network Hub System ID:& ! 971: ! 972: This is the QWK System ID of this hub. It is used for incoming and ! 973: outgoing network packets and must be accurate. ! 974: */ ! 975: strcpy(str,cfg.qhub[num]->id); /* save */ ! 976: if(!uifc.input(WIN_MID|WIN_SAV,0,0,"QWK Network Hub System ID" ! 977: ,cfg.qhub[num]->id,LEN_QWKID,K_UPPER|K_EDIT)) ! 978: strcpy(cfg.qhub[num]->id,str); ! 979: break; ! 980: case 1: ! 981: SETHELP(WHERE); ! 982: /* ! 983: &REP Packet Creation Command:& ! 984: ! 985: This is the command line to use to create (compress) REP packets for ! 986: this QWK network hub. ! 987: */ ! 988: uifc.input(WIN_MID|WIN_SAV,0,0,"" ! 989: ,cfg.qhub[num]->pack,sizeof(cfg.qhub[num]->pack)-1,K_EDIT); ! 990: break; ! 991: case 2: ! 992: SETHELP(WHERE); ! 993: /* ! 994: &QWK Packet Extraction Command:& ! 995: ! 996: This is the command line to use to extract (decompress) QWK packets from ! 997: this QWK network hub. ! 998: */ ! 999: uifc.input(WIN_MID|WIN_SAV,0,0,"" ! 1000: ,cfg.qhub[num]->unpack,sizeof(cfg.qhub[num]->unpack)-1,K_EDIT); ! 1001: break; ! 1002: case 3: ! 1003: SETHELP(WHERE); ! 1004: /* ! 1005: &QWK Network Hub Call-out Command Line:& ! 1006: ! 1007: This is the command line to use to initiate a call-out to this QWK ! 1008: network hub. ! 1009: */ ! 1010: uifc.input(WIN_MID|WIN_SAV,0,0,"" ! 1011: ,cfg.qhub[num]->call,sizeof(cfg.qhub[num]->call)-1,K_EDIT); ! 1012: break; ! 1013: case 4: ! 1014: sprintf(str,"%u",cfg.qhub[num]->node); ! 1015: SETHELP(WHERE); ! 1016: /* ! 1017: &Node to Perform Call-out:& ! 1018: ! 1019: This is the number of the node to perform the call-out for this QWK ! 1020: network hub. ! 1021: */ ! 1022: uifc.input(WIN_MID|WIN_SAV,0,0 ! 1023: ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); ! 1024: cfg.qhub[num]->node=atoi(str); ! 1025: break; ! 1026: case 5: ! 1027: j=0; ! 1028: while(1) { ! 1029: for(i=0;i<7;i++) ! 1030: sprintf(opt[i],"%s %s" ! 1031: ,wday[i],(cfg.qhub[num]->days&(1<<i)) ? "Yes":"No"); ! 1032: opt[i][0]=0; ! 1033: SETHELP(WHERE); ! 1034: /* ! 1035: &Days to Perform Call-out:& ! 1036: ! 1037: These are the days that a call-out will be performed for this QWK ! 1038: network hub. ! 1039: */ ! 1040: i=uifc.list(WIN_MID,0,0,0,&j,0 ! 1041: ,"Days to Perform Call-out",opt); ! 1042: if(i==-1) ! 1043: break; ! 1044: cfg.qhub[num]->days^=(1<<i); ! 1045: uifc.changes=1; } ! 1046: break; ! 1047: case 6: ! 1048: i=1; ! 1049: strcpy(opt[0],"Yes"); ! 1050: strcpy(opt[1],"No"); ! 1051: opt[2][0]=0; ! 1052: SETHELP(WHERE); ! 1053: /* ! 1054: &Perform Call-out at a Specific Time:& ! 1055: ! 1056: If you want the system call this QWK network hub at a specific time, ! 1057: set this option to &Yes&. If you want the system to call this network ! 1058: hub more than once a day at predetermined intervals, set this option to ! 1059: &No&. ! 1060: */ ! 1061: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1062: ,"Perform Call-out at a Specific Time",opt); ! 1063: if(i==0) { ! 1064: sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60 ! 1065: ,cfg.qhub[num]->time%60); ! 1066: SETHELP(WHERE); ! 1067: /* ! 1068: &Time to Perform Call-out:& ! 1069: ! 1070: This is the time (in 24 hour HH:MM format) to perform the call-out to ! 1071: this QWK network hub. ! 1072: */ ! 1073: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1074: ,"Time to Perform Call-out (HH:MM)" ! 1075: ,str,5,K_UPPER|K_EDIT)>0) { ! 1076: cfg.qhub[num]->freq=0; ! 1077: cfg.qhub[num]->time=atoi(str)*60; ! 1078: if((p=strchr(str,':'))!=NULL) ! 1079: cfg.qhub[num]->time+=atoi(p+1); } } ! 1080: else if(i==1) { ! 1081: sprintf(str,"%u",cfg.qhub[num]->freq ! 1082: && cfg.qhub[num]->freq<=1440 ? 1440/cfg.qhub[num]->freq : 0); ! 1083: SETHELP(WHERE); ! 1084: /* ! 1085: &Number of Call-outs Per Day:& ! 1086: ! 1087: This is the maximum number of times the system will perform a call-out ! 1088: per day to this QWK network hub. This value is actually converted by ! 1089: Synchronet into minutes between call-outs and when the BBS is idle ! 1090: and this number of minutes since the last call-out is reached, it will ! 1091: perform a call-out. ! 1092: */ ! 1093: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1094: ,"Number of Call-outs Per Day" ! 1095: ,str,4,K_NUMBER|K_EDIT)>0) { ! 1096: cfg.qhub[num]->time=0; ! 1097: i=atoi(str); ! 1098: if(i && i<=1440) ! 1099: cfg.qhub[num]->freq=1440/i; ! 1100: else ! 1101: cfg.qhub[num]->freq=0; } } ! 1102: break; ! 1103: case 7: ! 1104: qhub_sub_edit(num); ! 1105: break; } } ! 1106: } ! 1107: ! 1108: void qhub_sub_edit(uint num) ! 1109: { ! 1110: char str[256]; ! 1111: int j,k,l,m,n,bar=0; ! 1112: ! 1113: k=0; ! 1114: while(1) { ! 1115: for(j=0;j<cfg.qhub[num]->subs;j++) ! 1116: sprintf(opt[j],"%-5u %-*.*s %-*.*s" ! 1117: ,cfg.qhub[num]->conf[j] ! 1118: ,LEN_GSNAME,LEN_GSNAME ! 1119: ,cfg.grp[cfg.sub[cfg.qhub[num]->sub[j]]->grp]->sname ! 1120: ,LEN_SSNAME,LEN_SSNAME ! 1121: ,cfg.sub[cfg.qhub[num]->sub[j]]->sname); ! 1122: opt[j][0]=0; ! 1123: j=WIN_BOT|WIN_SAV|WIN_ACT; ! 1124: if(cfg.qhub[num]->subs<MAX_OPTS) ! 1125: j|=WIN_INS|WIN_INSACT|WIN_XTR; ! 1126: if(cfg.qhub[num]->subs) ! 1127: j|=WIN_DEL; ! 1128: SETHELP(WHERE); ! 1129: /* ! 1130: &QWK Networked Sub-boards:& ! 1131: ! 1132: This is a list of the sub-boards that are networked with this QWK ! 1133: network hub. ! 1134: ! 1135: To add a sub-board, select the desired location and hit INS . ! 1136: ! 1137: To remove a sub-board, select it and hit DEL . ! 1138: ! 1139: To configure a sub-board for this QWK network hub, select it and hit ! 1140: ENTER . ! 1141: */ ! 1142: j=uifc.list(j,0,0,0,&k,&bar ! 1143: ,"Networked Sub-boards",opt); ! 1144: if(j==-1) ! 1145: break; ! 1146: if((j&MSK_ON)==MSK_INS) { ! 1147: j&=MSK_OFF; ! 1148: if((l=getsub())==-1) ! 1149: continue; ! 1150: SETHELP(WHERE); ! 1151: /* ! 1152: &Conference Number on Hub:& ! 1153: ! 1154: This is the number of the conference on the QWK network hub, that this ! 1155: sub-board is networked with. On Synchronet systems, this number is ! 1156: derived by multiplying the group number by 10 and adding the sub-board ! 1157: number. For example, group 2, sub-board 3, is conference number 203. ! 1158: ! 1159: It is important to understand that this is &NOT& the conference number of ! 1160: this sub-board on your system. It is the number of the conference this ! 1161: sub-board is networked with on this &QWK network hub&. ! 1162: */ ! 1163: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1164: ,"Conference Number on Hub" ! 1165: ,str,5,K_NUMBER)<1) ! 1166: continue; ! 1167: strcpy(opt[0],"Strip out"); ! 1168: strcpy(opt[1],"Leave in"); ! 1169: strcpy(opt[2],"Expand to ANSI"); ! 1170: opt[3][0]=0; ! 1171: m=0; ! 1172: SETHELP(WHERE); ! 1173: /* ! 1174: &Ctrl-A Codes:& ! 1175: ! 1176: You are being prompted for the method of handling Ctrl-A attribute codes ! 1177: generated by Synchronet. If this QWK network hub is a Synchronet BBS, ! 1178: set this option to &Leave in&. If the QWK network hub is not a Synchronet ! 1179: BBS, but allows ANSI escape sequences in messages, set this option to ! 1180: &Expand to ANSI&. If the QWK network hub is not a Synchronet BBS and does ! 1181: not support ANSI escape sequences in messages (or you're not sure), set ! 1182: this option to &Strip out&. ! 1183: */ ! 1184: if((m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0 ! 1185: ,"Ctrl-A Codes",opt))==-1) ! 1186: continue; ! 1187: if((cfg.qhub[num]->sub=(ushort *)realloc(cfg.qhub[num]->sub ! 1188: ,sizeof(ushort *)*(cfg.qhub[num]->subs+1)))==NULL ! 1189: || (cfg.qhub[num]->conf=(ushort *)realloc(cfg.qhub[num]->conf ! 1190: ,sizeof(ushort *)*(cfg.qhub[num]->subs+1)))==NULL ! 1191: || (cfg.qhub[num]->mode=(uchar *)realloc(cfg.qhub[num]->mode ! 1192: ,sizeof(uchar *)*(cfg.qhub[num]->subs+1)))==NULL) { ! 1193: errormsg(WHERE,ERR_ALLOC,nulstr,cfg.qhub[num]->subs+1); ! 1194: continue; } ! 1195: if(cfg.qhub[num]->subs) /* insert */ ! 1196: for(n=cfg.qhub[num]->subs;n>j;n--) { ! 1197: cfg.qhub[num]->sub[n]=cfg.qhub[num]->sub[n-1]; ! 1198: cfg.qhub[num]->conf[n]=cfg.qhub[num]->conf[n-1]; ! 1199: cfg.qhub[num]->mode[n]=cfg.qhub[num]->mode[n-1]; } ! 1200: if(!m) ! 1201: cfg.qhub[num]->mode[j]=A_STRIP; ! 1202: else if(m==1) ! 1203: cfg.qhub[num]->mode[j]=A_LEAVE; ! 1204: else ! 1205: cfg.qhub[num]->mode[j]=A_EXPAND; ! 1206: cfg.qhub[num]->sub[j]=l; ! 1207: cfg.qhub[num]->conf[j]=atoi(str); ! 1208: cfg.qhub[num]->subs++; ! 1209: uifc.changes=1; ! 1210: continue; } ! 1211: if((j&MSK_ON)==MSK_DEL) { ! 1212: j&=MSK_OFF; ! 1213: cfg.qhub[num]->subs--; ! 1214: while(j<cfg.qhub[num]->subs) { ! 1215: cfg.qhub[num]->sub[j]=cfg.qhub[num]->sub[j+1]; ! 1216: cfg.qhub[num]->mode[j]=cfg.qhub[num]->mode[j+1]; ! 1217: cfg.qhub[num]->conf[j]=cfg.qhub[num]->conf[j+1]; ! 1218: j++; } ! 1219: uifc.changes=1; ! 1220: continue; } ! 1221: l=0; ! 1222: while(1) { ! 1223: n=0; ! 1224: sprintf(opt[n++],"%-22.22s%.*s %.*s" ! 1225: ,"Sub-board" ! 1226: ,LEN_GSNAME ! 1227: ,cfg.grp[cfg.sub[cfg.qhub[num]->sub[j]]->grp]->sname ! 1228: ,LEN_SSNAME ! 1229: ,cfg.sub[cfg.qhub[num]->sub[j]]->sname); ! 1230: sprintf(opt[n++],"%-22.22s%u" ! 1231: ,"Conference Number",cfg.qhub[num]->conf[j]); ! 1232: sprintf(opt[n++],"%-22.22s%s" ! 1233: ,"Ctrl-A Codes",cfg.qhub[num]->mode[j]==A_STRIP ? ! 1234: "Strip out" : cfg.qhub[num]->mode[j]==A_LEAVE ? ! 1235: "Leave in" : "Expand to ANSI"); ! 1236: opt[n][0]=0; ! 1237: SETHELP(WHERE); ! 1238: /* ! 1239: &QWK Netted Sub-board:& ! 1240: ! 1241: You are configuring the options for this sub-board for this QWK network ! 1242: hub. ! 1243: */ ! 1244: l=uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0, ! 1245: 22+LEN_GSNAME+LEN_SSNAME,&l,0 ! 1246: ,"Netted Sub-board",opt); ! 1247: if(l==-1) ! 1248: break; ! 1249: if(!l) { ! 1250: m=getsub(); ! 1251: if(m!=-1) { ! 1252: cfg.qhub[num]->sub[j]=m; ! 1253: uifc.changes=1; } } ! 1254: else if(l==1) { ! 1255: SETHELP(WHERE); ! 1256: /* ! 1257: &Conference Number on Hub:& ! 1258: ! 1259: This is the number of the conference on the QWK network hub, that this ! 1260: sub-board is networked with. On Synchronet systems, this number is ! 1261: derived by multiplying the group number by 10 and adding the sub-board ! 1262: number. For example, group 2, sub-board 3, is conference number 203. ! 1263: ! 1264: It is important to understand that this is &NOT& the conference number of ! 1265: this sub-board on your system. It is the number of the conference this ! 1266: sub-board is networked with on this &QWK network hub&. ! 1267: */ ! 1268: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1269: ,"Conference Number on Hub" ! 1270: ,str,5,K_NUMBER)>0) ! 1271: cfg.qhub[num]->conf[j]=atoi(str); } ! 1272: else if(l==2) { ! 1273: strcpy(opt[0],"Strip out"); ! 1274: strcpy(opt[1],"Leave in"); ! 1275: strcpy(opt[2],"Expand to ANSI"); ! 1276: opt[3][0]=0; ! 1277: m=0; ! 1278: SETHELP(WHERE); ! 1279: /* ! 1280: &Ctrl-A Codes:& ! 1281: ! 1282: You are being prompted for the method of handling Ctrl-A attribute codes ! 1283: generated by Synchronet. If this QWK network hub is a Synchronet BBS, ! 1284: set this option to &Leave in&. If the QWK network hub is not a Synchronet ! 1285: BBS, but allows ANSI escape sequences in messages, set this option to ! 1286: &Expand to ANSI&. If the QWK network hub is not a Synchronet BBS and does ! 1287: not support ANSI escape sequences in messages (or you're not sure), set ! 1288: this option to &Strip out&. ! 1289: */ ! 1290: m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0 ! 1291: ,"Ctrl-A Codes",opt); ! 1292: uifc.changes=1; ! 1293: if(!m) ! 1294: cfg.qhub[num]->mode[j]=A_STRIP; ! 1295: else if(m==1) ! 1296: cfg.qhub[num]->mode[j]=A_LEAVE; ! 1297: else if(m==2) ! 1298: cfg.qhub[num]->mode[j]=A_EXPAND; } } } ! 1299: } ! 1300: ! 1301: void phub_edit(int num) ! 1302: { ! 1303: static int phub_dflt; ! 1304: char *p,done=0,str[256]; ! 1305: int i,j; ! 1306: ! 1307: while(!done) { ! 1308: i=0; ! 1309: sprintf(opt[i++],"%-27.27s%s","Hub Site Name",cfg.phub[num]->name); ! 1310: sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.phub[num]->call); ! 1311: sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.phub[num]->node); ! 1312: sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.phub[num]->days)); ! 1313: if(cfg.phub[num]->freq) { ! 1314: sprintf(str,"%u times a day",1440/cfg.phub[num]->freq); ! 1315: sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); } ! 1316: else { ! 1317: sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60 ! 1318: ,cfg.phub[num]->time%60); ! 1319: sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); } ! 1320: opt[i][0]=0; ! 1321: sprintf(str,"%s Network Hub",cfg.phub[num]->name); ! 1322: SETHELP(WHERE); ! 1323: /* ! 1324: &PostLink Network Hub Configuration:& ! 1325: ! 1326: This menu allows you to configure options specific to this network hub. ! 1327: */ ! 1328: switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&phub_dflt,0 ! 1329: ,str,opt)) { ! 1330: case -1: ! 1331: done=1; ! 1332: break; ! 1333: case 0: ! 1334: SETHELP(WHERE); ! 1335: /* ! 1336: &Network Hub Site Name:& ! 1337: ! 1338: This is the Site Name of this hub. It is used for only for reference. ! 1339: */ ! 1340: strcpy(str,cfg.phub[num]->name); /* save */ ! 1341: if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Hub Site Name" ! 1342: ,cfg.phub[num]->name,sizeof(cfg.phub[num]->name)-1,K_UPPER|K_EDIT)) ! 1343: strcpy(cfg.phub[num]->name,str); /* restore */ ! 1344: break; ! 1345: case 1: ! 1346: SETHELP(WHERE); ! 1347: /* ! 1348: &Network Hub Call-out Command Line:& ! 1349: ! 1350: This is the command line to use to initiate a call-out to this network ! 1351: hub. ! 1352: */ ! 1353: uifc.input(WIN_MID|WIN_SAV,0,0,"Call-out Command" ! 1354: ,cfg.phub[num]->call,sizeof(cfg.phub[num]->call)-1,K_EDIT); ! 1355: break; ! 1356: case 2: ! 1357: sprintf(str,"%u",cfg.phub[num]->node); ! 1358: SETHELP(WHERE); ! 1359: /* ! 1360: &Node to Perform Call-out:& ! 1361: ! 1362: This is the number of the node to perform the call-out for this network ! 1363: hub. ! 1364: */ ! 1365: uifc.input(WIN_MID|WIN_SAV,0,0 ! 1366: ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); ! 1367: cfg.phub[num]->node=atoi(str); ! 1368: break; ! 1369: case 3: ! 1370: j=0; ! 1371: while(1) { ! 1372: for(i=0;i<7;i++) ! 1373: sprintf(opt[i],"%s %s" ! 1374: ,wday[i],(cfg.phub[num]->days&(1<<i)) ? "Yes":"No"); ! 1375: opt[i][0]=0; ! 1376: SETHELP(WHERE); ! 1377: /* ! 1378: &Days to Perform Call-out:& ! 1379: ! 1380: These are the days that a call-out will be performed for this network ! 1381: hub. ! 1382: */ ! 1383: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0 ! 1384: ,"Days to Perform Call-out",opt); ! 1385: if(i==-1) ! 1386: break; ! 1387: cfg.phub[num]->days^=(1<<i); ! 1388: uifc.changes=1; } ! 1389: break; ! 1390: case 4: ! 1391: i=1; ! 1392: strcpy(opt[0],"Yes"); ! 1393: strcpy(opt[1],"No"); ! 1394: opt[2][0]=0; ! 1395: SETHELP(WHERE); ! 1396: /* ! 1397: &Perform Call-out at a Specific Time:& ! 1398: ! 1399: If you want the system call this network hub at a specific time, set ! 1400: this option to &Yes&. If you want the system to call this hub more than ! 1401: once a day at predetermined intervals, set this option to &No&. ! 1402: */ ! 1403: i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 ! 1404: ,"Perform Call-out at a Specific Time",opt); ! 1405: if(i==0) { ! 1406: sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60 ! 1407: ,cfg.phub[num]->time%60); ! 1408: SETHELP(WHERE); ! 1409: /* ! 1410: &Time to Perform Call-out:& ! 1411: ! 1412: This is the time (in 24 hour HH:MM format) to perform the call-out to ! 1413: this network hub. ! 1414: */ ! 1415: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1416: ,"Time to Perform Call-out (HH:MM)" ! 1417: ,str,5,K_UPPER|K_EDIT)>0) { ! 1418: cfg.phub[num]->freq=0; ! 1419: cfg.phub[num]->time=atoi(str)*60; ! 1420: if((p=strchr(str,':'))!=NULL) ! 1421: cfg.phub[num]->time+=atoi(p+1); } } ! 1422: else if(i==1) { ! 1423: sprintf(str,"%u",cfg.phub[num]->freq ! 1424: && cfg.phub[num]->freq<=1440 ? 1440/cfg.phub[num]->freq : 0); ! 1425: SETHELP(WHERE); ! 1426: /* ! 1427: &Number of Call-outs Per Day:& ! 1428: ! 1429: This is the maximum number of times the system will perform a call-out ! 1430: per day to this network hub. This value is actually converted by ! 1431: Synchronet into minutes between call-outs and when the BBS is idle ! 1432: and this number of minutes since the last call-out is reached, it will ! 1433: perform a call-out. ! 1434: */ ! 1435: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1436: ,"Number of Call-outs Per Day" ! 1437: ,str,4,K_NUMBER|K_EDIT)>0) { ! 1438: cfg.phub[num]->time=0; ! 1439: i=atoi(str); ! 1440: if(i && i<=1440) ! 1441: cfg.phub[num]->freq=1440/i; ! 1442: else ! 1443: cfg.phub[num]->freq=0; } } ! 1444: break; } } ! 1445: } ! 1446: ! 1447: char *daystr(char days) ! 1448: { ! 1449: static char str[256]; ! 1450: int i; ! 1451: ! 1452: days&=0x7f; ! 1453: ! 1454: if(days==0) return("None"); ! 1455: ! 1456: if(days==0x7f) return("All"); ! 1457: ! 1458: str[0]=0; ! 1459: for(i=0;i<7;i++) { ! 1460: if(days&(1<<i)) { ! 1461: strcat(str,wday[i]); ! 1462: strcat(str," "); ! 1463: } ! 1464: } ! 1465: return(str); ! 1466: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.