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