diff --git a/src/sbbs3/scfg/scfgchat.c b/src/sbbs3/scfg/scfgchat.c index 52cf427051424b93bda34801f5141fb0b7ed806c..75e05562dcfc57255491fa3acd0896767e053304 100644 --- a/src/sbbs3/scfg/scfgchat.c +++ b/src/sbbs3/scfg/scfgchat.c @@ -42,158 +42,158 @@ void page_cfg() uint u; static page_t savpage; -while(1) { - for(i=0;i<cfg.total_pages && i<MAX_OPTS;i++) - sprintf(opt[i],"%-40.40s %-.20s",cfg.page[i]->cmd,cfg.page[i]->arstr); - opt[i][0]=0; - j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; - if(cfg.total_pages) - j|=WIN_DEL|WIN_COPY|WIN_CUT; - if(cfg.total_pages<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savpage.cmd[0]) - j|=WIN_PASTE; - uifc.helpbuf= - "`External Sysop Chat Pagers:`\n" - "\n" - "This is a list of the configured external sysop chat pagers.\n" - "\n" - "To add a pager, select the desired location and hit ~ INS ~.\n" - "\n" - "To delete a pager, select it and hit ~ DEL ~.\n" - "\n" - "To configure a pager, select it and hit ~ ENTER ~.\n" - ; - i=uifc.list(j,0,0,45,&dflt,&bar,"External Sysop Chat Pagers",opt); - if((signed)i==-1) - return; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { - sprintf(str,"%%!tone +chatpage.ton"); + while(1) { + for(i=0;i<cfg.total_pages && i<MAX_OPTS;i++) + sprintf(opt[i],"%-40.40s %-.20s",cfg.page[i]->cmd,cfg.page[i]->arstr); + opt[i][0]=0; + j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; + if(cfg.total_pages) + j|=WIN_DEL|WIN_COPY|WIN_CUT; + if(cfg.total_pages<MAX_OPTS) + j|=WIN_INS|WIN_INSACT|WIN_XTR; + if(savpage.cmd[0]) + j|=WIN_PASTE; uifc.helpbuf= - "`External Chat Pager Command Line:`\n" + "`External Sysop Chat Pagers:`\n" + "\n" + "This is a list of the configured external sysop chat pagers.\n" + "\n" + "To add a pager, select the desired location and hit ~ INS ~.\n" "\n" - "This is the command line to execute for this external chat pager.\n" + "To delete a pager, select it and hit ~ DEL ~.\n" + "\n" + "To configure a pager, select it and hit ~ ENTER ~.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Command Line",str,50 - ,K_EDIT)<1) - continue; - if((cfg.page=(page_t **)realloc(cfg.page,sizeof(page_t *)*(cfg.total_pages+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_pages+1); - cfg.total_pages=0; - bail(1); - continue; + i=uifc.list(j,0,0,45,&dflt,&bar,"External Sysop Chat Pagers",opt); + if((signed)i==-1) + return; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + sprintf(str,"%%!tone +chatpage.ton"); + uifc.helpbuf= + "`External Chat Pager Command Line:`\n" + "\n" + "This is the command line to execute for this external chat pager.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Command Line",str,50 + ,K_EDIT)<1) + continue; + if((cfg.page=(page_t **)realloc(cfg.page,sizeof(page_t *)*(cfg.total_pages+1))) + ==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_pages+1); + cfg.total_pages=0; + bail(1); + continue; + } + if(cfg.total_pages) + for(u=cfg.total_pages;u>i;u--) + cfg.page[u]=cfg.page[u-1]; + if((cfg.page[i]=(page_t *)malloc(sizeof(page_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t)); + continue; + } + memset((page_t *)cfg.page[i],0,sizeof(page_t)); + strcpy(cfg.page[i]->cmd,str); + cfg.total_pages++; + uifc.changes=1; + continue; } - if(cfg.total_pages) - for(u=cfg.total_pages;u>i;u--) - cfg.page[u]=cfg.page[u-1]; - if((cfg.page[i]=(page_t *)malloc(sizeof(page_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t)); + if (msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savpage = *cfg.page[i]; + free(cfg.page[i]); + cfg.total_pages--; + for(j=i;j<cfg.total_pages;j++) + cfg.page[j]=cfg.page[j+1]; + uifc.changes=1; continue; } - memset((page_t *)cfg.page[i],0,sizeof(page_t)); - strcpy(cfg.page[i]->cmd,str); - cfg.total_pages++; - uifc.changes=1; - continue; - } - if (msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savpage = *cfg.page[i]; - free(cfg.page[i]); - cfg.total_pages--; - for(j=i;j<cfg.total_pages;j++) - cfg.page[j]=cfg.page[j+1]; - uifc.changes=1; - continue; - } - if (msk == MSK_COPY) { - savpage=*cfg.page[i]; - continue; - } - if (msk == MSK_PASTE) { - *cfg.page[i]=savpage; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%.40s","Command Line",cfg.page[i]->cmd); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.page[i]->arstr); - sprintf(opt[k++],"%-27.27s%s","Intercept I/O" - ,(cfg.page[i]->misc&XTRN_STDIO) ? "Standard" - :cfg.page[i]->misc&XTRN_CONIO ? "Console":"No"); - opt[k][0]=0; - sprintf(str,"Sysop Chat Pager #%d",i+1); - switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf= - "`External Chat Pager Command Line:`\n" - "\n" - "This is the command line to execute for this external chat pager.\n" - ; - strcpy(str,cfg.page[i]->cmd); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Command Line" - ,cfg.page[i]->cmd,sizeof(cfg.page[i]->cmd)-1,K_EDIT)) - strcpy(cfg.page[i]->cmd,str); - break; - case 1: - getar(str,cfg.page[i]->arstr); - break; - case 2: - switch(cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) { - case XTRN_STDIO: - k=0; - break; - case XTRN_CONIO: - k=1; - break; - default: - k=2; - } - strcpy(opt[0],"Standard"); - strcpy(opt[1],"Console"); - strcpy(opt[2],"No"); - opt[3][0]=0; - uifc.helpbuf= - "`Intercept I/O:`\n" - "\n" - "If you wish the screen output and keyboard input to be intercepted\n" - "when running this chat pager, set this option to either `Standard` or ~Console~.\n" - ; - switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O" - ,opt)) { + if (msk == MSK_COPY) { + savpage=*cfg.page[i]; + continue; + } + if (msk == MSK_PASTE) { + *cfg.page[i]=savpage; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + j=0; + done=0; + while(!done) { + k=0; + sprintf(opt[k++],"%-27.27s%.40s","Command Line",cfg.page[i]->cmd); + sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.page[i]->arstr); + sprintf(opt[k++],"%-27.27s%s","Intercept I/O" + ,(cfg.page[i]->misc&XTRN_STDIO) ? "Standard" + :cfg.page[i]->misc&XTRN_CONIO ? "Console":"No"); + opt[k][0]=0; + sprintf(str,"Sysop Chat Pager #%d",i+1); + switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) { + case -1: + done=1; + break; case 0: - if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_STDIO) { - cfg.page[i]->misc|=XTRN_STDIO; - cfg.page[i]->misc&=~XTRN_CONIO; - uifc.changes=1; - } + uifc.helpbuf= + "`External Chat Pager Command Line:`\n" + "\n" + "This is the command line to execute for this external chat pager.\n" + ; + strcpy(str,cfg.page[i]->cmd); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Command Line" + ,cfg.page[i]->cmd,sizeof(cfg.page[i]->cmd)-1,K_EDIT)) + strcpy(cfg.page[i]->cmd,str); break; case 1: - if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_CONIO) { - cfg.page[i]->misc|=XTRN_CONIO; - cfg.page[i]->misc&=~XTRN_STDIO; - uifc.changes=1; - } + getar(str,cfg.page[i]->arstr); break; case 2: - if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != 0) { - cfg.page[i]->misc&=~(XTRN_STDIO|XTRN_CONIO); - uifc.changes=1; + switch(cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) { + case XTRN_STDIO: + k=0; + break; + case XTRN_CONIO: + k=1; + break; + default: + k=2; + } + strcpy(opt[0],"Standard"); + strcpy(opt[1],"Console"); + strcpy(opt[2],"No"); + opt[3][0]=0; + uifc.helpbuf= + "`Intercept I/O:`\n" + "\n" + "If you wish the screen output and keyboard input to be intercepted\n" + "when running this chat pager, set this option to either `Standard` or ~Console~.\n" + ; + switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O" + ,opt)) { + case 0: + if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_STDIO) { + cfg.page[i]->misc|=XTRN_STDIO; + cfg.page[i]->misc&=~XTRN_CONIO; + uifc.changes=1; + } + break; + case 1: + if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_CONIO) { + cfg.page[i]->misc|=XTRN_CONIO; + cfg.page[i]->misc&=~XTRN_STDIO; + uifc.changes=1; + } + break; + case 2: + if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != 0) { + cfg.page[i]->misc&=~(XTRN_STDIO|XTRN_CONIO); + uifc.changes=1; + } + break; } break; - } - break; } } } @@ -207,255 +207,255 @@ void chan_cfg() uint i,u; static chan_t savchan; -while(1) { - for(i=0;i<cfg.total_chans && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",cfg.chan[i]->name); - opt[i][0]=0; - j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT; - if(cfg.total_chans) - j|=WIN_DEL|WIN_COPY|WIN_CUT; - if(cfg.total_chans<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savchan.name[0]) - j|=WIN_PASTE; - uifc.helpbuf= - "`Multinode Chat Channels:`\n" - "\n" - "This is a list of the configured multinode chat channels.\n" - "\n" - "To add a channel, select the desired location with the arrow keys and\n" - "hit ~ INS ~.\n" - "\n" - "To delete a channel, select it with the arrow keys and hit ~ DEL ~.\n" - "\n" - "To configure a channel, select it with the arrow keys and hit ~ ENTER ~.\n" - ; - i=uifc.list(j,0,0,45,&chan_dflt,&chan_bar,"Multinode Chat Channels",opt); - if((signed)i==-1) - return; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { - strcpy(str,"Open"); + while(1) { + for(i=0;i<cfg.total_chans && i<MAX_OPTS;i++) + sprintf(opt[i],"%-25s",cfg.chan[i]->name); + opt[i][0]=0; + j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT; + if(cfg.total_chans) + j|=WIN_DEL|WIN_COPY|WIN_CUT; + if(cfg.total_chans<MAX_OPTS) + j|=WIN_INS|WIN_INSACT|WIN_XTR; + if(savchan.name[0]) + j|=WIN_PASTE; uifc.helpbuf= - "`Channel Name:`\n" + "`Multinode Chat Channels:`\n" "\n" - "This is the name or description of the chat channel.\n" - ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Channel Name",str,25 - ,K_EDIT)<1) - continue; - SAFECOPY(code,str); - prep_code(code,/* prefix: */NULL); - uifc.helpbuf= - "`Chat Channel Internal Code:`\n" + "This is a list of the configured multinode chat channels.\n" + "\n" + "To add a channel, select the desired location with the arrow keys and\n" + "hit ~ INS ~.\n" "\n" - "Every chat channel must have its own unique code for Synchronet to refer\n" - "to it internally. This code is usually an abbreviation of the chat\n" - "channel name.\n" + "To delete a channel, select it with the arrow keys and hit ~ DEL ~.\n" + "\n" + "To configure a channel, select it with the arrow keys and hit ~ ENTER ~.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code" - ,code,LEN_CODE,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - uifc.helpbuf=invalid_code; - uifc.msg("Invalid Code"); - uifc.helpbuf=0; - continue; + i=uifc.list(j,0,0,45,&chan_dflt,&chan_bar,"Multinode Chat Channels",opt); + if((signed)i==-1) + return; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + strcpy(str,"Open"); + uifc.helpbuf= + "`Channel Name:`\n" + "\n" + "This is the name or description of the chat channel.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Channel Name",str,25 + ,K_EDIT)<1) + continue; + SAFECOPY(code,str); + prep_code(code,/* prefix: */NULL); + uifc.helpbuf= + "`Chat Channel Internal Code:`\n" + "\n" + "Every chat channel must have its own unique code for Synchronet to refer\n" + "to it internally. This code is usually an abbreviation of the chat\n" + "channel name.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code" + ,code,LEN_CODE,K_EDIT|K_UPPER)<1) + continue; + if(!code_ok(code)) { + uifc.helpbuf=invalid_code; + uifc.msg("Invalid Code"); + uifc.helpbuf=0; + continue; + } + if((cfg.chan=(chan_t **)realloc(cfg.chan,sizeof(chan_t *)*(cfg.total_chans+1))) + ==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chans+1); + cfg.total_chans=0; + bail(1); + continue; + } + if(cfg.total_chans) + for(u=cfg.total_chans;u>i;u--) + cfg.chan[u]=cfg.chan[u-1]; + if((cfg.chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t)); + continue; + } + memset((chan_t *)cfg.chan[i],0,sizeof(chan_t)); + strcpy(cfg.chan[i]->name,str); + strcpy(cfg.chan[i]->code,code); + cfg.total_chans++; + uifc.changes=1; + continue; } - if((cfg.chan=(chan_t **)realloc(cfg.chan,sizeof(chan_t *)*(cfg.total_chans+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chans+1); - cfg.total_chans=0; - bail(1); - continue; + if (msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savchan = *cfg.chan[i]; + free(cfg.chan[i]); + cfg.total_chans--; + for(j=i;j<cfg.total_chans;j++) + cfg.chan[j]=cfg.chan[j+1]; + uifc.changes=1; + continue; } - if(cfg.total_chans) - for(u=cfg.total_chans;u>i;u--) - cfg.chan[u]=cfg.chan[u-1]; - if((cfg.chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t)); + if (msk == MSK_COPY) { + savchan=*cfg.chan[i]; continue; } - memset((chan_t *)cfg.chan[i],0,sizeof(chan_t)); - strcpy(cfg.chan[i]->name,str); - strcpy(cfg.chan[i]->code,code); - cfg.total_chans++; - uifc.changes=1; - continue; - } - if (msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savchan = *cfg.chan[i]; - free(cfg.chan[i]); - cfg.total_chans--; - for(j=i;j<cfg.total_chans;j++) - cfg.chan[j]=cfg.chan[j+1]; - uifc.changes=1; - continue; - } - if (msk == MSK_COPY) { - savchan=*cfg.chan[i]; - continue; - } - if (msk == MSK_PASTE) { - *cfg.chan[i]=savchan; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Name",cfg.chan[i]->name); - sprintf(opt[k++],"%-27.27s%s","Internal Code",cfg.chan[i]->code); - sprintf(opt[k++],"%-27.27s%"PRIu32,"Cost in Credits",cfg.chan[i]->cost); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements" - ,cfg.chan[i]->arstr); - sprintf(opt[k++],"%-27.27s%s","Password Protection" - ,cfg.chan[i]->misc&CHAN_PW ? "Yes" : "No"); - sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty" - ,cfg.chan[i]->misc&CHAN_GURU ? "Yes" : "No"); - sprintf(opt[k++],"%-27.27s%s","Channel Guru" - ,cfg.chan[i]->guru<cfg.total_gurus ? cfg.guru[cfg.chan[i]->guru]->name : ""); - sprintf(opt[k++],"%-27.27s%s","Channel Action Set" - ,cfg.actset[cfg.chan[i]->actset]->name); - opt[k][0]=0; - uifc.helpbuf= - "`Chat Channel Configuration:`\n" - "\n" - "This menu is for configuring the selected chat channel.\n" - ; - sprintf(str,"%s Chat Channel",cfg.chan[i]->name); - switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf= - "`Chat Channel Name:`\n" - "\n" - "This is the name or description of the chat channel.\n" - ; - strcpy(str,cfg.chan[i]->name); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Channel Name" - ,cfg.chan[i]->name,sizeof(cfg.chan[i]->name)-1,K_EDIT)) - strcpy(cfg.chan[i]->name,str); - break; - case 1: - uifc.helpbuf= - "`Chat Channel Internal Code:`\n" - "\n" - "Every chat channel must have its own unique code for Synchronet to refer\n" - "to it internally. This code is usually an abbreviation of the chat\n" - "channel name.\n" - ; - strcpy(str,cfg.chan[i]->code); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Internal Code" - ,str,LEN_CODE,K_UPPER|K_EDIT)) + if (msk == MSK_PASTE) { + *cfg.chan[i]=savchan; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + j=0; + done=0; + while(!done) { + k=0; + sprintf(opt[k++],"%-27.27s%s","Name",cfg.chan[i]->name); + sprintf(opt[k++],"%-27.27s%s","Internal Code",cfg.chan[i]->code); + sprintf(opt[k++],"%-27.27s%"PRIu32,"Cost in Credits",cfg.chan[i]->cost); + sprintf(opt[k++],"%-27.27s%.40s","Access Requirements" + ,cfg.chan[i]->arstr); + sprintf(opt[k++],"%-27.27s%s","Password Protection" + ,cfg.chan[i]->misc&CHAN_PW ? "Yes" : "No"); + sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty" + ,cfg.chan[i]->misc&CHAN_GURU ? "Yes" : "No"); + sprintf(opt[k++],"%-27.27s%s","Channel Guru" + ,cfg.chan[i]->guru<cfg.total_gurus ? cfg.guru[cfg.chan[i]->guru]->name : ""); + sprintf(opt[k++],"%-27.27s%s","Channel Action Set" + ,cfg.actset[cfg.chan[i]->actset]->name); + opt[k][0]=0; + uifc.helpbuf= + "`Chat Channel Configuration:`\n" + "\n" + "This menu is for configuring the selected chat channel.\n" + ; + sprintf(str,"%s Chat Channel",cfg.chan[i]->name); + switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) { + case -1: + done=1; + break; + case 0: + uifc.helpbuf= + "`Chat Channel Name:`\n" + "\n" + "This is the name or description of the chat channel.\n" + ; + strcpy(str,cfg.chan[i]->name); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Channel Name" + ,cfg.chan[i]->name,sizeof(cfg.chan[i]->name)-1,K_EDIT)) + strcpy(cfg.chan[i]->name,str); + break; + case 1: + uifc.helpbuf= + "`Chat Channel Internal Code:`\n" + "\n" + "Every chat channel must have its own unique code for Synchronet to refer\n" + "to it internally. This code is usually an abbreviation of the chat\n" + "channel name.\n" + ; + strcpy(str,cfg.chan[i]->code); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Internal Code" + ,str,LEN_CODE,K_UPPER|K_EDIT)) + break; + if(code_ok(str)) + strcpy(cfg.chan[i]->code,str); + else { + uifc.helpbuf=invalid_code; + uifc.msg("Invalid Code"); + uifc.helpbuf=0; + } + break; + case 2: + ultoa(cfg.chan[i]->cost,str,10); + uifc.helpbuf= + "`Chat Channel Cost to Join:`\n" + "\n" + "If you want users to be charged credits to join this chat channel, set\n" + "this value to the number of credits to charge. If you want this channel\n" + "to be free, set this value to `0`.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)" + ,str,10,K_EDIT|K_NUMBER); + cfg.chan[i]->cost=atol(str); + break; + case 3: + sprintf(str,"%s Chat Channel",cfg.chan[i]->name); + getar(str,cfg.chan[i]->arstr); break; - if(code_ok(str)) - strcpy(cfg.chan[i]->code,str); - else { - uifc.helpbuf=invalid_code; - uifc.msg("Invalid Code"); - uifc.helpbuf=0; - } - break; - case 2: - ultoa(cfg.chan[i]->cost,str,10); - uifc.helpbuf= - "`Chat Channel Cost to Join:`\n" - "\n" - "If you want users to be charged credits to join this chat channel, set\n" - "this value to the number of credits to charge. If you want this channel\n" - "to be free, set this value to `0`.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)" - ,str,10,K_EDIT|K_NUMBER); - cfg.chan[i]->cost=atol(str); - break; - case 3: - sprintf(str,"%s Chat Channel",cfg.chan[i]->name); - getar(str,cfg.chan[i]->arstr); - break; - case 4: - k=1; - uifc.helpbuf= - "`Allow Channel to be Password Protected:`\n" - "\n" - "If you want to allow the first user to join this channel to password\n" - "protect it, set this option to `Yes`.\n" - ; - k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Allow Channel to be Password Protected" - ,uifcYesNoOpts); - if(!k && !(cfg.chan[i]->misc&CHAN_PW)) { - cfg.chan[i]->misc|=CHAN_PW; - uifc.changes=1; - } - else if(k==1 && cfg.chan[i]->misc&CHAN_PW) { - cfg.chan[i]->misc&=~CHAN_PW; - uifc.changes=1; - } - break; - case 5: - k=1; - uifc.helpbuf= - "`Guru Joins This Channel When Empty:`\n" - "\n" - "If you want the system guru to join this chat channel when there is\n" - "only one user, set this option to `Yes`.\n" - ; - k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Guru Joins This Channel When Empty" - ,uifcYesNoOpts); - if(!k && !(cfg.chan[i]->misc&CHAN_GURU)) { - cfg.chan[i]->misc|=CHAN_GURU; - uifc.changes=1; - } - else if(k==1 && cfg.chan[i]->misc&CHAN_GURU) { - cfg.chan[i]->misc&=~CHAN_GURU; - uifc.changes=1; - } - break; - case 6: -uifc.helpbuf= - "`Channel Guru:`\n" - "\n" - "This is a list of available chat Gurus. Select the one that you wish\n" - "to have available in this channel.\n" -; - k=0; - for(j=0;j<cfg.total_gurus && j<MAX_OPTS;j++) - sprintf(opt[j],"%-25s",cfg.guru[j]->name); - opt[j][0]=0; - k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0 - ,"Available Chat Gurus",opt); - if(k==-1) + case 4: + k=1; + uifc.helpbuf= + "`Allow Channel to be Password Protected:`\n" + "\n" + "If you want to allow the first user to join this channel to password\n" + "protect it, set this option to `Yes`.\n" + ; + k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 + ,"Allow Channel to be Password Protected" + ,uifcYesNoOpts); + if(!k && !(cfg.chan[i]->misc&CHAN_PW)) { + cfg.chan[i]->misc|=CHAN_PW; + uifc.changes=1; + } + else if(k==1 && cfg.chan[i]->misc&CHAN_PW) { + cfg.chan[i]->misc&=~CHAN_PW; + uifc.changes=1; + } break; - cfg.chan[i]->guru=k; - break; - case 7: -uifc.helpbuf= - "`Channel Action Set:`\n" - "\n" - "This is a list of available chat action sets. Select the one that you\n" - "wish to have available in this channel.\n" -; - k=0; - for(j=0;j<cfg.total_actsets && j<MAX_OPTS;j++) - sprintf(opt[j],"%-25s",cfg.actset[j]->name); - opt[j][0]=0; - k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0 - ,"Available Chat Action Sets",opt); - if(k==-1) + case 5: + k=1; + uifc.helpbuf= + "`Guru Joins This Channel When Empty:`\n" + "\n" + "If you want the system guru to join this chat channel when there is\n" + "only one user, set this option to `Yes`.\n" + ; + k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0 + ,"Guru Joins This Channel When Empty" + ,uifcYesNoOpts); + if(!k && !(cfg.chan[i]->misc&CHAN_GURU)) { + cfg.chan[i]->misc|=CHAN_GURU; + uifc.changes=1; + } + else if(k==1 && cfg.chan[i]->misc&CHAN_GURU) { + cfg.chan[i]->misc&=~CHAN_GURU; + uifc.changes=1; + } + break; + case 6: + uifc.helpbuf= + "`Channel Guru:`\n" + "\n" + "This is a list of available chat Gurus. Select the one that you wish\n" + "to have available in this channel.\n" + ; + k=0; + for(j=0;j<cfg.total_gurus && j<MAX_OPTS;j++) + sprintf(opt[j],"%-25s",cfg.guru[j]->name); + opt[j][0]=0; + k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0 + ,"Available Chat Gurus",opt); + if(k==-1) + break; + cfg.chan[i]->guru=k; break; - uifc.changes=1; - cfg.chan[i]->actset=k; - break; + case 7: + uifc.helpbuf= + "`Channel Action Set:`\n" + "\n" + "This is a list of available chat action sets. Select the one that you\n" + "wish to have available in this channel.\n" + ; + k=0; + for(j=0;j<cfg.total_actsets && j<MAX_OPTS;j++) + sprintf(opt[j],"%-25s",cfg.actset[j]->name); + opt[j][0]=0; + k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0 + ,"Available Chat Action Sets",opt); + if(k==-1) + break; + uifc.changes=1; + cfg.chan[i]->actset=k; + break; } } } @@ -469,128 +469,128 @@ void chatact_cfg(uint setnum) uint i,n,chatnum[MAX_OPTS+1]; static chatact_t savchatact; -while(1) { - for(i=0,j=0;i<cfg.total_chatacts && j<MAX_OPTS;i++) - if(cfg.chatact[i]->actset==setnum) { - sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD - ,cfg.chatact[i]->cmd,cfg.chatact[i]->out); - chatnum[j++]=i; + while(1) { + for(i=0,j=0;i<cfg.total_chatacts && j<MAX_OPTS;i++) + if(cfg.chatact[i]->actset==setnum) { + sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD + ,cfg.chatact[i]->cmd,cfg.chatact[i]->out); + chatnum[j++]=i; + } + chatnum[j]=cfg.total_chatacts; + opt[j][0]=0; + i=WIN_ACT|WIN_SAV; + if(j) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(j<MAX_OPTS) + i|=WIN_INS|WIN_INSACT|WIN_XTR; + if(savchatact.cmd[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Multinode Chat Actions:`\n" + "\n" + "This is a list of the configured multinode chat actions. The users can\n" + "use these actions in multinode chat by turning on action commands with\n" + "the `/A` command in multinode chat. Then if a line is typed which\n" + "begins with a valid `action command` and has a user name, chat handle,\n" + "or node number following, the output string will be displayed replacing\n" + "the `%s` symbols with the sending user's name and the receiving user's\n" + "name (in that order).\n" + "\n" + "To add an action, select the desired location with the arrow keys and\n" + "hit ~ INS ~.\n" + "\n" + "To delete an action, select it with the arrow keys and hit ~ DEL ~.\n" + "\n" + "To configure an action, select it with the arrow keys and hit ~ ENTER ~.\n" + ; + sprintf(str,"%s Chat Actions",cfg.actset[setnum]->name); + i=uifc.list(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt); + if((signed)i==-1) + return; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + uifc.helpbuf= + "`Chat Action Command:`\n" + "\n" + "This is the command word (normally a verb) to trigger the action output.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD + ,K_UPPER)<1) + continue; + uifc.helpbuf= + "`Chat Action Output String:`\n" + "\n" + "This is the output string displayed with this action output.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT + ,K_MSG)<1) + continue; + if((cfg.chatact=(chatact_t **)realloc(cfg.chatact + ,sizeof(chatact_t *)*(cfg.total_chatacts+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chatacts+1); + cfg.total_chatacts=0; + bail(1); + continue; + } + if(j) + for(n=cfg.total_chatacts;n>chatnum[i];n--) + cfg.chatact[n]=cfg.chatact[n-1]; + if((cfg.chatact[chatnum[i]]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t)); + continue; + } + memset((chatact_t *)cfg.chatact[chatnum[i]],0,sizeof(chatact_t)); + strcpy(cfg.chatact[chatnum[i]]->cmd,cmd); + strcpy(cfg.chatact[chatnum[i]]->out,out); + cfg.chatact[chatnum[i]]->actset=setnum; + cfg.total_chatacts++; + uifc.changes=1; + continue; } - chatnum[j]=cfg.total_chatacts; - opt[j][0]=0; - i=WIN_ACT|WIN_SAV; - if(j) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(j<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savchatact.cmd[0]) - i|=WIN_PASTE; - uifc.helpbuf= - "`Multinode Chat Actions:`\n" - "\n" - "This is a list of the configured multinode chat actions. The users can\n" - "use these actions in multinode chat by turning on action commands with\n" - "the `/A` command in multinode chat. Then if a line is typed which\n" - "begins with a valid `action command` and has a user name, chat handle,\n" - "or node number following, the output string will be displayed replacing\n" - "the `%s` symbols with the sending user's name and the receiving user's\n" - "name (in that order).\n" - "\n" - "To add an action, select the desired location with the arrow keys and\n" - "hit ~ INS ~.\n" - "\n" - "To delete an action, select it with the arrow keys and hit ~ DEL ~.\n" - "\n" - "To configure an action, select it with the arrow keys and hit ~ ENTER ~.\n" - ; - sprintf(str,"%s Chat Actions",cfg.actset[setnum]->name); - i=uifc.list(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt); - if((signed)i==-1) - return; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { + if (msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savchatact = *cfg.chatact[chatnum[i]]; + free(cfg.chatact[chatnum[i]]); + cfg.total_chatacts--; + for(j=chatnum[i];j<cfg.total_chatacts && j<MAX_OPTS;j++) + cfg.chatact[j]=cfg.chatact[j+1]; + uifc.changes=1; + continue; + } + if (msk == MSK_COPY) { + savchatact=*cfg.chatact[chatnum[i]]; + continue; + } + if (msk == MSK_PASTE) { + *cfg.chatact[chatnum[i]]=savchatact; + cfg.chatact[chatnum[i]]->actset=setnum; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; uifc.helpbuf= "`Chat Action Command:`\n" "\n" - "This is the command word (normally a verb) to trigger the action output.\n" + "This is the command that triggers this chat action.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD - ,K_UPPER)<1) - continue; + strcpy(str,cfg.chatact[chatnum[i]]->cmd); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Action Command" + ,cfg.chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) { + strcpy(cfg.chatact[chatnum[i]]->cmd,str); + continue; + } uifc.helpbuf= "`Chat Action Output String:`\n" "\n" - "This is the output string displayed with this action output.\n" + "This is the output string that results from this chat action.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT - ,K_MSG)<1) - continue; - if((cfg.chatact=(chatact_t **)realloc(cfg.chatact - ,sizeof(chatact_t *)*(cfg.total_chatacts+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chatacts+1); - cfg.total_chatacts=0; - bail(1); - continue; - } - if(j) - for(n=cfg.total_chatacts;n>chatnum[i];n--) - cfg.chatact[n]=cfg.chatact[n-1]; - if((cfg.chatact[chatnum[i]]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t)); - continue; - } - memset((chatact_t *)cfg.chatact[chatnum[i]],0,sizeof(chatact_t)); - strcpy(cfg.chatact[chatnum[i]]->cmd,cmd); - strcpy(cfg.chatact[chatnum[i]]->out,out); - cfg.chatact[chatnum[i]]->actset=setnum; - cfg.total_chatacts++; - uifc.changes=1; - continue; - } - if (msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savchatact = *cfg.chatact[chatnum[i]]; - free(cfg.chatact[chatnum[i]]); - cfg.total_chatacts--; - for(j=chatnum[i];j<cfg.total_chatacts && j<MAX_OPTS;j++) - cfg.chatact[j]=cfg.chatact[j+1]; - uifc.changes=1; - continue; + strcpy(str,cfg.chatact[chatnum[i]]->out); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"" + ,cfg.chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG)) + strcpy(cfg.chatact[chatnum[i]]->out,str); } - if (msk == MSK_COPY) { - savchatact=*cfg.chatact[chatnum[i]]; - continue; - } - if (msk == MSK_PASTE) { - *cfg.chatact[chatnum[i]]=savchatact; - cfg.chatact[chatnum[i]]->actset=setnum; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - uifc.helpbuf= - "`Chat Action Command:`\n" - "\n" - "This is the command that triggers this chat action.\n" - ; - strcpy(str,cfg.chatact[chatnum[i]]->cmd); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Action Command" - ,cfg.chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) { - strcpy(cfg.chatact[chatnum[i]]->cmd,str); - continue; - } - uifc.helpbuf= - "`Chat Action Output String:`\n" - "\n" - "This is the output string that results from this chat action.\n" - ; - strcpy(str,cfg.chatact[chatnum[i]]->out); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"" - ,cfg.chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG)) - strcpy(cfg.chatact[chatnum[i]]->out,str); -} } void guru_cfg() @@ -601,153 +601,153 @@ void guru_cfg() uint i,u; static guru_t savguru; -while(1) { - for(i=0;i<cfg.total_gurus && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",cfg.guru[i]->name); - opt[i][0]=0; - j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; - if(cfg.total_gurus) - j|=WIN_DEL|WIN_COPY|WIN_CUT; - if(cfg.total_gurus<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savguru.name[0]) - j|=WIN_PASTE; - uifc.helpbuf= - "`Gurus:`\n" - "\n" - "This is a list of the configured Gurus.\n" - "\n" - "To add a Guru, select the desired location with the arrow keys and\n" - "hit ~ INS ~.\n" - "\n" - "To delete a Guru, select it with the arrow keys and hit ~ DEL ~.\n" - "\n" - "To configure a Guru, select it with the arrow keys and hit ~ ENTER ~.\n" - ; - i=uifc.list(j,0,0,45,&guru_dflt,&guru_bar,"Artificial Gurus",opt); - if((signed)i==-1) - return; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { + while(1) { + for(i=0;i<cfg.total_gurus && i<MAX_OPTS;i++) + sprintf(opt[i],"%-25s",cfg.guru[i]->name); + opt[i][0]=0; + j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; + if(cfg.total_gurus) + j|=WIN_DEL|WIN_COPY|WIN_CUT; + if(cfg.total_gurus<MAX_OPTS) + j|=WIN_INS|WIN_INSACT|WIN_XTR; + if(savguru.name[0]) + j|=WIN_PASTE; uifc.helpbuf= - "`Guru Name:`\n" + "`Gurus:`\n" "\n" - "This is the name of the selected Guru.\n" - ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Name",str,25 - ,0)<1) - continue; - SAFECOPY(code,str); - prep_code(code,/* prefix: */NULL); - uifc.helpbuf= - "`Guru Internal Code:`\n" + "This is a list of the configured Gurus.\n" + "\n" + "To add a Guru, select the desired location with the arrow keys and\n" + "hit ~ INS ~.\n" "\n" - "Every Guru must have its own unique code for Synchronet to refer to\n" - "it internally. This code is usually an abbreviation of the Guru name.\n" + "To delete a Guru, select it with the arrow keys and hit ~ DEL ~.\n" + "\n" + "To configure a Guru, select it with the arrow keys and hit ~ ENTER ~.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code" - ,code,LEN_CODE,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - uifc.helpbuf=invalid_code; - uifc.msg("Invalid Code"); - uifc.helpbuf=0; - continue; + i=uifc.list(j,0,0,45,&guru_dflt,&guru_bar,"Artificial Gurus",opt); + if((signed)i==-1) + return; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + uifc.helpbuf= + "`Guru Name:`\n" + "\n" + "This is the name of the selected Guru.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Name",str,25 + ,0)<1) + continue; + SAFECOPY(code,str); + prep_code(code,/* prefix: */NULL); + uifc.helpbuf= + "`Guru Internal Code:`\n" + "\n" + "Every Guru must have its own unique code for Synchronet to refer to\n" + "it internally. This code is usually an abbreviation of the Guru name.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code" + ,code,LEN_CODE,K_EDIT|K_UPPER)<1) + continue; + if(!code_ok(code)) { + uifc.helpbuf=invalid_code; + uifc.msg("Invalid Code"); + uifc.helpbuf=0; + continue; + } + if((cfg.guru=(guru_t **)realloc(cfg.guru,sizeof(guru_t *)*(cfg.total_gurus+1))) + ==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_gurus+1); + cfg.total_gurus=0; + bail(1); + continue; + } + if(cfg.total_gurus) + for(u=cfg.total_gurus;u>i;u--) + cfg.guru[u]=cfg.guru[u-1]; + if((cfg.guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t)); + continue; + } + memset((guru_t *)cfg.guru[i],0,sizeof(guru_t)); + strcpy(cfg.guru[i]->name,str); + strcpy(cfg.guru[i]->code,code); + cfg.total_gurus++; + uifc.changes=1; + continue; } - if((cfg.guru=(guru_t **)realloc(cfg.guru,sizeof(guru_t *)*(cfg.total_gurus+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_gurus+1); - cfg.total_gurus=0; - bail(1); - continue; + if (msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savguru = *cfg.guru[i]; + free(cfg.guru[i]); + cfg.total_gurus--; + for(j=i;j<cfg.total_gurus;j++) + cfg.guru[j]=cfg.guru[j+1]; + uifc.changes=1; + continue; } - if(cfg.total_gurus) - for(u=cfg.total_gurus;u>i;u--) - cfg.guru[u]=cfg.guru[u-1]; - if((cfg.guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t)); + if (msk == MSK_COPY) { + savguru=*cfg.guru[i]; continue; } - memset((guru_t *)cfg.guru[i],0,sizeof(guru_t)); - strcpy(cfg.guru[i]->name,str); - strcpy(cfg.guru[i]->code,code); - cfg.total_gurus++; - uifc.changes=1; - continue; - } - if (msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savguru = *cfg.guru[i]; - free(cfg.guru[i]); - cfg.total_gurus--; - for(j=i;j<cfg.total_gurus;j++) - cfg.guru[j]=cfg.guru[j+1]; - uifc.changes=1; - continue; - } - if (msk == MSK_COPY) { - savguru=*cfg.guru[i]; - continue; - } - if (msk == MSK_PASTE) { - *cfg.guru[i]=savguru; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Guru Name",cfg.guru[i]->name); - sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",cfg.guru[i]->code); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.guru[i]->arstr); - opt[k][0]=0; - uifc.helpbuf= - "`Guru Configuration:`\n" - "\n" - "This menu is for configuring the selected Guru.\n" - ; - switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,cfg.guru[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf= - "`Guru Name:`\n" - "\n" - "This is the name of the selected Guru.\n" - ; - strcpy(str,cfg.guru[i]->name); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Guru Name" - ,cfg.guru[i]->name,sizeof(cfg.guru[i]->name)-1,K_EDIT)) - strcpy(cfg.guru[i]->name,str); - break; - case 1: -uifc.helpbuf= - "`Guru Internal Code:`\n" - "\n" - "Every Guru must have its own unique code for Synchronet to refer to\n" - "it internally. This code is usually an abbreviation of the Guru name.\n" -; - strcpy(str,cfg.guru[i]->code); - if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Internal Code" - ,str,LEN_CODE,K_EDIT|K_UPPER)) + if (msk == MSK_PASTE) { + *cfg.guru[i]=savguru; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + j=0; + done=0; + while(!done) { + k=0; + sprintf(opt[k++],"%-27.27s%s","Guru Name",cfg.guru[i]->name); + sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",cfg.guru[i]->code); + sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.guru[i]->arstr); + opt[k][0]=0; + uifc.helpbuf= + "`Guru Configuration:`\n" + "\n" + "This menu is for configuring the selected Guru.\n" + ; + switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,cfg.guru[i]->name + ,opt)) { + case -1: + done=1; + break; + case 0: + uifc.helpbuf= + "`Guru Name:`\n" + "\n" + "This is the name of the selected Guru.\n" + ; + strcpy(str,cfg.guru[i]->name); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Guru Name" + ,cfg.guru[i]->name,sizeof(cfg.guru[i]->name)-1,K_EDIT)) + strcpy(cfg.guru[i]->name,str); + break; + case 1: + uifc.helpbuf= + "`Guru Internal Code:`\n" + "\n" + "Every Guru must have its own unique code for Synchronet to refer to\n" + "it internally. This code is usually an abbreviation of the Guru name.\n" + ; + strcpy(str,cfg.guru[i]->code); + if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Internal Code" + ,str,LEN_CODE,K_EDIT|K_UPPER)) + break; + if(code_ok(str)) + strcpy(cfg.guru[i]->code,str); + else { + uifc.helpbuf=invalid_code; + uifc.msg("Invalid Code"); + uifc.helpbuf=0; + } break; - if(code_ok(str)) - strcpy(cfg.guru[i]->code,str); - else { - uifc.helpbuf=invalid_code; - uifc.msg("Invalid Code"); - uifc.helpbuf=0; - } - break; - case 2: - getar(cfg.guru[i]->name,cfg.guru[i]->arstr); - break; + case 2: + getar(cfg.guru[i]->name,cfg.guru[i]->arstr); + break; } } } @@ -761,118 +761,118 @@ void actsets_cfg() uint i,u; static actset_t savactset; -while(1) { - for(i=0;i<cfg.total_actsets && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",cfg.actset[i]->name); - opt[i][0]=0; - j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV; - if(cfg.total_actsets) - j|=WIN_DEL|WIN_COPY|WIN_CUT; - if(cfg.total_actsets<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savactset.name[0]) - j|=WIN_PASTE; - uifc.helpbuf= - "`Chat Action Sets:`\n" - "\n" - "This is a list of the configured action sets.\n" - "\n" - "To add an action set, select the desired location with the arrow keys and\n" - "hit ~ INS ~.\n" - "\n" - "To delete an action set, select it with the arrow keys and hit ~ DEL ~.\n" - "\n" - "To configure an action set, select it with the arrow keys and hit\n" - "~ ENTER ~.\n" - ; - i=uifc.list(j,0,0,45,&actset_dflt,&actset_bar,"Chat Action Sets",opt); - if((signed)i==-1) - return; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { - uifc.helpbuf= - "`Chat Action Set Name:`\n" - "\n" - "This is the name of the selected chat action set.\n" - ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Action Set Name",str,25 - ,0)<1) - continue; - if((cfg.actset=(actset_t **)realloc(cfg.actset,sizeof(actset_t *)*(cfg.total_actsets+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_actsets+1); - cfg.total_actsets=0; - bail(1); - continue; + while(1) { + for(i=0;i<cfg.total_actsets && i<MAX_OPTS;i++) + sprintf(opt[i],"%-25s",cfg.actset[i]->name); + opt[i][0]=0; + j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV; + if(cfg.total_actsets) + j|=WIN_DEL|WIN_COPY|WIN_CUT; + if(cfg.total_actsets<MAX_OPTS) + j|=WIN_INS|WIN_INSACT|WIN_XTR; + if(savactset.name[0]) + j|=WIN_PASTE; + uifc.helpbuf= + "`Chat Action Sets:`\n" + "\n" + "This is a list of the configured action sets.\n" + "\n" + "To add an action set, select the desired location with the arrow keys and\n" + "hit ~ INS ~.\n" + "\n" + "To delete an action set, select it with the arrow keys and hit ~ DEL ~.\n" + "\n" + "To configure an action set, select it with the arrow keys and hit\n" + "~ ENTER ~.\n" + ; + i=uifc.list(j,0,0,45,&actset_dflt,&actset_bar,"Chat Action Sets",opt); + if((signed)i==-1) + return; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + uifc.helpbuf= + "`Chat Action Set Name:`\n" + "\n" + "This is the name of the selected chat action set.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Action Set Name",str,25 + ,0)<1) + continue; + if((cfg.actset=(actset_t **)realloc(cfg.actset,sizeof(actset_t *)*(cfg.total_actsets+1))) + ==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_actsets+1); + cfg.total_actsets=0; + bail(1); + continue; + } + if(cfg.total_actsets) + for(u=cfg.total_actsets;u>i;u--) + cfg.actset[u]=cfg.actset[u-1]; + if((cfg.actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t)); + continue; + } + memset((actset_t *)cfg.actset[i],0,sizeof(actset_t)); + strcpy(cfg.actset[i]->name,str); + cfg.total_actsets++; + uifc.changes=1; + continue; } - if(cfg.total_actsets) - for(u=cfg.total_actsets;u>i;u--) - cfg.actset[u]=cfg.actset[u-1]; - if((cfg.actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t)); - continue; + if (msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savactset = *cfg.actset[i]; + free(cfg.actset[i]); + cfg.total_actsets--; + for(j=i;j<cfg.total_actsets;j++) + cfg.actset[j]=cfg.actset[j+1]; + uifc.changes=1; + continue; } - memset((actset_t *)cfg.actset[i],0,sizeof(actset_t)); - strcpy(cfg.actset[i]->name,str); - cfg.total_actsets++; - uifc.changes=1; - continue; - } - if (msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savactset = *cfg.actset[i]; - free(cfg.actset[i]); - cfg.total_actsets--; - for(j=i;j<cfg.total_actsets;j++) - cfg.actset[j]=cfg.actset[j+1]; - uifc.changes=1; - continue; - } - if (msk == MSK_COPY) { - savactset=*cfg.actset[i]; - continue; - } - if (msk == MSK_PASTE) { - *cfg.actset[i]=savactset; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; + if (msk == MSK_COPY) { + savactset=*cfg.actset[i]; + continue; + } + if (msk == MSK_PASTE) { + *cfg.actset[i]=savactset; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Action Set Name",cfg.actset[i]->name); - sprintf(opt[k++],"%-27.27s","Configure Chat Actions..."); - opt[k][0]=0; - uifc.helpbuf= - "`Chat Action Set Configuration:`\n" - "\n" - "This menu is for configuring the selected chat action set.\n" - ; - sprintf(str,"%s Chat Action Set",cfg.actset[i]->name); - switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str - ,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf= - "`Chat Action Set Name:`\n" - "\n" - "This is the name of the selected action set.\n" - ; - strcpy(str,cfg.actset[i]->name); - if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Action Set Name" - ,cfg.actset[i]->name,sizeof(cfg.actset[i]->name)-1,K_EDIT)) - strcpy(cfg.actset[i]->name,str); - break; - case 1: - chatact_cfg(i); - break; + j=0; + done=0; + while(!done) { + k=0; + sprintf(opt[k++],"%-27.27s%s","Action Set Name",cfg.actset[i]->name); + sprintf(opt[k++],"%-27.27s","Configure Chat Actions..."); + opt[k][0]=0; + uifc.helpbuf= + "`Chat Action Set Configuration:`\n" + "\n" + "This menu is for configuring the selected chat action set.\n" + ; + sprintf(str,"%s Chat Action Set",cfg.actset[i]->name); + switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str + ,opt)) { + case -1: + done=1; + break; + case 0: + uifc.helpbuf= + "`Chat Action Set Name:`\n" + "\n" + "This is the name of the selected action set.\n" + ; + strcpy(str,cfg.actset[i]->name); + if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Action Set Name" + ,cfg.actset[i]->name,sizeof(cfg.actset[i]->name)-1,K_EDIT)) + strcpy(cfg.actset[i]->name,str); + break; + case 1: + chatact_cfg(i); + break; } } } diff --git a/src/sbbs3/scfg/scfgnet.c b/src/sbbs3/scfg/scfgnet.c index c39fa55fc02966b0591e107a4bbedc5e8da5d6a0..6a59a732178bf2f1f67aa76573be624fb29be113 100644 --- a/src/sbbs3/scfg/scfgnet.c +++ b/src/sbbs3/scfg/scfgnet.c @@ -162,759 +162,759 @@ void net_cfg() char str[81],done; int i,j,k,l; -while(1) { - i=0; - strcpy(opt[i++],"Internet E-mail"); - strcpy(opt[i++],"QWK Packet Networks"); - strcpy(opt[i++],"FidoNet EchoMail and NetMail"); - strcpy(opt[i++],"PostLink Networks"); - opt[i][0]=0; - uifc.helpbuf= - "`Configure Networks:`\n" - "\n" - "This is the network configuration menu. Select the type of network\n" - "technology that you want to configure.\n" - ; - i=uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&net_dflt,0,"Networks",opt); - if(i==1) { /* QWK net stuff */ - done=0; - while(!done) { - i=0; - strcpy(opt[i++],"Network Hubs..."); - strcpy(opt[i++],"Default Tagline"); - opt[i][0]=0; - uifc.helpbuf= - "`QWK Packet Networks:`\n" - "\n" - "From this menu you can configure the default tagline to use for\n" - "outgoing messages on QWK networked sub-boards, or you can select\n" - "`Network Hubs...` to add, delete, or configure QWK hubs that your system\n" - "calls to exchange packets with.\n" - ; - i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&qnet_dflt,0 - ,"QWK Packet Networks",opt); - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 1: - uifc.helpbuf= - "`QWK Network Default Tagline:`\n" - "\n" - "This is the default tagline to use for outgoing messages on QWK\n" - "networked sub-boards. This default can be overridden on a per sub-board\n" - "basis with the sub-board configuration `Network Options...`.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,nulstr - ,cfg.qnet_tagline,sizeof(cfg.qnet_tagline)-1,K_MSG|K_EDIT); - break; - case 0: - while(1) { - for(i=0;i<cfg.total_qhubs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-8.8s",cfg.qhub[i]->id); - opt[i][0]=0; - i=WIN_ACT|WIN_RHT|WIN_SAV; - if(cfg.total_qhubs<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(cfg.total_qhubs) - i|=WIN_DEL; + while(1) { + i=0; + strcpy(opt[i++],"Internet E-mail"); + strcpy(opt[i++],"QWK Packet Networks"); + strcpy(opt[i++],"FidoNet EchoMail and NetMail"); + strcpy(opt[i++],"PostLink Networks"); + opt[i][0]=0; + uifc.helpbuf= + "`Configure Networks:`\n" + "\n" + "This is the network configuration menu. Select the type of network\n" + "technology that you want to configure.\n" + ; + i=uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&net_dflt,0,"Networks",opt); + if(i==1) { /* QWK net stuff */ + done=0; + while(!done) { + i=0; + strcpy(opt[i++],"Network Hubs..."); + strcpy(opt[i++],"Default Tagline"); + opt[i][0]=0; + uifc.helpbuf= + "`QWK Packet Networks:`\n" + "\n" + "From this menu you can configure the default tagline to use for\n" + "outgoing messages on QWK networked sub-boards, or you can select\n" + "`Network Hubs...` to add, delete, or configure QWK hubs that your system\n" + "calls to exchange packets with.\n" + ; + i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&qnet_dflt,0 + ,"QWK Packet Networks",opt); + switch(i) { + case -1: /* ESC */ + done=1; + break; + case 1: uifc.helpbuf= - "`QWK Network Hubs:`\n" - "\n" - "This is a list of QWK network hubs that your system calls to exchange\n" - "packets with.\n" - "\n" - "To add a hub, select the desired location with the arrow keys and hit\n" - "~ INS ~.\n" - "\n" - "To delete a hub, select it and hit ~ DEL ~.\n" + "`QWK Network Default Tagline:`\n" "\n" - "To configure a hub, select it and hit ~ ENTER ~.\n" + "This is the default tagline to use for outgoing messages on QWK\n" + "networked sub-boards. This default can be overridden on a per sub-board\n" + "basis with the sub-board configuration `Network Options...`.\n" ; - i=uifc.list(i,0,0,0,&qhub_dflt,0 - ,"QWK Network Hubs",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { + uifc.input(WIN_MID|WIN_SAV,0,0,nulstr + ,cfg.qnet_tagline,sizeof(cfg.qnet_tagline)-1,K_MSG|K_EDIT); + break; + case 0: + while(1) { + for(i=0;i<cfg.total_qhubs && i<MAX_OPTS;i++) + sprintf(opt[i],"%-8.8s",cfg.qhub[i]->id); + opt[i][0]=0; + i=WIN_ACT|WIN_RHT|WIN_SAV; + if(cfg.total_qhubs<MAX_OPTS) + i|=WIN_INS|WIN_INSACT|WIN_XTR; + if(cfg.total_qhubs) + i|=WIN_DEL; uifc.helpbuf= - "`QWK Network Hub System ID:`\n" + "`QWK Network Hubs:`\n" + "\n" + "This is a list of QWK network hubs that your system calls to exchange\n" + "packets with.\n" "\n" - "This is the QWK System ID of this hub. It is used for incoming and\n" - "outgoing network packets and must be accurate.\n" + "To add a hub, select the desired location with the arrow keys and hit\n" + "~ INS ~.\n" + "\n" + "To delete a hub, select it and hit ~ DEL ~.\n" + "\n" + "To configure a hub, select it and hit ~ ENTER ~.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"System ID",str,LEN_QWKID,K_UPPER)<1) - continue; - if(!new_qhub(i)) - continue; - SAFECOPY(cfg.qhub[i]->id,str); - SAFECOPY(cfg.qhub[i]->pack,"%@zip -jD %f %s"); - SAFECOPY(cfg.qhub[i]->unpack,"%@unzip -Coj %f %s -d %g"); - SAFECOPY(cfg.qhub[i]->call,"*qnet-ftp %s hub.address YOURPASS"); - cfg.qhub[i]->node=1; - cfg.qhub[i]->days=(uchar)0xff; /* all days */ - uifc.changes=1; - continue; - } - if (msk == MSK_DEL) { - free(cfg.qhub[i]->mode); - free(cfg.qhub[i]->conf); - free(cfg.qhub[i]->sub); - free(cfg.qhub[i]); - cfg.total_qhubs--; - while(i<cfg.total_qhubs) { - cfg.qhub[i]=cfg.qhub[i+1]; - i++; + i=uifc.list(i,0,0,0,&qhub_dflt,0 + ,"QWK Network Hubs",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + uifc.helpbuf= + "`QWK Network Hub System ID:`\n" + "\n" + "This is the QWK System ID of this hub. It is used for incoming and\n" + "outgoing network packets and must be accurate.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"System ID",str,LEN_QWKID,K_UPPER)<1) + continue; + if(!new_qhub(i)) + continue; + SAFECOPY(cfg.qhub[i]->id,str); + SAFECOPY(cfg.qhub[i]->pack,"%@zip -jD %f %s"); + SAFECOPY(cfg.qhub[i]->unpack,"%@unzip -Coj %f %s -d %g"); + SAFECOPY(cfg.qhub[i]->call,"*qnet-ftp %s hub.address YOURPASS"); + cfg.qhub[i]->node=1; + cfg.qhub[i]->days=(uchar)0xff; /* all days */ + uifc.changes=1; + continue; } - uifc.changes=1; - continue; + if (msk == MSK_DEL) { + free(cfg.qhub[i]->mode); + free(cfg.qhub[i]->conf); + free(cfg.qhub[i]->sub); + free(cfg.qhub[i]); + cfg.total_qhubs--; + while(i<cfg.total_qhubs) { + cfg.qhub[i]=cfg.qhub[i+1]; + i++; + } + uifc.changes=1; + continue; + } + qhub_edit(i); } - qhub_edit(i); - } - break; + break; + } } - } - } - - else if(i==2) { /* FidoNet Stuff */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s" - ,"System Addresses",cfg.total_faddrs - ? smb_faddrtoa(&cfg.faddr[0],tmp) : nulstr); - sprintf(opt[i++],"%-27.27s%s" - ,"Default Outbound Address" - ,cfg.dflt_faddr.zone - ? smb_faddrtoa(&cfg.dflt_faddr,tmp) : "No"); - sprintf(opt[i++],"%-27.27s" - ,"Default Origin Line"); - sprintf(opt[i++],"%-27.27s%.40s" - ,"NetMail Semaphore",cfg.netmail_sem); - sprintf(opt[i++],"%-27.27s%.40s" - ,"EchoMail Semaphore",cfg.echomail_sem); - sprintf(opt[i++],"%-27.27s%.40s" - ,"NetMail Directory",cfg.netmail_dir); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow Sending of NetMail" - ,cfg.netmail_misc&NMAIL_ALLOW ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow File Attachments" - ,cfg.netmail_misc&NMAIL_FILE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Send NetMail Using Alias" - ,cfg.netmail_misc&NMAIL_ALIAS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"NetMail Defaults to Crash" - ,cfg.netmail_misc&NMAIL_CRASH ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"NetMail Defaults to Direct" - ,cfg.netmail_misc&NMAIL_DIRECT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"NetMail Defaults to Hold" - ,cfg.netmail_misc&NMAIL_HOLD ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Kill NetMail After Sent" - ,cfg.netmail_misc&NMAIL_KILL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%"PRIu32 - ,"Cost to Send NetMail",cfg.netmail_cost); - opt[i][0]=0; - uifc.helpbuf= - "`FidoNet EchoMail and NetMail:`\n" - "\n" - "This menu contains configuration options that pertain specifically to\n" - "networking E-mail (NetMail) and sub-boards (EchoMail) through networks\n" - "using FidoNet technology.\n" - ; - i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&fnet_dflt,0 - ,"FidoNet EchoMail and NetMail",opt); - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 0: - uifc.helpbuf= - "`System FidoNet Addresses:`\n" - "\n" - "This is the FidoNet address of this system used to receive NetMail.\n" - "The Main address is also used as the default address for sub-boards.\n" - "Format: `Zone:Net/Node[.Point]`\n" - ; - k=l=0; - while(1) { - for(i=0;i<cfg.total_faddrs && i<MAX_OPTS;i++) { - if(i==0) - strcpy(str,"Main"); - else - sprintf(str,"AKA %u",i); - sprintf(opt[i],"%-8.8s %-16s" - ,str,smb_faddrtoa(&cfg.faddr[i],tmp)); - } - opt[i][0]=0; - j=WIN_RHT|WIN_SAV|WIN_ACT|WIN_INSACT; - if(cfg.total_faddrs<MAX_OPTS) - j|=WIN_INS|WIN_XTR; - if(cfg.total_faddrs) - j|=WIN_DEL; - i=uifc.list(j,0,0,0,&k,&l - ,"System Addresses",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { - if(!cfg.total_faddrs) - strcpy(str,"1:1/0"); - else - smb_faddrtoa(&cfg.faddr[0],str); - if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Address" - ,str,25,K_EDIT|K_UPPER)) - continue; + } - if((cfg.faddr=(faddr_t *)realloc(cfg.faddr - ,sizeof(faddr_t)*(cfg.total_faddrs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(faddr_t)*cfg.total_faddrs+1); - cfg.total_faddrs=0; - bail(1); - continue; + else if(i==2) { /* FidoNet Stuff */ + done=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%s" + ,"System Addresses",cfg.total_faddrs + ? smb_faddrtoa(&cfg.faddr[0],tmp) : nulstr); + sprintf(opt[i++],"%-27.27s%s" + ,"Default Outbound Address" + ,cfg.dflt_faddr.zone + ? smb_faddrtoa(&cfg.dflt_faddr,tmp) : "No"); + sprintf(opt[i++],"%-27.27s" + ,"Default Origin Line"); + sprintf(opt[i++],"%-27.27s%.40s" + ,"NetMail Semaphore",cfg.netmail_sem); + sprintf(opt[i++],"%-27.27s%.40s" + ,"EchoMail Semaphore",cfg.echomail_sem); + sprintf(opt[i++],"%-27.27s%.40s" + ,"NetMail Directory",cfg.netmail_dir); + sprintf(opt[i++],"%-27.27s%s" + ,"Allow Sending of NetMail" + ,cfg.netmail_misc&NMAIL_ALLOW ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"Allow File Attachments" + ,cfg.netmail_misc&NMAIL_FILE ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"Send NetMail Using Alias" + ,cfg.netmail_misc&NMAIL_ALIAS ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"NetMail Defaults to Crash" + ,cfg.netmail_misc&NMAIL_CRASH ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"NetMail Defaults to Direct" + ,cfg.netmail_misc&NMAIL_DIRECT ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"NetMail Defaults to Hold" + ,cfg.netmail_misc&NMAIL_HOLD ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"Kill NetMail After Sent" + ,cfg.netmail_misc&NMAIL_KILL ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%"PRIu32 + ,"Cost to Send NetMail",cfg.netmail_cost); + opt[i][0]=0; + uifc.helpbuf= + "`FidoNet EchoMail and NetMail:`\n" + "\n" + "This menu contains configuration options that pertain specifically to\n" + "networking E-mail (NetMail) and sub-boards (EchoMail) through networks\n" + "using FidoNet technology.\n" + ; + i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&fnet_dflt,0 + ,"FidoNet EchoMail and NetMail",opt); + switch(i) { + case -1: /* ESC */ + done=1; + break; + case 0: + uifc.helpbuf= + "`System FidoNet Addresses:`\n" + "\n" + "This is the FidoNet address of this system used to receive NetMail.\n" + "The Main address is also used as the default address for sub-boards.\n" + "Format: `Zone:Net/Node[.Point]`\n" + ; + k=l=0; + while(1) { + for(i=0;i<cfg.total_faddrs && i<MAX_OPTS;i++) { + if(i==0) + strcpy(str,"Main"); + else + sprintf(str,"AKA %u",i); + sprintf(opt[i],"%-8.8s %-16s" + ,str,smb_faddrtoa(&cfg.faddr[i],tmp)); } + opt[i][0]=0; + j=WIN_RHT|WIN_SAV|WIN_ACT|WIN_INSACT; + if(cfg.total_faddrs<MAX_OPTS) + j|=WIN_INS|WIN_XTR; + if(cfg.total_faddrs) + j|=WIN_DEL; + i=uifc.list(j,0,0,0,&k,&l + ,"System Addresses",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + if(!cfg.total_faddrs) + strcpy(str,"1:1/0"); + else + smb_faddrtoa(&cfg.faddr[0],str); + if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Address" + ,str,25,K_EDIT|K_UPPER)) + continue; - for(j=cfg.total_faddrs;j>i;j--) - cfg.faddr[j]=cfg.faddr[j-1]; + if((cfg.faddr=(faddr_t *)realloc(cfg.faddr + ,sizeof(faddr_t)*(cfg.total_faddrs+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr + ,sizeof(faddr_t)*cfg.total_faddrs+1); + cfg.total_faddrs=0; + bail(1); + continue; + } - cfg.faddr[i]=atofaddr(str); - cfg.total_faddrs++; + for(j=cfg.total_faddrs;j>i;j--) + cfg.faddr[j]=cfg.faddr[j-1]; + + cfg.faddr[i]=atofaddr(str); + cfg.total_faddrs++; + uifc.changes=1; + continue; + } + if (msk == MSK_DEL) { + cfg.total_faddrs--; + while(i<cfg.total_faddrs) { + cfg.faddr[i]=cfg.faddr[i+1]; + i++; + } + uifc.changes=1; + continue; + } + smb_faddrtoa(&cfg.faddr[i],str); + uifc.input(WIN_MID|WIN_SAV,0,0,"Address" + ,str,25,K_EDIT); + cfg.faddr[i]=atofaddr(str); + } + break; + case 1: + i=0; + uifc.helpbuf= + "`Use Default Outbound NetMail Address:`\n" + "\n" + "If you would like to have a default FidoNet address adding to outbound\n" + "NetMail mail messages that do not have an address specified, select\n" + "`Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Use Default Outbound NetMail Address",uifcYesNoOpts); + if(i==1) { + if(cfg.dflt_faddr.zone) + uifc.changes=1; + cfg.dflt_faddr.zone=0; + break; + } + if(i==-1) + break; + if(!cfg.dflt_faddr.zone) { + cfg.dflt_faddr.zone=1; + uifc.changes=1; + } + smb_faddrtoa(&cfg.dflt_faddr,str); + uifc.helpbuf= + "`Default Outbound FidoNet NetMail Address:`\n" + "\n" + "If you would like to automatically add a FidoNet address to outbound\n" + "NetMail that does not have an address specified, set this option\n" + "to that address. This is useful for Fido/UUCP gateway mail.\n" + "Format: `Zone:Net/Node[.Point]`\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Address" + ,str,25,K_EDIT)) { + cfg.dflt_faddr=atofaddr(str); + uifc.changes=1; + } + break; + case 2: + uifc.helpbuf= + "`Default Origin Line:`\n" + "\n" + "This is the default origin line used for sub-boards networked via\n" + "EchoMail. This origin line can be overridden on a per sub-board basis\n" + "with the sub-board configuration `Network Options...`.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"* Origin" + ,cfg.origline,sizeof(cfg.origline)-1,K_EDIT); + break; + case 3: + uifc.helpbuf= + "`NetMail Semaphore File:`\n" + "\n" + "This is a filename that will be used as a semaphore (signal) to your\n" + "FidoNet front-end that new NetMail has been created and the messages\n" + "should be re-scanned.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail Semaphore" + ,cfg.netmail_sem,sizeof(cfg.netmail_sem)-1,K_EDIT); + break; + case 4: + uifc.helpbuf= + "`EchoMail Semaphore File:`\n" + "\n" + "This is a filename that will be used as a semaphore (signal) to your\n" + "FidoNet front-end that new EchoMail has been created and the messages\n" + "should be re-scanned.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"EchoMail Semaphore" + ,cfg.echomail_sem,sizeof(cfg.echomail_sem)-1,K_EDIT); + break; + case 5: + uifc.helpbuf= + "`NetMail Directory:`\n" + "\n" + "This is the directory where FidoNet NetMail will be imported from\n" + "and exported to (in FTS-1, *.MSG format).\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail" + ,cfg.netmail_dir,sizeof(cfg.netmail_dir)-1,K_EDIT); + break; + case 6: + i=0; + uifc.helpbuf= + "`Allow Users to Send NetMail:`\n" + "\n" + "If you are on a FidoNet style network and want your users to be allowed\n" + "to send FidoNet NetMail, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Send NetMail",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_ALLOW)) { uifc.changes=1; - continue; + cfg.netmail_misc|=NMAIL_ALLOW; } - if (msk == MSK_DEL) { - cfg.total_faddrs--; - while(i<cfg.total_faddrs) { - cfg.faddr[i]=cfg.faddr[i+1]; - i++; - } + else if(i==1 && cfg.netmail_misc&NMAIL_ALLOW) { uifc.changes=1; - continue; + cfg.netmail_misc&=~NMAIL_ALLOW; } - smb_faddrtoa(&cfg.faddr[i],str); - uifc.input(WIN_MID|WIN_SAV,0,0,"Address" - ,str,25,K_EDIT); - cfg.faddr[i]=atofaddr(str); - } - break; - case 1: - i=0; - uifc.helpbuf= - "`Use Default Outbound NetMail Address:`\n" - "\n" - "If you would like to have a default FidoNet address adding to outbound\n" - "NetMail mail messages that do not have an address specified, select\n" - "`Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Default Outbound NetMail Address",uifcYesNoOpts); - if(i==1) { - if(cfg.dflt_faddr.zone) + break; + case 7: + i=0; + uifc.helpbuf= + "`Allow Users to Send NetMail File Attachments:`\n" + "\n" + "If you are on a FidoNet style network and want your users to be allowed\n" + "to send NetMail file attachments, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Send NetMail File Attachments",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_FILE)) { uifc.changes=1; - cfg.dflt_faddr.zone=0; - break; - } - if(i==-1) + cfg.netmail_misc|=NMAIL_FILE; + } + else if(i==1 && cfg.netmail_misc&NMAIL_FILE) { + uifc.changes=1; + cfg.netmail_misc&=~NMAIL_FILE; + } break; - if(!cfg.dflt_faddr.zone) { - cfg.dflt_faddr.zone=1; - uifc.changes=1; - } - smb_faddrtoa(&cfg.dflt_faddr,str); - uifc.helpbuf= - "`Default Outbound FidoNet NetMail Address:`\n" - "\n" - "If you would like to automatically add a FidoNet address to outbound\n" - "NetMail that does not have an address specified, set this option\n" - "to that address. This is useful for Fido/UUCP gateway mail.\n" - "Format: `Zone:Net/Node[.Point]`\n" - ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Address" - ,str,25,K_EDIT)) { - cfg.dflt_faddr=atofaddr(str); - uifc.changes=1; - } - break; - case 2: - uifc.helpbuf= - "`Default Origin Line:`\n" - "\n" - "This is the default origin line used for sub-boards networked via\n" - "EchoMail. This origin line can be overridden on a per sub-board basis\n" - "with the sub-board configuration `Network Options...`.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"* Origin" - ,cfg.origline,sizeof(cfg.origline)-1,K_EDIT); - break; - case 3: - uifc.helpbuf= - "`NetMail Semaphore File:`\n" - "\n" - "This is a filename that will be used as a semaphore (signal) to your\n" - "FidoNet front-end that new NetMail has been created and the messages\n" - "should be re-scanned.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail Semaphore" - ,cfg.netmail_sem,sizeof(cfg.netmail_sem)-1,K_EDIT); - break; - case 4: - uifc.helpbuf= - "`EchoMail Semaphore File:`\n" - "\n" - "This is a filename that will be used as a semaphore (signal) to your\n" - "FidoNet front-end that new EchoMail has been created and the messages\n" - "should be re-scanned.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"EchoMail Semaphore" - ,cfg.echomail_sem,sizeof(cfg.echomail_sem)-1,K_EDIT); - break; - case 5: - uifc.helpbuf= - "`NetMail Directory:`\n" - "\n" - "This is the directory where FidoNet NetMail will be imported from\n" - "and exported to (in FTS-1, *.MSG format).\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail" - ,cfg.netmail_dir,sizeof(cfg.netmail_dir)-1,K_EDIT); - break; - case 6: - i=0; - uifc.helpbuf= - "`Allow Users to Send NetMail:`\n" - "\n" - "If you are on a FidoNet style network and want your users to be allowed\n" - "to send FidoNet NetMail, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send NetMail",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_ALLOW)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_ALLOW; - } - else if(i==1 && cfg.netmail_misc&NMAIL_ALLOW) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_ALLOW; - } - break; - case 7: - i=0; - uifc.helpbuf= - "`Allow Users to Send NetMail File Attachments:`\n" - "\n" - "If you are on a FidoNet style network and want your users to be allowed\n" - "to send NetMail file attachments, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send NetMail File Attachments",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_FILE)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_FILE; - } - else if(i==1 && cfg.netmail_misc&NMAIL_FILE) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_FILE; - } - break; - case 8: - i=1; - uifc.helpbuf= - "`Use Aliases in NetMail:`\n" - "\n" - "If you allow aliases on your system and wish users to have their NetMail\n" - "contain their alias as the `From User`, set this option to `Yes`. If you\n" - "want all NetMail to be sent using users' real names, set this option to\n" - "`No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Aliases in NetMail",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_ALIAS)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_ALIAS; - } - else if(i==1 && cfg.netmail_misc&NMAIL_ALIAS) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_ALIAS; - } - break; - case 9: - i=1; - uifc.helpbuf= - "`NetMail Defaults to Crash Status:`\n" - "\n" - "If you want all NetMail to default to crash (send immediately) status,\n" - "set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"NetMail Defaults to Crash Status",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_CRASH)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_CRASH; - } - else if(i==1 && cfg.netmail_misc&NMAIL_CRASH) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_CRASH; - } - break; - case 10: - i=1; - uifc.helpbuf= - "`NetMail Defaults to Direct Status:`\n" - "\n" - "If you want all NetMail to default to direct (send directly) status,\n" - "set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"NetMail Defaults to Direct Status",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_DIRECT)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_DIRECT; - } - else if(i==1 && cfg.netmail_misc&NMAIL_DIRECT) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_DIRECT; - } - break; - case 11: - i=1; - uifc.helpbuf= - "`NetMail Defaults to Hold Status:`\n" - "\n" - "If you want all NetMail to default to hold status, set this option to\n" - "`Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"NetMail Defaults to Hold Status",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_HOLD)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_HOLD; - } - else if(i==1 && cfg.netmail_misc&NMAIL_HOLD) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_HOLD; - } - break; - case 12: - i=0; - uifc.helpbuf= - "`Kill NetMail After it is Sent:`\n" - "\n" - "If you want NetMail messages to be deleted after they are successfully\n" - "sent, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Kill NetMail After it is Sent",uifcYesNoOpts); - if(!i && !(cfg.netmail_misc&NMAIL_KILL)) { - uifc.changes=1; - cfg.netmail_misc|=NMAIL_KILL; - } - else if(i==1 && cfg.netmail_misc&NMAIL_KILL) { - uifc.changes=1; - cfg.netmail_misc&=~NMAIL_KILL; - } - break; - case 13: - ultoa(cfg.netmail_cost,str,10); - uifc.helpbuf= - "`Cost in Credits to Send NetMail:`\n" - "\n" - "This is the number of credits it will cost your users to send NetMail.\n" - "If you want the sending of NetMail to be free, set this value to `0`.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Cost in Credits to Send NetMail" - ,str,10,K_EDIT|K_NUMBER); - cfg.netmail_cost=atol(str); - break; - } - } - } - else if(i==3) { - done=0; - while(!done) { - i=0; - strcpy(opt[i++],"Network Hubs..."); - sprintf(opt[i++],"%-20.20s%-12s","Site Name",cfg.sys_psname); - sprintf(opt[i++],"%-20.20s%-"PRIu32,"Site Number",cfg.sys_psnum); - opt[i][0]=0; - uifc.helpbuf= - "`PostLink Networks:`\n" - "\n" - "From this menu you can configure PostLink or PCRelay Networks.\n" - ; - i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&pnet_dflt,0 - ,"PostLink Networks",opt); - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 1: - uifc.helpbuf= - "`PostLink Site Name:`\n" - "\n" - "If your system is networked via PostLink or PCRelay, this should be the\n" - "Site Name for your BBS.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Site Name" - ,cfg.sys_psname,sizeof(cfg.sys_psname)-1,K_UPPER|K_EDIT); - break; - case 2: - uifc.helpbuf= - "`PostLink Site Number:`\n" - "\n" - "If your system is networked via PostLink or PCRelay, this should be the\n" - "Site Number for your BBS.\n" - ; - ultoa(cfg.sys_psnum,str,10); - uifc.input(WIN_MID|WIN_SAV,0,0,"Site Number" - ,str,10,K_NUMBER|K_EDIT); - cfg.sys_psnum=atol(str); - break; - case 0: - while(1) { - for(i=0;i<cfg.total_phubs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-10.10s",cfg.phub[i]->name); - opt[i][0]=0; - i=WIN_ACT|WIN_RHT|WIN_SAV; - if(cfg.total_phubs<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(cfg.total_phubs) - i|=WIN_DEL; + case 8: + i=1; uifc.helpbuf= - "`PostLink Network Hubs:`\n" + "`Use Aliases in NetMail:`\n" "\n" - "This is a list of PostLink and/or PCRelay network hubs that your system\n" - "calls to exchange packets with.\n" + "If you allow aliases on your system and wish users to have their NetMail\n" + "contain their alias as the `From User`, set this option to `Yes`. If you\n" + "want all NetMail to be sent using users' real names, set this option to\n" + "`No`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Use Aliases in NetMail",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_ALIAS)) { + uifc.changes=1; + cfg.netmail_misc|=NMAIL_ALIAS; + } + else if(i==1 && cfg.netmail_misc&NMAIL_ALIAS) { + uifc.changes=1; + cfg.netmail_misc&=~NMAIL_ALIAS; + } + break; + case 9: + i=1; + uifc.helpbuf= + "`NetMail Defaults to Crash Status:`\n" "\n" - "To add a hub, select the desired location with the arrow keys and hit\n" - "~ INS ~.\n" + "If you want all NetMail to default to crash (send immediately) status,\n" + "set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"NetMail Defaults to Crash Status",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_CRASH)) { + uifc.changes=1; + cfg.netmail_misc|=NMAIL_CRASH; + } + else if(i==1 && cfg.netmail_misc&NMAIL_CRASH) { + uifc.changes=1; + cfg.netmail_misc&=~NMAIL_CRASH; + } + break; + case 10: + i=1; + uifc.helpbuf= + "`NetMail Defaults to Direct Status:`\n" "\n" - "To delete a hub, select it and hit ~ DEL ~.\n" + "If you want all NetMail to default to direct (send directly) status,\n" + "set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"NetMail Defaults to Direct Status",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_DIRECT)) { + uifc.changes=1; + cfg.netmail_misc|=NMAIL_DIRECT; + } + else if(i==1 && cfg.netmail_misc&NMAIL_DIRECT) { + uifc.changes=1; + cfg.netmail_misc&=~NMAIL_DIRECT; + } + break; + case 11: + i=1; + uifc.helpbuf= + "`NetMail Defaults to Hold Status:`\n" "\n" - "To configure a hub, select it and hit ~ ENTER ~.\n" + "If you want all NetMail to default to hold status, set this option to\n" + "`Yes`.\n" ; - i=uifc.list(i,0,0,0,&phub_dflt,0 - ,"PostLink Hubs",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if (msk == MSK_INS) { - if((cfg.phub=(phub_t **)realloc(cfg.phub - ,sizeof(phub_t *)*(cfg.total_phubs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(phub_t *)*(cfg.total_phubs+1)); - cfg.total_phubs=0; - bail(1); - continue; - } - + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"NetMail Defaults to Hold Status",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_HOLD)) { + uifc.changes=1; + cfg.netmail_misc|=NMAIL_HOLD; + } + else if(i==1 && cfg.netmail_misc&NMAIL_HOLD) { + uifc.changes=1; + cfg.netmail_misc&=~NMAIL_HOLD; + } + break; + case 12: + i=0; + uifc.helpbuf= + "`Kill NetMail After it is Sent:`\n" + "\n" + "If you want NetMail messages to be deleted after they are successfully\n" + "sent, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Kill NetMail After it is Sent",uifcYesNoOpts); + if(!i && !(cfg.netmail_misc&NMAIL_KILL)) { + uifc.changes=1; + cfg.netmail_misc|=NMAIL_KILL; + } + else if(i==1 && cfg.netmail_misc&NMAIL_KILL) { + uifc.changes=1; + cfg.netmail_misc&=~NMAIL_KILL; + } + break; + case 13: + ultoa(cfg.netmail_cost,str,10); + uifc.helpbuf= + "`Cost in Credits to Send NetMail:`\n" + "\n" + "This is the number of credits it will cost your users to send NetMail.\n" + "If you want the sending of NetMail to be free, set this value to `0`.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Cost in Credits to Send NetMail" + ,str,10,K_EDIT|K_NUMBER); + cfg.netmail_cost=atol(str); + break; + } + } + } + else if(i==3) { + done=0; + while(!done) { + i=0; + strcpy(opt[i++],"Network Hubs..."); + sprintf(opt[i++],"%-20.20s%-12s","Site Name",cfg.sys_psname); + sprintf(opt[i++],"%-20.20s%-"PRIu32,"Site Number",cfg.sys_psnum); + opt[i][0]=0; + uifc.helpbuf= + "`PostLink Networks:`\n" + "\n" + "From this menu you can configure PostLink or PCRelay Networks.\n" + ; + i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&pnet_dflt,0 + ,"PostLink Networks",opt); + switch(i) { + case -1: /* ESC */ + done=1; + break; + case 1: + uifc.helpbuf= + "`PostLink Site Name:`\n" + "\n" + "If your system is networked via PostLink or PCRelay, this should be the\n" + "Site Name for your BBS.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"Site Name" + ,cfg.sys_psname,sizeof(cfg.sys_psname)-1,K_UPPER|K_EDIT); + break; + case 2: + uifc.helpbuf= + "`PostLink Site Number:`\n" + "\n" + "If your system is networked via PostLink or PCRelay, this should be the\n" + "Site Number for your BBS.\n" + ; + ultoa(cfg.sys_psnum,str,10); + uifc.input(WIN_MID|WIN_SAV,0,0,"Site Number" + ,str,10,K_NUMBER|K_EDIT); + cfg.sys_psnum=atol(str); + break; + case 0: + while(1) { + for(i=0;i<cfg.total_phubs && i<MAX_OPTS;i++) + sprintf(opt[i],"%-10.10s",cfg.phub[i]->name); + opt[i][0]=0; + i=WIN_ACT|WIN_RHT|WIN_SAV; + if(cfg.total_phubs<MAX_OPTS) + i|=WIN_INS|WIN_INSACT|WIN_XTR; + if(cfg.total_phubs) + i|=WIN_DEL; uifc.helpbuf= - "`Network Hub Site Name:`\n" + "`PostLink Network Hubs:`\n" + "\n" + "This is a list of PostLink and/or PCRelay network hubs that your system\n" + "calls to exchange packets with.\n" "\n" - "This is the Site Name of this hub. It is used for only for reference.\n" + "To add a hub, select the desired location with the arrow keys and hit\n" + "~ INS ~.\n" + "\n" + "To delete a hub, select it and hit ~ DEL ~.\n" + "\n" + "To configure a hub, select it and hit ~ ENTER ~.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Site Name",str,10,K_UPPER)<1) - continue; + i=uifc.list(i,0,0,0,&phub_dflt,0 + ,"PostLink Hubs",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if (msk == MSK_INS) { + if((cfg.phub=(phub_t **)realloc(cfg.phub + ,sizeof(phub_t *)*(cfg.total_phubs+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr + ,sizeof(phub_t *)*(cfg.total_phubs+1)); + cfg.total_phubs=0; + bail(1); + continue; + } - for(j=cfg.total_phubs;j>i;j--) - cfg.phub[j]=cfg.phub[j-1]; + uifc.helpbuf= + "`Network Hub Site Name:`\n" + "\n" + "This is the Site Name of this hub. It is used for only for reference.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Site Name",str,10,K_UPPER)<1) + continue; - if((cfg.phub[i]=(phub_t *)malloc(sizeof(phub_t))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(phub_t)); + for(j=cfg.total_phubs;j>i;j--) + cfg.phub[j]=cfg.phub[j-1]; + + if((cfg.phub[i]=(phub_t *)malloc(sizeof(phub_t))) + ==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr + ,sizeof(phub_t)); + continue; + } + memset(cfg.phub[i],0,sizeof(phub_t)); + strcpy(cfg.phub[i]->name,str); + strcpy(cfg.phub[i]->call,"%!pnet"); + cfg.phub[i]->node=1; + cfg.phub[i]->days=(uchar)0xff; /* all days */ + cfg.total_phubs++; + uifc.changes=1; + continue; + } + if (msk == MSK_DEL) { + free(cfg.phub[i]); + cfg.total_phubs--; + while(i<cfg.total_phubs) { + cfg.phub[i]=cfg.phub[i+1]; + i++; + } + uifc.changes=1; continue; } - memset(cfg.phub[i],0,sizeof(phub_t)); - strcpy(cfg.phub[i]->name,str); - strcpy(cfg.phub[i]->call,"%!pnet"); - cfg.phub[i]->node=1; - cfg.phub[i]->days=(uchar)0xff; /* all days */ - cfg.total_phubs++; + phub_edit(i); + } + break; + } + } + } + + else if(i==0) { /* Internet E-mail */ + done=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%s" + ,"System Address",cfg.sys_inetaddr); + sprintf(opt[i++],"%-27.27s%.40s" + ,"Inbound E-mail Semaphore",cfg.smtpmail_sem); + sprintf(opt[i++],"%-27.27s%.40s" + ,"Outbound E-mail Semaphore",cfg.inetmail_sem); + sprintf(opt[i++],"%-27.27s%s" + ,"Allow Sending of E-mail" + ,cfg.inetmail_misc&NMAIL_ALLOW ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"Allow File Attachments" + ,cfg.inetmail_misc&NMAIL_FILE ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s" + ,"Send E-mail Using Alias" + ,cfg.inetmail_misc&NMAIL_ALIAS ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%"PRIu32 + ,"Cost to Send E-mail",cfg.inetmail_cost); + opt[i][0]=0; + uifc.helpbuf= + "`Internet E-mail:`\n" + "\n" + "This menu contains configuration options that pertain specifically to\n" + "Internet E-mail.\n" + ; + i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&inet_dflt,0 + ,"Internet E-mail",opt); + switch(i) { + case -1: /* ESC */ + done=1; + break; + case 0: + uifc.helpbuf= + "`Sytem Internet Address:`\n" + "\n" + "Enter your system's Internet address (hostname or IP address) here\n" + "(e.g. `joesbbs.com`).\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"" + ,cfg.sys_inetaddr,sizeof(cfg.sys_inetaddr)-1,K_EDIT); + break; + case 1: + uifc.helpbuf= + "`Inbound Internet E-mail Semaphore File:`\n" + "\n" + "This is a filename that will be used as a semaphore (signal) to any\n" + "external Internet e-mail processors that new mail has been received\n" + "and the message base should be re-scanned.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound Semaphore" + ,cfg.smtpmail_sem,sizeof(cfg.smtpmail_sem)-1,K_EDIT); + break; + case 2: + uifc.helpbuf= + "`Outbound Internet E-mail Semaphore File:`\n" + "\n" + "This is a filename that will be used as a semaphore (signal) to any\n" + "external Internet gateways (if supported) that new mail has been created\n" + "and the message base should be re-scanned.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Semaphore" + ,cfg.inetmail_sem,sizeof(cfg.inetmail_sem)-1,K_EDIT); + break; + case 3: + i=0; + uifc.helpbuf= + "`Allow Users to Send Internet E-mail:`\n" + "\n" + "If you want your users to be allowed to send Internet E-mail, set this\n" + "option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Send E-mail",uifcYesNoOpts); + if(!i && !(cfg.inetmail_misc&NMAIL_ALLOW)) { uifc.changes=1; - continue; + cfg.inetmail_misc|=NMAIL_ALLOW; } - if (msk == MSK_DEL) { - free(cfg.phub[i]); - cfg.total_phubs--; - while(i<cfg.total_phubs) { - cfg.phub[i]=cfg.phub[i+1]; - i++; - } + else if(i==1 && cfg.inetmail_misc&NMAIL_ALLOW) { + uifc.changes=1; + cfg.inetmail_misc&=~NMAIL_ALLOW; + } + break; + case 4: + i=0; + uifc.helpbuf= + "`Allow Users to Send Internet E-mail File Attachments:`\n" + "\n" + "If you want your users to be allowed to send Internet E-mail with file\n" + "attachments, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Send E-mail with File Attachments",uifcYesNoOpts); + if(!i && !(cfg.inetmail_misc&NMAIL_FILE)) { + uifc.changes=1; + cfg.inetmail_misc|=NMAIL_FILE; + } + else if(i==1 && cfg.inetmail_misc&NMAIL_FILE) { + uifc.changes=1; + cfg.inetmail_misc&=~NMAIL_FILE; + } + break; + case 5: + i=1; + uifc.helpbuf= + "`Use Aliases in Internet E-mail:`\n" + "\n" + "If you allow aliases on your system and wish users to have their\n" + "Internet E-mail contain their alias as the `From User`, set this option to\n" + "`Yes`. If you want all E-mail to be sent using users' real names, set this\n" + "option to `No`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Use Aliases in Internet E-mail",uifcYesNoOpts); + if(!i && !(cfg.inetmail_misc&NMAIL_ALIAS)) { uifc.changes=1; - continue; + cfg.inetmail_misc|=NMAIL_ALIAS; } - phub_edit(i); - } - break; + else if(i==1 && cfg.inetmail_misc&NMAIL_ALIAS) { + uifc.changes=1; + cfg.inetmail_misc&=~NMAIL_ALIAS; + } + break; + case 6: + ultoa(cfg.inetmail_cost,str,10); + uifc.helpbuf= + "`Cost in Credits to Send Internet E-mail:`\n" + "\n" + "This is the number of credits it will cost your users to send Internet\n" + "E-mail. If you want the sending of Internet E-mail to be free, set this\n" + "value to `0`.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Cost in Credits to Send Internet E-mail" + ,str,10,K_EDIT|K_NUMBER); + cfg.inetmail_cost=atol(str); + break; + } } - } - } + } - else if(i==0) { /* Internet E-mail */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s" - ,"System Address",cfg.sys_inetaddr); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Inbound E-mail Semaphore",cfg.smtpmail_sem); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Outbound E-mail Semaphore",cfg.inetmail_sem); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow Sending of E-mail" - ,cfg.inetmail_misc&NMAIL_ALLOW ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow File Attachments" - ,cfg.inetmail_misc&NMAIL_FILE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Send E-mail Using Alias" - ,cfg.inetmail_misc&NMAIL_ALIAS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%"PRIu32 - ,"Cost to Send E-mail",cfg.inetmail_cost); - opt[i][0]=0; - uifc.helpbuf= - "`Internet E-mail:`\n" - "\n" - "This menu contains configuration options that pertain specifically to\n" - "Internet E-mail.\n" - ; - i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&inet_dflt,0 - ,"Internet E-mail",opt); - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 0: - uifc.helpbuf= - "`Sytem Internet Address:`\n" - "\n" - "Enter your system's Internet address (hostname or IP address) here\n" - "(e.g. `joesbbs.com`).\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"" - ,cfg.sys_inetaddr,sizeof(cfg.sys_inetaddr)-1,K_EDIT); - break; - case 1: - uifc.helpbuf= - "`Inbound Internet E-mail Semaphore File:`\n" - "\n" - "This is a filename that will be used as a semaphore (signal) to any\n" - "external Internet e-mail processors that new mail has been received\n" - "and the message base should be re-scanned.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound Semaphore" - ,cfg.smtpmail_sem,sizeof(cfg.smtpmail_sem)-1,K_EDIT); - break; - case 2: - uifc.helpbuf= - "`Outbound Internet E-mail Semaphore File:`\n" - "\n" - "This is a filename that will be used as a semaphore (signal) to any\n" - "external Internet gateways (if supported) that new mail has been created\n" - "and the message base should be re-scanned.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Semaphore" - ,cfg.inetmail_sem,sizeof(cfg.inetmail_sem)-1,K_EDIT); - break; - case 3: - i=0; - uifc.helpbuf= - "`Allow Users to Send Internet E-mail:`\n" - "\n" - "If you want your users to be allowed to send Internet E-mail, set this\n" - "option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send E-mail",uifcYesNoOpts); - if(!i && !(cfg.inetmail_misc&NMAIL_ALLOW)) { - uifc.changes=1; - cfg.inetmail_misc|=NMAIL_ALLOW; - } - else if(i==1 && cfg.inetmail_misc&NMAIL_ALLOW) { - uifc.changes=1; - cfg.inetmail_misc&=~NMAIL_ALLOW; - } - break; - case 4: - i=0; - uifc.helpbuf= - "`Allow Users to Send Internet E-mail File Attachments:`\n" - "\n" - "If you want your users to be allowed to send Internet E-mail with file\n" - "attachments, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send E-mail with File Attachments",uifcYesNoOpts); - if(!i && !(cfg.inetmail_misc&NMAIL_FILE)) { - uifc.changes=1; - cfg.inetmail_misc|=NMAIL_FILE; - } - else if(i==1 && cfg.inetmail_misc&NMAIL_FILE) { - uifc.changes=1; - cfg.inetmail_misc&=~NMAIL_FILE; - } - break; - case 5: - i=1; - uifc.helpbuf= - "`Use Aliases in Internet E-mail:`\n" - "\n" - "If you allow aliases on your system and wish users to have their\n" - "Internet E-mail contain their alias as the `From User`, set this option to\n" - "`Yes`. If you want all E-mail to be sent using users' real names, set this\n" - "option to `No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Aliases in Internet E-mail",uifcYesNoOpts); - if(!i && !(cfg.inetmail_misc&NMAIL_ALIAS)) { - uifc.changes=1; - cfg.inetmail_misc|=NMAIL_ALIAS; - } - else if(i==1 && cfg.inetmail_misc&NMAIL_ALIAS) { - uifc.changes=1; - cfg.inetmail_misc&=~NMAIL_ALIAS; - } - break; - case 6: - ultoa(cfg.inetmail_cost,str,10); - uifc.helpbuf= - "`Cost in Credits to Send Internet E-mail:`\n" - "\n" - "This is the number of credits it will cost your users to send Internet\n" - "E-mail. If you want the sending of Internet E-mail to be free, set this\n" - "value to `0`.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Cost in Credits to Send Internet E-mail" - ,str,10,K_EDIT|K_NUMBER); - cfg.inetmail_cost=atol(str); - break; - } - } + else { /* ESC */ + i=save_changes(WIN_MID|WIN_SAV); + if(i==-1) + continue; + if(!i) { + write_msgs_cfg(&cfg,backup_level); + refresh_cfg(&cfg); + } + break; + } } - - else { /* ESC */ - i=save_changes(WIN_MID|WIN_SAV); - if(i==-1) - continue; - if(!i) { - write_msgs_cfg(&cfg,backup_level); - refresh_cfg(&cfg); - } - break; - } - } } void qhub_edit(int num) @@ -923,238 +923,238 @@ void qhub_edit(int num) char *p,done=0,str[256]; int i,j; -while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Hub System ID",cfg.qhub[num]->id); - sprintf(opt[i++],"%-27.27s%.40s","Pack Command Line",cfg.qhub[num]->pack); - sprintf(opt[i++],"%-27.27s%.40s","Unpack Command Line",cfg.qhub[num]->unpack); - sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.qhub[num]->call); - sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.qhub[num]->node); - sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.qhub[num]->days)); - if(cfg.qhub[num]->freq) { - sprintf(str,"%u times a day",1440/cfg.qhub[num]->freq); - sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); - } - else { - sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60,cfg.qhub[num]->time%60); - sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); - } - sprintf(opt[i++],"%-27.27s%s","Include Kludge Lines", cfg.qhub[num]->misc&QHUB_NOKLUDGES ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Include VOTING.DAT File", cfg.qhub[num]->misc&QHUB_NOVOTING ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Include HEADERS.DAT File", cfg.qhub[num]->misc&QHUB_NOHEADERS ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Extended (QWKE) Packets", cfg.qhub[num]->misc&QHUB_EXT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Exported Ctrl-A Codes" - ,cfg.qhub[num]->misc&QHUB_EXPCTLA ? "Expand" : cfg.qhub[num]->misc&QHUB_RETCTLA ? "Leave in" : "Strip"); - strcpy(opt[i++],"Import Conferences..."); - strcpy(opt[i++],"Networked Sub-boards..."); - opt[i][0]=0; - sprintf(str,"%s QWK Network Hub",cfg.qhub[num]->id); - uifc.helpbuf= - "`QWK Network Hub Configuration:`\n" - "\n" - "This menu allows you to configure options specific to this QWKnet hub.\n" - "\n" - "The `Hub System ID` must match the QWK System ID of this network hub.\n" - "\n" - "The `Pack` and `Unpack Command Lines` are used for creating and extracting\n" - "REP (reply) and QWK message packets (files, usually in PKZIP format).\n" - "\n" - "The `Call-out Command Line` is executed when your system attempts a packet\n" - "exchange with the QWKnet hub (e.g. executes a script).\n" - "\n" - "`Kludge Lines` (e.g. @TZ, @VIA, @MSGID, @REPLY) provide information not\n" - "available in standard QWK message headers, but are superfluous when the\n" - "HEADERS.DAT file is supported and used.\n" - "\n" - "The `VOTING.DAT` file is the distributed QWKnet voting system supported\n" - "in Synchronet v3.17 and later\n" - "\n" - "The `HEADERS.DAT` file provides all the same information that can be\n" - "found in Kludge Lines and also addresses the 25-character QWK field\n" - "length limits. HEADERS.DAT is supported in Synchronet v3.15 and later.\n" - "\n" - "`Extended (QWKE) Packets` are not normally used in QWK Networking.\n" - "Setting this to `Yes` enables some QWKE-specific Kludge Lines that are\n" - "superfluous when the HEADERS.DAT file is supported and used.\n" - "\n" - "`Exported Ctrl-A Codes` determines how Synchronet attribute/color\n" - "codes in messages are exported into the QWK network packets. This\n" - "may be set to `Leave in` (retain), `Expand` (to ANSI), or `Strip` (remove).\n" - "This setting is used for QWKnet NetMail messages and may over-ride the\n" - "equivalent setting for each sub-board.\n" - "\n" - "`Import Conferences...` allows you to import a QWK `control.dat` file which\n" - "can both create new sub-boards in a target message group of your choice\n" - "and set the `Networked Sub-boards` with QWK conference numbers correlating\n" - "with the hub system.\n" - "\n" - "`Networked Sub-boards...` allows you to manually add, remove, or modify\n" - "local sub-board associations with conferences on this QWK network hub.\n" - ; - switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&qhub_dflt,0 - ,str,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf= - "`QWK Network Hub System ID:`\n" - "\n" - "This is the QWK System ID of this hub. It is used for incoming and\n" - "outgoing network packets and must be accurate.\n" - ; - strcpy(str,cfg.qhub[num]->id); /* save */ - if(!uifc.input(WIN_MID|WIN_SAV,0,0,"QWK Network Hub System ID" - ,cfg.qhub[num]->id,LEN_QWKID,K_UPPER|K_EDIT)) - strcpy(cfg.qhub[num]->id,str); - break; - case 1: - uifc.helpbuf= - "`REP Packet Creation Command:`\n" - "\n" - "This is the command line to use to create (compress) REP packets for\n" - "this QWK network hub.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"" - ,cfg.qhub[num]->pack,sizeof(cfg.qhub[num]->pack)-1,K_EDIT); - break; - case 2: - uifc.helpbuf= - "`QWK Packet Extraction Command:`\n" - "\n" - "This is the command line to use to extract (decompress) QWK packets from\n" - "this QWK network hub.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"" - ,cfg.qhub[num]->unpack,sizeof(cfg.qhub[num]->unpack)-1,K_EDIT); - break; - case 3: - uifc.helpbuf= - "`QWK Network Hub Call-out Command Line:`\n" - "\n" - "This is the command line to use to initiate a call-out to this QWK\n" - "network hub.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"" - ,cfg.qhub[num]->call,sizeof(cfg.qhub[num]->call)-1,K_EDIT); - break; - case 4: - sprintf(str,"%u",cfg.qhub[num]->node); - uifc.helpbuf= - "`Node to Perform Call-out:`\n" - "\n" - "This is the number of the node to perform the call-out for this QWK\n" - "network hub.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); - cfg.qhub[num]->node=atoi(str); - break; - case 5: - j=0; - while(1) { - for(i=0;i<7;i++) - sprintf(opt[i],"%s %s" - ,wday[i],(cfg.qhub[num]->days&(1<<i)) ? "Yes":"No"); - opt[i][0]=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%s","Hub System ID",cfg.qhub[num]->id); + sprintf(opt[i++],"%-27.27s%.40s","Pack Command Line",cfg.qhub[num]->pack); + sprintf(opt[i++],"%-27.27s%.40s","Unpack Command Line",cfg.qhub[num]->unpack); + sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.qhub[num]->call); + sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.qhub[num]->node); + sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.qhub[num]->days)); + if(cfg.qhub[num]->freq) { + sprintf(str,"%u times a day",1440/cfg.qhub[num]->freq); + sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); + } + else { + sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60,cfg.qhub[num]->time%60); + sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); + } + sprintf(opt[i++],"%-27.27s%s","Include Kludge Lines", cfg.qhub[num]->misc&QHUB_NOKLUDGES ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s%s","Include VOTING.DAT File", cfg.qhub[num]->misc&QHUB_NOVOTING ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s%s","Include HEADERS.DAT File", cfg.qhub[num]->misc&QHUB_NOHEADERS ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s%s","Extended (QWKE) Packets", cfg.qhub[num]->misc&QHUB_EXT ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s%s","Exported Ctrl-A Codes" + ,cfg.qhub[num]->misc&QHUB_EXPCTLA ? "Expand" : cfg.qhub[num]->misc&QHUB_RETCTLA ? "Leave in" : "Strip"); + strcpy(opt[i++],"Import Conferences..."); + strcpy(opt[i++],"Networked Sub-boards..."); + opt[i][0]=0; + sprintf(str,"%s QWK Network Hub",cfg.qhub[num]->id); + uifc.helpbuf= + "`QWK Network Hub Configuration:`\n" + "\n" + "This menu allows you to configure options specific to this QWKnet hub.\n" + "\n" + "The `Hub System ID` must match the QWK System ID of this network hub.\n" + "\n" + "The `Pack` and `Unpack Command Lines` are used for creating and extracting\n" + "REP (reply) and QWK message packets (files, usually in PKZIP format).\n" + "\n" + "The `Call-out Command Line` is executed when your system attempts a packet\n" + "exchange with the QWKnet hub (e.g. executes a script).\n" + "\n" + "`Kludge Lines` (e.g. @TZ, @VIA, @MSGID, @REPLY) provide information not\n" + "available in standard QWK message headers, but are superfluous when the\n" + "HEADERS.DAT file is supported and used.\n" + "\n" + "The `VOTING.DAT` file is the distributed QWKnet voting system supported\n" + "in Synchronet v3.17 and later\n" + "\n" + "The `HEADERS.DAT` file provides all the same information that can be\n" + "found in Kludge Lines and also addresses the 25-character QWK field\n" + "length limits. HEADERS.DAT is supported in Synchronet v3.15 and later.\n" + "\n" + "`Extended (QWKE) Packets` are not normally used in QWK Networking.\n" + "Setting this to `Yes` enables some QWKE-specific Kludge Lines that are\n" + "superfluous when the HEADERS.DAT file is supported and used.\n" + "\n" + "`Exported Ctrl-A Codes` determines how Synchronet attribute/color\n" + "codes in messages are exported into the QWK network packets. This\n" + "may be set to `Leave in` (retain), `Expand` (to ANSI), or `Strip` (remove).\n" + "This setting is used for QWKnet NetMail messages and may over-ride the\n" + "equivalent setting for each sub-board.\n" + "\n" + "`Import Conferences...` allows you to import a QWK `control.dat` file which\n" + "can both create new sub-boards in a target message group of your choice\n" + "and set the `Networked Sub-boards` with QWK conference numbers correlating\n" + "with the hub system.\n" + "\n" + "`Networked Sub-boards...` allows you to manually add, remove, or modify\n" + "local sub-board associations with conferences on this QWK network hub.\n" + ; + switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&qhub_dflt,0 + ,str,opt)) { + case -1: + done=1; + break; + case 0: uifc.helpbuf= - "`Days to Perform Call-out:`\n" + "`QWK Network Hub System ID:`\n" "\n" - "These are the days that a call-out will be performed for this QWK\n" - "network hub.\n" + "This is the QWK System ID of this hub. It is used for incoming and\n" + "outgoing network packets and must be accurate.\n" ; - i=uifc.list(WIN_MID,0,0,0,&j,0 - ,"Days to Perform Call-out",opt); - if(i==-1) - break; - cfg.qhub[num]->days^=(1<<i); - uifc.changes=1; - } - break; - case 6: - i=1; - uifc.helpbuf= - "`Perform Call-out at a Specific Time:`\n" - "\n" - "If you want the system call this QWK network hub at a specific time,\n" - "set this option to `Yes`. If you want the system to call this network\n" - "hub more than once a day at predetermined intervals, set this option to\n" - "`No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Perform Call-out at a Specific Time",uifcYesNoOpts); - if(i==0) { - sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60 - ,cfg.qhub[num]->time%60); + strcpy(str,cfg.qhub[num]->id); /* save */ + if(!uifc.input(WIN_MID|WIN_SAV,0,0,"QWK Network Hub System ID" + ,cfg.qhub[num]->id,LEN_QWKID,K_UPPER|K_EDIT)) + strcpy(cfg.qhub[num]->id,str); + break; + case 1: uifc.helpbuf= - "`Time to Perform Call-out:`\n" + "`REP Packet Creation Command:`\n" "\n" - "This is the time (in 24 hour HH:MM format) to perform the call-out to\n" + "This is the command line to use to create (compress) REP packets for\n" "this QWK network hub.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Time to Perform Call-out (HH:MM)" - ,str,5,K_UPPER|K_EDIT)>0) { - cfg.qhub[num]->freq=0; - cfg.qhub[num]->time=atoi(str)*60; - if((p=strchr(str,':'))!=NULL) - cfg.qhub[num]->time+=atoi(p+1); - } - } - else if(i==1) { - sprintf(str,"%u",cfg.qhub[num]->freq - && cfg.qhub[num]->freq<=1440 ? 1440/cfg.qhub[num]->freq : 0); + uifc.input(WIN_MID|WIN_SAV,0,0,"" + ,cfg.qhub[num]->pack,sizeof(cfg.qhub[num]->pack)-1,K_EDIT); + break; + case 2: uifc.helpbuf= - "`Number of Call-outs Per Day:`\n" + "`QWK Packet Extraction Command:`\n" "\n" - "This is the maximum number of times the system will perform a call-out\n" - "per day to this QWK network hub. This value is actually converted by\n" - "Synchronet into minutes between call-outs and when the BBS is idle\n" - "and this number of minutes since the last call-out is reached, it will\n" - "perform a call-out.\n" + "This is the command line to use to extract (decompress) QWK packets from\n" + "this QWK network hub.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Number of Call-outs Per Day" - ,str,4,K_NUMBER|K_EDIT)>0) { - cfg.qhub[num]->time=0; - i=atoi(str); - if(i && i<=1440) - cfg.qhub[num]->freq=1440/i; - else - cfg.qhub[num]->freq=0; - } - } - break; - case 7: - cfg.qhub[num]->misc^=QHUB_NOKLUDGES; - uifc.changes=1; - break; - case 8: - cfg.qhub[num]->misc^=QHUB_NOVOTING; - uifc.changes=1; - break; - case 9: - cfg.qhub[num]->misc^=QHUB_NOHEADERS; - uifc.changes=1; - break; - case 10: - cfg.qhub[num]->misc^=QHUB_EXT; - uifc.changes=1; - break; - case 11: - i = cfg.qhub[num]->misc&QHUB_CTRL_A; - i++; - if(i == QHUB_CTRL_A) i = 0; - cfg.qhub[num]->misc &= ~QHUB_CTRL_A; - cfg.qhub[num]->misc |= i; - uifc.changes=1; - break; - case 12: - import_qwk_conferences(num); - break; - case 13: - qhub_sub_edit(num); - break; + uifc.input(WIN_MID|WIN_SAV,0,0,"" + ,cfg.qhub[num]->unpack,sizeof(cfg.qhub[num]->unpack)-1,K_EDIT); + break; + case 3: + uifc.helpbuf= + "`QWK Network Hub Call-out Command Line:`\n" + "\n" + "This is the command line to use to initiate a call-out to this QWK\n" + "network hub.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"" + ,cfg.qhub[num]->call,sizeof(cfg.qhub[num]->call)-1,K_EDIT); + break; + case 4: + sprintf(str,"%u",cfg.qhub[num]->node); + uifc.helpbuf= + "`Node to Perform Call-out:`\n" + "\n" + "This is the number of the node to perform the call-out for this QWK\n" + "network hub.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); + cfg.qhub[num]->node=atoi(str); + break; + case 5: + j=0; + while(1) { + for(i=0;i<7;i++) + sprintf(opt[i],"%s %s" + ,wday[i],(cfg.qhub[num]->days&(1<<i)) ? "Yes":"No"); + opt[i][0]=0; + uifc.helpbuf= + "`Days to Perform Call-out:`\n" + "\n" + "These are the days that a call-out will be performed for this QWK\n" + "network hub.\n" + ; + i=uifc.list(WIN_MID,0,0,0,&j,0 + ,"Days to Perform Call-out",opt); + if(i==-1) + break; + cfg.qhub[num]->days^=(1<<i); + uifc.changes=1; + } + break; + case 6: + i=1; + uifc.helpbuf= + "`Perform Call-out at a Specific Time:`\n" + "\n" + "If you want the system call this QWK network hub at a specific time,\n" + "set this option to `Yes`. If you want the system to call this network\n" + "hub more than once a day at predetermined intervals, set this option to\n" + "`No`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Perform Call-out at a Specific Time",uifcYesNoOpts); + if(i==0) { + sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60 + ,cfg.qhub[num]->time%60); + uifc.helpbuf= + "`Time to Perform Call-out:`\n" + "\n" + "This is the time (in 24 hour HH:MM format) to perform the call-out to\n" + "this QWK network hub.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Time to Perform Call-out (HH:MM)" + ,str,5,K_UPPER|K_EDIT)>0) { + cfg.qhub[num]->freq=0; + cfg.qhub[num]->time=atoi(str)*60; + if((p=strchr(str,':'))!=NULL) + cfg.qhub[num]->time+=atoi(p+1); + } + } + else if(i==1) { + sprintf(str,"%u",cfg.qhub[num]->freq + && cfg.qhub[num]->freq<=1440 ? 1440/cfg.qhub[num]->freq : 0); + uifc.helpbuf= + "`Number of Call-outs Per Day:`\n" + "\n" + "This is the maximum number of times the system will perform a call-out\n" + "per day to this QWK network hub. This value is actually converted by\n" + "Synchronet into minutes between call-outs and when the BBS is idle\n" + "and this number of minutes since the last call-out is reached, it will\n" + "perform a call-out.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Number of Call-outs Per Day" + ,str,4,K_NUMBER|K_EDIT)>0) { + cfg.qhub[num]->time=0; + i=atoi(str); + if(i && i<=1440) + cfg.qhub[num]->freq=1440/i; + else + cfg.qhub[num]->freq=0; + } + } + break; + case 7: + cfg.qhub[num]->misc^=QHUB_NOKLUDGES; + uifc.changes=1; + break; + case 8: + cfg.qhub[num]->misc^=QHUB_NOVOTING; + uifc.changes=1; + break; + case 9: + cfg.qhub[num]->misc^=QHUB_NOHEADERS; + uifc.changes=1; + break; + case 10: + cfg.qhub[num]->misc^=QHUB_EXT; + uifc.changes=1; + break; + case 11: + i = cfg.qhub[num]->misc&QHUB_CTRL_A; + i++; + if(i == QHUB_CTRL_A) i = 0; + cfg.qhub[num]->misc &= ~QHUB_CTRL_A; + cfg.qhub[num]->misc |= i; + uifc.changes=1; + break; + case 12: + import_qwk_conferences(num); + break; + case 13: + qhub_sub_edit(num); + break; } } } @@ -1190,141 +1190,141 @@ void qhub_sub_edit(uint num) "this option to `Strip out`.\n" ; -k=0; -while(1) { - unsigned opts = 0; - for(j=0;j<cfg.qhub[num]->subs;j++) { - if(cfg.qhub[num]->sub[j] == NULL) - continue; - sprintf(opt[opts++],"%-5u %-*.*s %-*.*s" - ,cfg.qhub[num]->conf[j] - ,LEN_GSNAME,LEN_GSNAME - ,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname - ,LEN_SSNAME,LEN_SSNAME - ,cfg.qhub[num]->sub[j]->sname); - } - opt[opts][0]=0; - int mode =WIN_BOT|WIN_SAV|WIN_ACT; - if(cfg.qhub[num]->subs<MAX_OPTS) - mode |= WIN_INS|WIN_INSACT|WIN_XTR; - if(cfg.qhub[num]->subs) - mode |= WIN_DEL; - uifc.helpbuf= - "`QWK Networked Sub-boards:`\n" - "\n" - "This is a list of the sub-boards that are networked with this QWK\n" - "network hub.\n" - "\n" - "To add a sub-board, select the desired location and hit ~ INS ~.\n" - "\n" - "To remove a sub-board, select it and hit ~ DEL ~.\n" - "\n" - "To configure a sub-board for this QWK network hub, select it and hit\n" - "~ ENTER ~.\n" - ; - j=uifc.list(mode,0,0,0,&k,&bar - ,"Networked Sub-boards",opt); - if(j==-1) - break; - if((j&MSK_ON)==MSK_INS) { - j&=MSK_OFF; - if((l=getsub())==-1) - continue; - uifc.helpbuf=qwk_conf_num_help; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Conference Number on Hub" - ,str,5,K_NUMBER)<1) - continue; - strcpy(opt[0],"Strip out"); - strcpy(opt[1],"Leave in"); - strcpy(opt[2],"Expand to ANSI"); - opt[3][0]=0; - m=0; - uifc.helpbuf=qwk_ctrl_a_help; - if((m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0 - ,"Ctrl-A Codes",opt))==-1) - continue; - if(!new_qhub_sub(cfg.qhub[num], j, cfg.sub[l], atoi(str))) - continue; - if(!m) - cfg.qhub[num]->mode[j]=QHUB_STRIP; - else if(m==1) - cfg.qhub[num]->mode[j]=QHUB_RETCTLA; - else - cfg.qhub[num]->mode[j]=QHUB_EXPCTLA; - uifc.changes=1; - continue; - } - if((j&MSK_ON)==MSK_DEL) { - j&=MSK_OFF; - cfg.qhub[num]->subs--; - while(j<cfg.qhub[num]->subs) { - cfg.qhub[num]->sub[j]=cfg.qhub[num]->sub[j+1]; - cfg.qhub[num]->mode[j]=cfg.qhub[num]->mode[j+1]; - cfg.qhub[num]->conf[j]=cfg.qhub[num]->conf[j+1]; - j++; - } - uifc.changes=1; - continue; - } - l=0; + k=0; while(1) { - n=0; - sprintf(opt[n++],"%-22.22s%.*s %.*s" - ,"Sub-board" - ,LEN_GSNAME - ,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname - ,LEN_SSNAME - ,cfg.qhub[num]->sub[j]->sname); - sprintf(opt[n++],"%-22.22s%u" - ,"Conference Number",cfg.qhub[num]->conf[j]); - sprintf(opt[n++],"%-22.22s%s" - ,"Ctrl-A Codes",cfg.qhub[num]->mode[j]==QHUB_STRIP ? - "Strip out" : cfg.qhub[num]->mode[j]==QHUB_RETCTLA ? - "Leave in" : "Expand to ANSI"); - opt[n][0]=0; + unsigned opts = 0; + for(j=0;j<cfg.qhub[num]->subs;j++) { + if(cfg.qhub[num]->sub[j] == NULL) + continue; + sprintf(opt[opts++],"%-5u %-*.*s %-*.*s" + ,cfg.qhub[num]->conf[j] + ,LEN_GSNAME,LEN_GSNAME + ,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname + ,LEN_SSNAME,LEN_SSNAME + ,cfg.qhub[num]->sub[j]->sname); + } + opt[opts][0]=0; + int mode =WIN_BOT|WIN_SAV|WIN_ACT; + if(cfg.qhub[num]->subs<MAX_OPTS) + mode |= WIN_INS|WIN_INSACT|WIN_XTR; + if(cfg.qhub[num]->subs) + mode |= WIN_DEL; uifc.helpbuf= - "`QWK Networked Sub-board:`\n" + "`QWK Networked Sub-boards:`\n" + "\n" + "This is a list of the sub-boards that are networked with this QWK\n" + "network hub.\n" "\n" - "You are configuring the options for this sub-board for this QWK network\n" - "hub.\n" + "To add a sub-board, select the desired location and hit ~ INS ~.\n" + "\n" + "To remove a sub-board, select it and hit ~ DEL ~.\n" + "\n" + "To configure a sub-board for this QWK network hub, select it and hit\n" + "~ ENTER ~.\n" ; - l=uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0, - 22+LEN_GSNAME+LEN_SSNAME,&l,0 - ,"Networked Sub-board",opt); - if(l==-1) + j=uifc.list(mode,0,0,0,&k,&bar + ,"Networked Sub-boards",opt); + if(j==-1) break; - if(!l) { - m=getsub(); - if(m!=-1) { - cfg.qhub[num]->sub[j]=cfg.sub[m]; - uifc.changes=1; - } - } - else if(l==1) { + if((j&MSK_ON)==MSK_INS) { + j&=MSK_OFF; + if((l=getsub())==-1) + continue; uifc.helpbuf=qwk_conf_num_help; - sprintf(str, "%u", cfg.qhub[num]->conf[j]); if(uifc.input(WIN_MID|WIN_SAV,0,0 ,"Conference Number on Hub" - ,str,5,K_NUMBER|K_EDIT) > 0) - cfg.qhub[num]->conf[j] = atoi(str); - } - else if(l==2) { + ,str,5,K_NUMBER)<1) + continue; strcpy(opt[0],"Strip out"); strcpy(opt[1],"Leave in"); strcpy(opt[2],"Expand to ANSI"); opt[3][0]=0; m=0; - uifc.helpbuf = qwk_ctrl_a_help; - m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0 - ,"Ctrl-A Codes",opt); - uifc.changes=1; + uifc.helpbuf=qwk_ctrl_a_help; + if((m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0 + ,"Ctrl-A Codes",opt))==-1) + continue; + if(!new_qhub_sub(cfg.qhub[num], j, cfg.sub[l], atoi(str))) + continue; if(!m) cfg.qhub[num]->mode[j]=QHUB_STRIP; else if(m==1) cfg.qhub[num]->mode[j]=QHUB_RETCTLA; - else if(m==2) - cfg.qhub[num]->mode[j]=QHUB_EXPCTLA; + else + cfg.qhub[num]->mode[j]=QHUB_EXPCTLA; + uifc.changes=1; + continue; + } + if((j&MSK_ON)==MSK_DEL) { + j&=MSK_OFF; + cfg.qhub[num]->subs--; + while(j<cfg.qhub[num]->subs) { + cfg.qhub[num]->sub[j]=cfg.qhub[num]->sub[j+1]; + cfg.qhub[num]->mode[j]=cfg.qhub[num]->mode[j+1]; + cfg.qhub[num]->conf[j]=cfg.qhub[num]->conf[j+1]; + j++; + } + uifc.changes=1; + continue; + } + l=0; + while(1) { + n=0; + sprintf(opt[n++],"%-22.22s%.*s %.*s" + ,"Sub-board" + ,LEN_GSNAME + ,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname + ,LEN_SSNAME + ,cfg.qhub[num]->sub[j]->sname); + sprintf(opt[n++],"%-22.22s%u" + ,"Conference Number",cfg.qhub[num]->conf[j]); + sprintf(opt[n++],"%-22.22s%s" + ,"Ctrl-A Codes",cfg.qhub[num]->mode[j]==QHUB_STRIP ? + "Strip out" : cfg.qhub[num]->mode[j]==QHUB_RETCTLA ? + "Leave in" : "Expand to ANSI"); + opt[n][0]=0; + uifc.helpbuf= + "`QWK Networked Sub-board:`\n" + "\n" + "You are configuring the options for this sub-board for this QWK network\n" + "hub.\n" + ; + l=uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0, + 22+LEN_GSNAME+LEN_SSNAME,&l,0 + ,"Networked Sub-board",opt); + if(l==-1) + break; + if(!l) { + m=getsub(); + if(m!=-1) { + cfg.qhub[num]->sub[j]=cfg.sub[m]; + uifc.changes=1; + } + } + else if(l==1) { + uifc.helpbuf=qwk_conf_num_help; + sprintf(str, "%u", cfg.qhub[num]->conf[j]); + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Conference Number on Hub" + ,str,5,K_NUMBER|K_EDIT) > 0) + cfg.qhub[num]->conf[j] = atoi(str); + } + else if(l==2) { + strcpy(opt[0],"Strip out"); + strcpy(opt[1],"Leave in"); + strcpy(opt[2],"Expand to ANSI"); + opt[3][0]=0; + m=0; + uifc.helpbuf = qwk_ctrl_a_help; + m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0 + ,"Ctrl-A Codes",opt); + uifc.changes=1; + if(!m) + cfg.qhub[num]->mode[j]=QHUB_STRIP; + else if(m==1) + cfg.qhub[num]->mode[j]=QHUB_RETCTLA; + else if(m==2) + cfg.qhub[num]->mode[j]=QHUB_EXPCTLA; } } } @@ -1388,140 +1388,140 @@ void phub_edit(int num) char *p,done=0,str[256]; int i,j; -while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Hub Site Name",cfg.phub[num]->name); - sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.phub[num]->call); - sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.phub[num]->node); - sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.phub[num]->days)); - if(cfg.phub[num]->freq) { - sprintf(str,"%u times a day",1440/cfg.phub[num]->freq); - sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); - } - else { - sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60 - ,cfg.phub[num]->time%60); - sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); - } - opt[i][0]=0; - sprintf(str,"%s Network Hub",cfg.phub[num]->name); - uifc.helpbuf= - "`PostLink Network Hub Configuration:`\n" - "\n" - "This menu allows you to configure options specific to this network hub.\n" - ; - switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&phub_dflt,0 - ,str,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf= - "`Network Hub Site Name:`\n" - "\n" - "This is the Site Name of this hub. It is used for only for reference.\n" - ; - strcpy(str,cfg.phub[num]->name); /* save */ - if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Hub Site Name" - ,cfg.phub[num]->name,sizeof(cfg.phub[num]->name)-1,K_UPPER|K_EDIT)) - strcpy(cfg.phub[num]->name,str); /* restore */ - break; - case 1: - uifc.helpbuf= - "`Network Hub Call-out Command Line:`\n" - "\n" - "This is the command line to use to initiate a call-out to this network\n" - "hub.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Call-out Command" - ,cfg.phub[num]->call,sizeof(cfg.phub[num]->call)-1,K_EDIT); - break; - case 2: - sprintf(str,"%u",cfg.phub[num]->node); - uifc.helpbuf= - "`Node to Perform Call-out:`\n" - "\n" - "This is the number of the node to perform the call-out for this network\n" - "hub.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); - cfg.phub[num]->node=atoi(str); - break; - case 3: - j=0; - while(1) { - for(i=0;i<7;i++) - sprintf(opt[i],"%s %s" - ,wday[i],(cfg.phub[num]->days&(1<<i)) ? "Yes":"No"); - opt[i][0]=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%s","Hub Site Name",cfg.phub[num]->name); + sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.phub[num]->call); + sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.phub[num]->node); + sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.phub[num]->days)); + if(cfg.phub[num]->freq) { + sprintf(str,"%u times a day",1440/cfg.phub[num]->freq); + sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); + } + else { + sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60 + ,cfg.phub[num]->time%60); + sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); + } + opt[i][0]=0; + sprintf(str,"%s Network Hub",cfg.phub[num]->name); + uifc.helpbuf= + "`PostLink Network Hub Configuration:`\n" + "\n" + "This menu allows you to configure options specific to this network hub.\n" + ; + switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&phub_dflt,0 + ,str,opt)) { + case -1: + done=1; + break; + case 0: uifc.helpbuf= - "`Days to Perform Call-out:`\n" + "`Network Hub Site Name:`\n" "\n" - "These are the days that a call-out will be performed for this network\n" + "This is the Site Name of this hub. It is used for only for reference.\n" + ; + strcpy(str,cfg.phub[num]->name); /* save */ + if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Hub Site Name" + ,cfg.phub[num]->name,sizeof(cfg.phub[num]->name)-1,K_UPPER|K_EDIT)) + strcpy(cfg.phub[num]->name,str); /* restore */ + break; + case 1: + uifc.helpbuf= + "`Network Hub Call-out Command Line:`\n" + "\n" + "This is the command line to use to initiate a call-out to this network\n" "hub.\n" ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Days to Perform Call-out",opt); - if(i==-1) - break; - cfg.phub[num]->days^=(1<<i); - uifc.changes=1; - } - break; - case 4: - i=1; - uifc.helpbuf= - "`Perform Call-out at a Specific Time:`\n" - "\n" - "If you want the system call this network hub at a specific time, set\n" - "this option to `Yes`. If you want the system to call this hub more than\n" - "once a day at predetermined intervals, set this option to `No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Perform Call-out at a Specific Time",uifcYesNoOpts); - if(i==0) { - sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60 - ,cfg.phub[num]->time%60); + uifc.input(WIN_MID|WIN_SAV,0,0,"Call-out Command" + ,cfg.phub[num]->call,sizeof(cfg.phub[num]->call)-1,K_EDIT); + break; + case 2: + sprintf(str,"%u",cfg.phub[num]->node); uifc.helpbuf= - "`Time to Perform Call-out:`\n" + "`Node to Perform Call-out:`\n" "\n" - "This is the time (in 24 hour HH:MM format) to perform the call-out to\n" - "this network hub.\n" + "This is the number of the node to perform the call-out for this network\n" + "hub.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Time to Perform Call-out (HH:MM)" - ,str,5,K_UPPER|K_EDIT)>0) { - cfg.phub[num]->freq=0; - cfg.phub[num]->time=atoi(str)*60; - if((p=strchr(str,':'))!=NULL) - cfg.phub[num]->time+=atoi(p+1); - } - } - else if(i==1) { - sprintf(str,"%u",cfg.phub[num]->freq - && cfg.phub[num]->freq<=1440 ? 1440/cfg.phub[num]->freq : 0); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); + cfg.phub[num]->node=atoi(str); + break; + case 3: + j=0; + while(1) { + for(i=0;i<7;i++) + sprintf(opt[i],"%s %s" + ,wday[i],(cfg.phub[num]->days&(1<<i)) ? "Yes":"No"); + opt[i][0]=0; + uifc.helpbuf= + "`Days to Perform Call-out:`\n" + "\n" + "These are the days that a call-out will be performed for this network\n" + "hub.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0 + ,"Days to Perform Call-out",opt); + if(i==-1) + break; + cfg.phub[num]->days^=(1<<i); + uifc.changes=1; + } + break; + case 4: + i=1; uifc.helpbuf= - "`Number of Call-outs Per Day:`\n" + "`Perform Call-out at a Specific Time:`\n" "\n" - "This is the maximum number of times the system will perform a call-out\n" - "per day to this network hub. This value is actually converted by\n" - "Synchronet into minutes between call-outs and when the BBS is idle\n" - "and this number of minutes since the last call-out is reached, it will\n" - "perform a call-out.\n" + "If you want the system call this network hub at a specific time, set\n" + "this option to `Yes`. If you want the system to call this hub more than\n" + "once a day at predetermined intervals, set this option to `No`.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Number of Call-outs Per Day" - ,str,4,K_NUMBER|K_EDIT)>0) { - cfg.phub[num]->time=0; - i=atoi(str); - if(i && i<=1440) - cfg.phub[num]->freq=1440/i; - else - cfg.phub[num]->freq=0; - } - } - break; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Perform Call-out at a Specific Time",uifcYesNoOpts); + if(i==0) { + sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60 + ,cfg.phub[num]->time%60); + uifc.helpbuf= + "`Time to Perform Call-out:`\n" + "\n" + "This is the time (in 24 hour HH:MM format) to perform the call-out to\n" + "this network hub.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Time to Perform Call-out (HH:MM)" + ,str,5,K_UPPER|K_EDIT)>0) { + cfg.phub[num]->freq=0; + cfg.phub[num]->time=atoi(str)*60; + if((p=strchr(str,':'))!=NULL) + cfg.phub[num]->time+=atoi(p+1); + } + } + else if(i==1) { + sprintf(str,"%u",cfg.phub[num]->freq + && cfg.phub[num]->freq<=1440 ? 1440/cfg.phub[num]->freq : 0); + uifc.helpbuf= + "`Number of Call-outs Per Day:`\n" + "\n" + "This is the maximum number of times the system will perform a call-out\n" + "per day to this network hub. This value is actually converted by\n" + "Synchronet into minutes between call-outs and when the BBS is idle\n" + "and this number of minutes since the last call-out is reached, it will\n" + "perform a call-out.\n" + ; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Number of Call-outs Per Day" + ,str,4,K_NUMBER|K_EDIT)>0) { + cfg.phub[num]->time=0; + i=atoi(str); + if(i && i<=1440) + cfg.phub[num]->freq=1440/i; + else + cfg.phub[num]->freq=0; + } + } + break; } } } diff --git a/src/sbbs3/scfg/scfgsub.c b/src/sbbs3/scfg/scfgsub.c index 7ebf6ed576aaec27083f911754ed99a0b6177c38..9ef25b44645e1e651c92e6cd5ba4f726213ea0a8 100644 --- a/src/sbbs3/scfg/scfgsub.c +++ b/src/sbbs3/scfg/scfgsub.c @@ -147,1297 +147,1297 @@ void sub_cfg(uint grpnum) "these values with caution." ; -while(1) { - if(uifc.changes && cfg.grp[grpnum]->sort) - sort_subs(grpnum); - int maxlen = 0; - for(i=0,j=0;i<cfg.total_subs && j<MAX_OPTS;i++) - if(cfg.sub[i]->grp==grpnum) { - subnum[j]=i; - int len = 0; - opt[j][0] = 0; - if(cfg.sub[subnum[0]]->qwkconf) - len += sprintf(opt[j], "%-5u ", cfg.sub[i]->qwkconf); - char* name = cfg.sub[i]->lname; - int name_len = LEN_SLNAME; - switch(cfg.grp[grpnum]->sort) { - case AREA_SORT_SNAME: - name = cfg.sub[i]->sname; - name_len = LEN_SSNAME; - break; - case AREA_SORT_CODE: - name = cfg.sub[i]->code_suffix; - name_len = LEN_CODE; - break; - default: /* Defeat stupid GCC warning */ - break; + while(1) { + if(uifc.changes && cfg.grp[grpnum]->sort) + sort_subs(grpnum); + int maxlen = 0; + for(i=0,j=0;i<cfg.total_subs && j<MAX_OPTS;i++) + if(cfg.sub[i]->grp==grpnum) { + subnum[j]=i; + int len = 0; + opt[j][0] = 0; + if(cfg.sub[subnum[0]]->qwkconf) + len += sprintf(opt[j], "%-5u ", cfg.sub[i]->qwkconf); + char* name = cfg.sub[i]->lname; + int name_len = LEN_SLNAME; + switch(cfg.grp[grpnum]->sort) { + case AREA_SORT_SNAME: + name = cfg.sub[i]->sname; + name_len = LEN_SSNAME; + break; + case AREA_SORT_CODE: + name = cfg.sub[i]->code_suffix; + name_len = LEN_CODE; + break; + default: /* Defeat stupid GCC warning */ + break; + } + sprintf(str, "%-*s %c", name_len, name, cfg.sub[i]->misc&SUB_TEMPLATE ? '*' : ' '); + truncsp(str); + len += sprintf(opt[j] + strlen(opt[j]), "%s", str); + if(len > maxlen) + maxlen = len; + j++; } - sprintf(str, "%-*s %c", name_len, name, cfg.sub[i]->misc&SUB_TEMPLATE ? '*' : ' '); - truncsp(str); - len += sprintf(opt[j] + strlen(opt[j]), "%s", str); - if(len > maxlen) - maxlen = len; - j++; - } - subnum[j]=cfg.total_subs; - opt[j][0]=0; - sprintf(str,"%s Sub-boards (%u)",cfg.grp[grpnum]->sname, j); - int mode = WIN_SAV|WIN_ACT|WIN_RHT; - if(j) - mode |= WIN_DEL|WIN_COPY|WIN_CUT|WIN_DELACT; - if(j<MAX_OPTS) - mode |= WIN_INS|WIN_XTR|WIN_PASTEXTR|WIN_INSACT; - if(savsub.sname[0]) - mode |= WIN_PASTE; - uifc.helpbuf= - "`Message Sub-boards:`\n" - "\n" - "This is a list of message sub-boards that have been configured for the\n" - "selected message group.\n" - "\n" - "The `template` sub-board, if one exists, will be denoted with an asterisk.\n" - "Normally, only one template sub-board should exist per message group.\n" - "\n" - "To add a sub-board, select the desired position with the arrow keys and\n" - "hit ~ INS ~.\n" - "\n" - "To delete a sub-board, select it with the arrow keys and hit ~ DEL ~.\n" - "\n" - "To configure a sub-board, select it with the arrow keys and hit ~ ENTER ~.\n" - ; - i = uifc.list(mode, 0, 0, maxlen+5, &dflt, &bar, str, opt); - if((signed)i==-1) - return; - int msk = i & MSK_ON; - i &= MSK_OFF; - if((int)i > j) - continue; - if(msk==MSK_INS) { - strcpy(str,"General"); - uifc.helpbuf=sub_long_name_help; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME - ,K_EDIT)<1) - continue; - sprintf(str2,"%.*s",LEN_SSNAME,str); - uifc.helpbuf=sub_short_name_help; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME - ,K_EDIT)<1) - continue; -#if 0 - sprintf(str3,"%.10s",str2); + subnum[j]=cfg.total_subs; + opt[j][0]=0; + sprintf(str,"%s Sub-boards (%u)",cfg.grp[grpnum]->sname, j); + int mode = WIN_SAV|WIN_ACT|WIN_RHT; + if(j) + mode |= WIN_DEL|WIN_COPY|WIN_CUT|WIN_DELACT; + if(j<MAX_OPTS) + mode |= WIN_INS|WIN_XTR|WIN_PASTEXTR|WIN_INSACT; + if(savsub.sname[0]) + mode |= WIN_PASTE; uifc.helpbuf= - "`Sub-board QWK Name:`\n" + "`Message Sub-boards:`\n" "\n" - "This is the name of the sub-board used for QWK off-line readers.\n" + "This is a list of message sub-boards that have been configured for the\n" + "selected message group.\n" + "\n" + "The `template` sub-board, if one exists, will be denoted with an asterisk.\n" + "Normally, only one template sub-board should exist per message group.\n" + "\n" + "To add a sub-board, select the desired position with the arrow keys and\n" + "hit ~ INS ~.\n" + "\n" + "To delete a sub-board, select it with the arrow keys and hit ~ DEL ~.\n" + "\n" + "To configure a sub-board, select it with the arrow keys and hit ~ ENTER ~.\n" ; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10 - ,K_EDIT)<1) - continue; -#endif - SAFECOPY(code,str2); - prep_code(code,/* prefix: */NULL); - uifc.helpbuf=sub_code_help; - if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code Suffix",code,LEN_CODE - ,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - uifc.helpbuf=invalid_code; - uifc.msg("Invalid Code"); - uifc.helpbuf=0; - continue; - } - - if (!new_sub(subnum[i], grpnum)) + i = uifc.list(mode, 0, 0, maxlen+5, &dflt, &bar, str, opt); + if((signed)i==-1) + return; + int msk = i & MSK_ON; + i &= MSK_OFF; + if((int)i > j) continue; - - SAFECOPY(cfg.sub[subnum[i]]->code_suffix,code); - SAFECOPY(cfg.sub[subnum[i]]->lname,str); - SAFECOPY(cfg.sub[subnum[i]]->sname,str2); - SAFECOPY(cfg.sub[subnum[i]]->qwkname,code); - if(strchr(str,'.') && strchr(str,' ')==NULL) - SAFECOPY(cfg.sub[subnum[i]]->newsgroup,str); - uifc.changes = TRUE; - continue; - } - if(msk == MSK_DEL || msk == MSK_CUT) { - if (msk == MSK_DEL) { + if(msk==MSK_INS) { + strcpy(str,"General"); + uifc.helpbuf=sub_long_name_help; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME + ,K_EDIT)<1) + continue; + sprintf(str2,"%.*s",LEN_SSNAME,str); + uifc.helpbuf=sub_short_name_help; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME + ,K_EDIT)<1) + continue; + #if 0 + sprintf(str3,"%.10s",str2); uifc.helpbuf= - "`Delete Data in Sub-board:`\n" + "`Sub-board QWK Name:`\n" "\n" - "If you want to delete all the messages for this sub-board, select `Yes`.\n" + "This is the name of the sub-board used for QWK off-line readers.\n" ; - j=1; - SAFEPRINTF2(str,"%s%s.*" - ,cfg.grp[cfg.sub[subnum[i]]->grp]->code_prefix - ,cfg.sub[subnum[i]]->code_suffix); - strlwr(str); - if(!cfg.sub[subnum[i]]->data_dir[0]) - SAFEPRINTF(data_dir,"%ssubs/",cfg.data_dir); - else - SAFECOPY(data_dir,cfg.sub[subnum[i]]->data_dir); - - SAFEPRINTF2(path,"%s%s",data_dir,str); - if(fexist(path)) { - SAFEPRINTF(str2,"Delete %s",path); - j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,str2,uifcYesNoOpts); - if(j==-1) - continue; - if(j==0) { - delfiles(data_dir,str); - clearptrs(subnum[i]); - } + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10 + ,K_EDIT)<1) + continue; + #endif + SAFECOPY(code,str2); + prep_code(code,/* prefix: */NULL); + uifc.helpbuf=sub_code_help; + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code Suffix",code,LEN_CODE + ,K_EDIT|K_UPPER)<1) + continue; + if(!code_ok(code)) { + uifc.helpbuf=invalid_code; + uifc.msg("Invalid Code"); + uifc.helpbuf=0; + continue; } - } - if(msk == MSK_CUT) - savsub = *cfg.sub[subnum[i]]; - free(cfg.sub[subnum[i]]); - cfg.total_subs--; - for(j=subnum[i];j<cfg.total_subs;j++) - cfg.sub[j]=cfg.sub[j+1]; - for(q=0;q<cfg.total_qhubs;q++) - for(s=0;s<cfg.qhub[q]->subs;s++) { - if(cfg.qhub[q]->sub[s] == cfg.sub[subnum[i]]) - cfg.qhub[q]->sub[s] = NULL; - } - uifc.changes = TRUE; - continue; - } - if(msk==MSK_COPY) { - savsub=*cfg.sub[subnum[i]]; - continue; - } - if(msk == MSK_PASTE) { - if (!new_sub(subnum[i], grpnum)) - continue; - ptridx=cfg.sub[subnum[i]]->ptridx; - *cfg.sub[subnum[i]]=savsub; - cfg.sub[subnum[i]]->ptridx=ptridx; - cfg.sub[subnum[i]]->grp=grpnum; - uifc.changes = TRUE; - continue; - } -#if 0 - if(msk == MSK_SORT) { - sort_min = subnum[i]; - sort_group = grpnum; - qsort(cfg.sub, cfg.total_subs, sizeof(sub_t*), sub_compare); - last_sort_field = sort_field; - sort_field++; - if(sort_field >= SORT_NONE) - sort_field = 0; - uifc.changes = TRUE; - continue; - } -#endif - i=subnum[i]; - j=0; - done=0; - while(!done) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Long Name",cfg.sub[i]->lname); - sprintf(opt[n++],"%-27.27s%s","Short Name",cfg.sub[i]->sname); - sprintf(opt[n++],"%-27.27s%s","QWK Name",cfg.sub[i]->qwkname); - sprintf(opt[n++],"%-27.27s%s%s","Internal Code" - ,cfg.grp[cfg.sub[i]->grp]->code_prefix, cfg.sub[i]->code_suffix); - sprintf(opt[n++],"%-27.27s%s","Newsgroup Name",cfg.sub[i]->newsgroup); - sprintf(opt[n++],"%-27.27s%.40s","Access Requirements" - ,cfg.sub[i]->arstr); - sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements" - ,cfg.sub[i]->read_arstr); - sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements" - ,cfg.sub[i]->post_arstr); - sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements" - ,cfg.sub[i]->op_arstr); - sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User" - ,cfg.sub[i]->mod_arstr); - if(cfg.sub[i]->maxmsgs) - sprintf(str, "%"PRIu32, cfg.sub[i]->maxmsgs); - else - strcpy(str, "Unlimited"); - sprintf(opt[n++],"%-27.27s%s","Maximum Messages", str); - if(cfg.sub[i]->maxage) - sprintf(str,"Enabled (%u days old)",cfg.sub[i]->maxage); - else - strcpy(str,"Disabled"); - sprintf(opt[n++],"%-27.27s%s","Purge by Age",str); - if(cfg.sub[i]->maxcrcs) - sprintf(str,"Enabled (%"PRIu32" message CRCs)",cfg.sub[i]->maxcrcs); - else - strcpy(str,"Disabled"); - sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str); - strcpy(opt[n++],"Toggle Options..."); - strcpy(opt[n++],"Network Options..."); - strcpy(opt[n++],"Advanced Options..."); - opt[n][0]=0; - sprintf(str,"%s Sub-board", cfg.sub[i]->sname); - uifc.helpbuf= - "`Sub-board Configuration:`\n" - "\n" - "This menu allows you to configure the individual selected sub-board.\n" - "Options with a trailing `...` provide a sub-menu of more options.\n" - ; - switch(uifc.list(WIN_ACT|WIN_SAV|WIN_BOT|WIN_L2R - ,0,0,60,&opt_dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - uifc.helpbuf=sub_long_name_help; - SAFECOPY(str,cfg.sub[i]->lname); /* save */ - if(uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings" - ,cfg.sub[i]->lname,LEN_SLNAME,K_EDIT) == 0) - SAFECOPY(cfg.sub[i]->lname,str); /* restore */ - break; - case 1: - uifc.helpbuf=sub_short_name_help; - uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts" - ,cfg.sub[i]->sname,LEN_SSNAME,K_EDIT); - break; - case 2: + if (!new_sub(subnum[i], grpnum)) + continue; + + SAFECOPY(cfg.sub[subnum[i]]->code_suffix,code); + SAFECOPY(cfg.sub[subnum[i]]->lname,str); + SAFECOPY(cfg.sub[subnum[i]]->sname,str2); + SAFECOPY(cfg.sub[subnum[i]]->qwkname,code); + if(strchr(str,'.') && strchr(str,' ')==NULL) + SAFECOPY(cfg.sub[subnum[i]]->newsgroup,str); + uifc.changes = TRUE; + continue; + } + if(msk == MSK_DEL || msk == MSK_CUT) { + if (msk == MSK_DEL) { uifc.helpbuf= - "`Sub-board QWK Name:`\n" + "`Delete Data in Sub-board:`\n" "\n" - "This is the name of the sub-board used for QWK off-line readers.\n" + "If you want to delete all the messages for this sub-board, select `Yes`.\n" ; - uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets" - ,cfg.sub[i]->qwkname,10,K_EDIT); - break; - case 3: - uifc.helpbuf=sub_code_help; - SAFECOPY(str,cfg.sub[i]->code_suffix); - uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Suffix (unique)" - ,str,LEN_CODE,K_EDIT|K_UPPER); - if(code_ok(str)) - SAFECOPY(cfg.sub[i]->code_suffix,str); - else { - uifc.helpbuf=invalid_code; - uifc.msg("Invalid Code"); - uifc.helpbuf=0; + j=1; + SAFEPRINTF2(str,"%s%s.*" + ,cfg.grp[cfg.sub[subnum[i]]->grp]->code_prefix + ,cfg.sub[subnum[i]]->code_suffix); + strlwr(str); + if(!cfg.sub[subnum[i]]->data_dir[0]) + SAFEPRINTF(data_dir,"%ssubs/",cfg.data_dir); + else + SAFECOPY(data_dir,cfg.sub[subnum[i]]->data_dir); + + SAFEPRINTF2(path,"%s%s",data_dir,str); + if(fexist(path)) { + SAFEPRINTF(str2,"Delete %s",path); + j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0 + ,str2,uifcYesNoOpts); + if(j==-1) + continue; + if(j==0) { + delfiles(data_dir,str); + clearptrs(subnum[i]); + } } - break; - case 4: - uifc.helpbuf= - "Newsgroup Name:\n" - "\n" - "This is the name of the sub-board used for newsgroup readers. If no name\n" - "is configured here, a name will be automatically generated from the\n" - "Sub-board's Short Name and message group's Short Name.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,17,"" - ,cfg.sub[i]->newsgroup,sizeof(cfg.sub[i]->newsgroup)-1,K_EDIT); - break; - case 5: - sprintf(str,"%s Access",cfg.sub[i]->sname); - getar(str,cfg.sub[i]->arstr); - break; - case 6: - sprintf(str,"%s Reading",cfg.sub[i]->sname); - getar(str,cfg.sub[i]->read_arstr); - break; - case 7: - sprintf(str,"%s Posting",cfg.sub[i]->sname); - getar(str,cfg.sub[i]->post_arstr); - break; - case 8: - sprintf(str,"%s Operator",cfg.sub[i]->sname); - getar(str,cfg.sub[i]->op_arstr); - break; - case 9: - sprintf(str,"%s Moderated Posting User",cfg.sub[i]->sname); - getar(str,cfg.sub[i]->mod_arstr); - break; - case 10: - sprintf(str,"%"PRIu32,cfg.sub[i]->maxmsgs); - uifc.helpbuf= - "`Maximum Number of Messages:`\n" - "\n" - "This value is the maximum number of messages that will be kept in the\n" - "sub-board. It is possible for newly-posted or imported messages to\n" - "exceed this maximum (it is `not` an immediately imposed limit).\n" - "\n" - "Older messages that exceed this maximum count are purged using `smbutil`,\n" - "typically run as a timed event (e.g. `MSGMAINT`).\n" - "\n" - "A value of `0` means no maximum number of stored messages will be\n" - "imposed during message-base maintenance." - ; - uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages" - ,str,9,K_EDIT|K_NUMBER); - cfg.sub[i]->maxmsgs=atoi(str); - cfg.sub[i]->misc|=SUB_HDRMOD; - break; - case 11: - sprintf(str,"%u",cfg.sub[i]->maxage); - uifc.helpbuf= - "`Maximum Age of Messages:`\n" - "\n" - "This value is the maximum number of days that messages will be kept in\n" - "the sub-board.\n" - "\n" - "Message age is calculated from the date and time of message import/post\n" - "and not necessarily the date/time the message was originally written.\n" - "\n" - "Old messages are purged using `smbutil`, typically run as a timed\n" - "event (e.g. `MSGMAINT`).\n" - "\n" - "A value of `0` means no maximum age of stored messages will be\n" - "imposed during message-base maintenance." - ; - uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)" - ,str,5,K_EDIT|K_NUMBER); - cfg.sub[i]->maxage=atoi(str); - cfg.sub[i]->misc|=SUB_HDRMOD; - break; - case 12: - sprintf(str,"%"PRIu32,cfg.sub[i]->maxcrcs); - uifc.helpbuf= - "`Maximum Number of CRCs:`\n" - "\n" - "This value is the maximum number of CRCs that will be kept in the\n" - "sub-board for duplicate message checking. Once this maximum number of\n" - "CRCs is reached, the oldest CRCs will be automatically purged.\n" - "\n" - "A value of `0` means no CRCs (or other hashes) of message body text\n" - "or meta-data will be saved (i.e. for purposes of duplicate message\n" - "detection and rejection)." - ; - uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs" - ,str,9,K_EDIT|K_NUMBER); - cfg.sub[i]->maxcrcs=atol(str); - cfg.sub[i]->misc|=SUB_HDRMOD; - break; - case 13: - while(1) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Allow Private Posts" - ,cfg.sub[i]->misc&SUB_PRIV ? cfg.sub[i]->misc&SUB_PONLY - ? "Only":"Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts" - ,cfg.sub[i]->misc&SUB_ANON ? cfg.sub[i]->misc&SUB_AONLY - ? "Only":"Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Post Using Real Names" - ,cfg.sub[i]->misc&SUB_NAME ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Users Can Edit Posts" - ,cfg.sub[i]->misc&SUB_EDIT ? cfg.sub[i]->misc&SUB_EDITLAST - ? "Last" : "Yes" : "No"); - sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts" - ,cfg.sub[i]->misc&SUB_DEL ? cfg.sub[i]->misc&SUB_DELLAST - ? "Last" : "Yes" : "No"); - sprintf(opt[n++],"%-27.27s%s","Default On for New Scan" - ,cfg.sub[i]->misc&SUB_NSDEF ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan" - ,cfg.sub[i]->misc&SUB_FORCED ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan" - ,cfg.sub[i]->misc&SUB_SSDEF ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Public 'To' User" - ,cfg.sub[i]->misc&SUB_TOUSER ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Allow Message Voting" - ,cfg.sub[i]->misc&SUB_NOVOTING ? "No":"Yes"); - sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting" - ,cfg.sub[i]->misc&SUB_QUOTE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Suppress User Signatures" - ,cfg.sub[i]->misc&SUB_NOUSERSIG ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs" - ,cfg.sub[i]->misc&SUB_SYSPERM ? "Yes":"No"); -#if 0 /* this is not actually implemented (yet?) */ - sprintf(opt[n++],"%-27.27s%s","Kill Read Messages" - ,cfg.sub[i]->misc&SUB_KILL ? "Yes" - : (cfg.sub[i]->misc&SUB_KILLP ? "Pvt" : "No")); -#endif - sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)" - ,cfg.sub[i]->misc&SUB_LZH ? "Yes" : "No"); - sprintf(opt[n++],"%-27.27s%s","Template for New Subs" - ,cfg.sub[i]->misc&SUB_TEMPLATE ? "Yes" : "No"); + } + if(msk == MSK_CUT) + savsub = *cfg.sub[subnum[i]]; + free(cfg.sub[subnum[i]]); + cfg.total_subs--; + for(j=subnum[i];j<cfg.total_subs;j++) + cfg.sub[j]=cfg.sub[j+1]; + for(q=0;q<cfg.total_qhubs;q++) + for(s=0;s<cfg.qhub[q]->subs;s++) { + if(cfg.qhub[q]->sub[s] == cfg.sub[subnum[i]]) + cfg.qhub[q]->sub[s] = NULL; + } + uifc.changes = TRUE; + continue; + } + if(msk==MSK_COPY) { + savsub=*cfg.sub[subnum[i]]; + continue; + } + if(msk == MSK_PASTE) { + if (!new_sub(subnum[i], grpnum)) + continue; + ptridx=cfg.sub[subnum[i]]->ptridx; + *cfg.sub[subnum[i]]=savsub; + cfg.sub[subnum[i]]->ptridx=ptridx; + cfg.sub[subnum[i]]->grp=grpnum; + uifc.changes = TRUE; + continue; + } + #if 0 + if(msk == MSK_SORT) { + sort_min = subnum[i]; + sort_group = grpnum; + qsort(cfg.sub, cfg.total_subs, sizeof(sub_t*), sub_compare); + last_sort_field = sort_field; + sort_field++; + if(sort_field >= SORT_NONE) + sort_field = 0; + uifc.changes = TRUE; + continue; + } + #endif + i=subnum[i]; + j=0; + done=0; + while(!done) { + n=0; + sprintf(opt[n++],"%-27.27s%s","Long Name",cfg.sub[i]->lname); + sprintf(opt[n++],"%-27.27s%s","Short Name",cfg.sub[i]->sname); + sprintf(opt[n++],"%-27.27s%s","QWK Name",cfg.sub[i]->qwkname); + sprintf(opt[n++],"%-27.27s%s%s","Internal Code" + ,cfg.grp[cfg.sub[i]->grp]->code_prefix, cfg.sub[i]->code_suffix); + sprintf(opt[n++],"%-27.27s%s","Newsgroup Name",cfg.sub[i]->newsgroup); + sprintf(opt[n++],"%-27.27s%.40s","Access Requirements" + ,cfg.sub[i]->arstr); + sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements" + ,cfg.sub[i]->read_arstr); + sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements" + ,cfg.sub[i]->post_arstr); + sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements" + ,cfg.sub[i]->op_arstr); + sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User" + ,cfg.sub[i]->mod_arstr); + if(cfg.sub[i]->maxmsgs) + sprintf(str, "%"PRIu32, cfg.sub[i]->maxmsgs); + else + strcpy(str, "Unlimited"); + sprintf(opt[n++],"%-27.27s%s","Maximum Messages", str); + if(cfg.sub[i]->maxage) + sprintf(str,"Enabled (%u days old)",cfg.sub[i]->maxage); + else + strcpy(str,"Disabled"); + sprintf(opt[n++],"%-27.27s%s","Purge by Age",str); + if(cfg.sub[i]->maxcrcs) + sprintf(str,"Enabled (%"PRIu32" message CRCs)",cfg.sub[i]->maxcrcs); + else + strcpy(str,"Disabled"); + sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str); - opt[n][0]=0; + strcpy(opt[n++],"Toggle Options..."); + strcpy(opt[n++],"Network Options..."); + strcpy(opt[n++],"Advanced Options..."); + opt[n][0]=0; + sprintf(str,"%s Sub-board", cfg.sub[i]->sname); + uifc.helpbuf= + "`Sub-board Configuration:`\n" + "\n" + "This menu allows you to configure the individual selected sub-board.\n" + "Options with a trailing `...` provide a sub-menu of more options.\n" + ; + switch(uifc.list(WIN_ACT|WIN_SAV|WIN_BOT|WIN_L2R + ,0,0,60,&opt_dflt,0,str,opt)) { + case -1: + done=1; + break; + case 0: + uifc.helpbuf=sub_long_name_help; + SAFECOPY(str,cfg.sub[i]->lname); /* save */ + if(uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings" + ,cfg.sub[i]->lname,LEN_SLNAME,K_EDIT) == 0) + SAFECOPY(cfg.sub[i]->lname,str); /* restore */ + break; + case 1: + uifc.helpbuf=sub_short_name_help; + uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts" + ,cfg.sub[i]->sname,LEN_SSNAME,K_EDIT); + break; + case 2: uifc.helpbuf= - "`Sub-board Toggle Options:`\n" + "`Sub-board QWK Name:`\n" "\n" - "This menu allows you to toggle certain options for the selected\n" - "sub-board between two or more settings, such as `Yes` and `No`.\n" + "This is the name of the sub-board used for QWK off-line readers.\n" ; - n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0 - ,"Toggle Options",opt); - if(n==-1) - break; - switch(n) { - case 0: - if(cfg.sub[i]->misc&SUB_PONLY) - n=2; - else - n=(cfg.sub[i]->misc&SUB_PRIV) ? 0:1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Only"); - opt[3][0]=0; - uifc.helpbuf= - "`Allow Private Posts on Sub-board:`\n" - "\n" - "If you want users to be able to post private messages to other users\n" - "on this sub-board, set this value to `Yes`. Usually, E-mail is the\n" - "preferred method of private communication. If you want users to be able\n" - "to post private messages only on this sub-board, select `Only`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Private Posts",opt); - if(n==-1) - break; - if(!n && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY)) - !=SUB_PRIV) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_PONLY; - cfg.sub[i]->misc|=SUB_PRIV; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_PRIV) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_PRIV; - break; - } - if(n==2 && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY)) - !=(SUB_PRIV|SUB_PONLY)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=(SUB_PRIV|SUB_PONLY); - } - break; - case 1: - if(cfg.sub[i]->misc&SUB_AONLY) - n=2; - else - n=(cfg.sub[i]->misc&SUB_ANON) ? 0:1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Only"); - opt[3][0]=0; - uifc.helpbuf= - "`Allow Anonymous Posts on Sub-board:`\n" - "\n" - "If you want users with the `A` exemption to be able to post anonymously on\n" - "this sub-board, select `Yes`. If you want all posts on this sub-board to be\n" - "forced anonymous, select `Only`. If you do not want anonymous posts allowed\n" - "on this sub-board at all, select `No`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Anonymous Posts",opt); - if(n==-1) - break; - if(!n && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) - !=SUB_ANON) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_AONLY; - cfg.sub[i]->misc|=SUB_ANON; - break; - } - if(n==1 && cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~(SUB_ANON|SUB_AONLY); - break; - } - if(n==2 && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) - !=(SUB_ANON|SUB_AONLY)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=(SUB_ANON|SUB_AONLY); - } - break; - case 2: - n=(cfg.sub[i]->misc&SUB_NAME) ? 0:1; - uifc.helpbuf= - "`User Real Names in Posts on Sub-board:`\n" - "\n" - "If you allow aliases on your system, you can have messages on this\n" - "sub-board automatically use the real name of the posting user by setting\n" - "this option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Use Real Names in Posts",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_NAME)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_NAME; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_NAME) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_NAME; - } - break; - case 3: - if(cfg.sub[i]->misc&SUB_EDITLAST) - n=2; - else - n=(cfg.sub[i]->misc&SUB_EDIT) ? 0:1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Last Post Only"); - opt[3][0]=0; - uifc.helpbuf= - "`Users Can Edit Posts on Sub-board:`\n" - "\n" - "If you wish to allow users to edit their messages after they have been\n" - "posted, this option to `Yes`. If you wish to allow users to edit only the\n" - "last message on a message base, set this option to `Last Post Only`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Users Can Edit Messages",opt); - if(n==-1) - break; - if(n==0 /* yes */ - && (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)) - !=SUB_EDIT - ) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_EDIT; - cfg.sub[i]->misc&=~SUB_EDITLAST; - break; - } - if(n==1 /* no */ - && cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST) - ) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~(SUB_EDIT|SUB_EDITLAST); - break; - } - if(n==2 /* last only */ - && (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)) - !=(SUB_EDIT|SUB_EDITLAST) - ) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=(SUB_EDIT|SUB_EDITLAST); - break; - } - break; - case 4: - if(cfg.sub[i]->misc&SUB_DELLAST) - n=2; - else - n=(cfg.sub[i]->misc&SUB_DEL) ? 0:1; - - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Last Post Only"); - opt[3][0]=0; - uifc.helpbuf= - "`Users Can Delete Posts on Sub-board:`\n" - "\n" - "If you want users to be able to delete any of their own posts on this\n" - "sub-board, set this option to `Yes`. If you want to allow users the\n" - "ability to delete their message only if it is the last message on the\n" - "sub-board, select `Last Post Only`. If you want to disallow users from\n" - "deleting any of their posts, set this option to `No`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Users Can Delete Posts",opt); - if(n==-1) - break; - if(!n && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST)) - !=SUB_DEL) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_DELLAST; - cfg.sub[i]->misc|=SUB_DEL; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_DEL) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_DEL; - break; - } - if(n==2 && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST)) - !=(SUB_DEL|SUB_DELLAST)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=(SUB_DEL|SUB_DELLAST); - } - break; - case 5: - n=(cfg.sub[i]->misc&SUB_NSDEF) ? 0:1; - uifc.helpbuf= - "`Default On for New Scan:`\n" - "\n" - "If you want this sub-board to be included in all user new message scans\n" - "by default, set this option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Default On for New Scan",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_NSDEF)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_NSDEF; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_NSDEF) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_NSDEF; - } - break; - case 6: - n=(cfg.sub[i]->misc&SUB_FORCED) ? 0:1; - uifc.helpbuf= - "`Forced On for New Scan:`\n" - "\n" - "If you want this sub-board to be included in all user new message scans\n" - "even if the user has removed it from their new scan configuration, set\n" - "this option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Forced New Scan",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_FORCED)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_FORCED; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_FORCED) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_FORCED; - } - break; - case 7: - n=(cfg.sub[i]->misc&SUB_SSDEF) ? 0:1; - uifc.helpbuf= - "`Default On for Your Scan:`\n" - "\n" - "If you want this sub-board to be included in all user personal message\n" - "scans by default, set this option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Default On for Your Scan",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_SSDEF)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_SSDEF; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_SSDEF) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_SSDEF; - } - break; - case 8: - n=(cfg.sub[i]->misc&SUB_TOUSER) ? 0:1; - uifc.helpbuf= - "`Prompt for 'To' User on Public Posts:`\n" - "\n" - "If you want all posts on this sub-board to be prompted for a 'To' user,\n" - "set this option to `Yes`. This is a useful option for sub-boards that\n" - "are on a network that does not allow private posts.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Prompt for 'To' User on Public Posts",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_TOUSER)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_TOUSER; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_TOUSER) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_TOUSER; - } - break; - case 9: - n=(cfg.sub[i]->misc&SUB_NOVOTING) ? 1:0; - uifc.helpbuf= - "`Allow Message Voting:`\n" - "\n" - "If you want users to be allowed to Up-Vote or Down-Vote messages on this\n" - "sub-board, set this option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Message Voting",uifcYesNoOpts); - if(n==-1) - break; - if(!n && (cfg.sub[i]->misc&SUB_NOVOTING)) { - uifc.changes = TRUE; - cfg.sub[i]->misc ^= SUB_NOVOTING; - break; - } - if(n==1 && !(cfg.sub[i]->misc&SUB_NOVOTING)) { - uifc.changes = TRUE; - cfg.sub[i]->misc ^= SUB_NOVOTING; - } - break; - case 10: - n=(cfg.sub[i]->misc&SUB_QUOTE) ? 0:1; - uifc.helpbuf= - "`Allow Message Quoting:`\n" - "\n" - "If you want users to be allowed to quote messages on this sub-board, set\n" - "this option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Message Quoting",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_QUOTE)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_QUOTE; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_QUOTE) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_QUOTE; - } - break; - case 11: - n=(cfg.sub[i]->misc&SUB_NOUSERSIG) ? 0:1; - uifc.helpbuf= - "Suppress User Signatures:\n" - "\n" - "If you do not wish to have user signatures automatically appended to\n" - "messages posted in this sub-board, set this option to Yes.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Suppress User Signatures",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_NOUSERSIG)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_NOUSERSIG; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_NOUSERSIG) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_NOUSERSIG; - } - break; - case 12: - n=(cfg.sub[i]->misc&SUB_SYSPERM) ? 0:1; - uifc.helpbuf= - "`Operator Messages Automatically Permanent:`\n" - "\n" - "If you want messages posted by `System` and `Sub-board Operators` to be\n" - "automatically permanent (non-purgeable) for this sub-board, set this\n" - "option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Permanent Operator Messages",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_SYSPERM)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_SYSPERM; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_SYSPERM) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_SYSPERM; - } - break; -#if 0 /* This is not actually implemented (yet?) */ - case 12: - if(cfg.sub[i]->misc&SUB_KILLP) - n=2; - else - n=(cfg.sub[i]->misc&SUB_KILL) ? 0:1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Private"); - opt[3][0]=0; - uifc.helpbuf= - "`Kill Read Messages Automatically:`\n" - "\n" - "If you want messages that have been read by the intended recipient to\n" - "be automatically deleted by `SMBUTIL`, set this option to `Yes` or\n" - "`Private` if you want only private messages to be automatically deleted.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Kill Read Messages",opt); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_KILL)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_KILL; - cfg.sub[i]->misc&=~SUB_KILLP; - break; - } - if(n==1 && cfg.sub[i]->misc&(SUB_KILL|SUB_KILLP)) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~(SUB_KILL|SUB_KILLP); - } - if(n==2 && !(cfg.sub[i]->misc&SUB_KILLP)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_KILLP; - cfg.sub[i]->misc&=~SUB_KILL; - break; - } - break; -#endif - case 13: - n=(cfg.sub[i]->misc&SUB_LZH) ? 0:1; - uifc.helpbuf= - "`Compress Messages with LZH Encoding:`\n" - "\n" - "If you want all messages in this sub-board to be automatically\n" - "compressed via `LZH` (Lempel/Ziv/Huffman algorithm used in LHarc, LHA,\n" - "and other popular compression and archive programs), this option to `Yes`.\n" - "\n" - "Compression will slow down the reading and writing of messages slightly,\n" - "but the storage space saved can be as much as `50 percent`.\n" - "\n" - "Before setting this option to `Yes`, make sure that all of the SMB\n" - "compatible mail programs you use support the `LZH` translation.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Compress Messages (LZH)",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_LZH)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_LZH; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_LZH) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_LZH; - } - break; - case 14: - n=(cfg.sub[i]->misc&SUB_TEMPLATE) ? 0:1; - uifc.helpbuf= - "`Use this Sub-board as a Template for New Subs:`\n" - "\n" - "If you want this sub-board's options / settings to be used as the\n" - "template for newly-created or cloned sub-boards in this message group,\n" - "set this option to `Yes`.\n" - "\n" - "If multiple sub-boards have this option enabled, only the first will be\n" - "used as the template." - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Use this Sub-board as a Template for New Subs",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_TEMPLATE)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_TEMPLATE; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_TEMPLATE) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_TEMPLATE; - } - break; - } + uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets" + ,cfg.sub[i]->qwkname,10,K_EDIT); + break; + case 3: + uifc.helpbuf=sub_code_help; + SAFECOPY(str,cfg.sub[i]->code_suffix); + uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Suffix (unique)" + ,str,LEN_CODE,K_EDIT|K_UPPER); + if(code_ok(str)) + SAFECOPY(cfg.sub[i]->code_suffix,str); + else { + uifc.helpbuf=invalid_code; + uifc.msg("Invalid Code"); + uifc.helpbuf=0; } - break; - case 14: - while(1) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line" - ,cfg.sub[i]->misc&SUB_NOTAG ? "No":"Yes"); - sprintf(opt[n++],"%-27.27s%s","Export ASCII Only" - ,cfg.sub[i]->misc&SUB_ASCII ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types" - ,cfg.sub[i]->misc&SUB_GATE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","QWK Networked" - ,cfg.sub[i]->misc&SUB_QNET ? "Yes":"No"); - sprintf(opt[n++],"QWK Tagline"); - sprintf(opt[n++],"%-27.27s%s","Internet (UUCP/NNTP)" - ,cfg.sub[i]->misc&SUB_INET ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay" - ,cfg.sub[i]->misc&SUB_PNET ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail" - ,cfg.sub[i]->misc&SUB_FIDO ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","FidoNet Address" - ,smb_faddrtoa(&cfg.sub[i]->faddr,tmp)); - sprintf(opt[n++],"EchoMail Origin Line"); - opt[n][0]=0; + break; + case 4: uifc.helpbuf= - "`Sub-board Network Options:`\n" + "Newsgroup Name:\n" "\n" - "This menu contains options for the selected sub-board that pertain\n" - "specifically to message networking.\n" + "This is the name of the sub-board used for newsgroup readers. If no name\n" + "is configured here, a name will be automatically generated from the\n" + "Sub-board's Short Name and message group's Short Name.\n" ; - n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0 - ,"Network Options",opt); - if(n==-1) - break; - switch(n) { - case 0: - n=0; - uifc.helpbuf= - "`Append Tag/Origin Line to Posts:`\n" - "\n" - "If you want to disable the automatic addition of a network tagline or\n" - "origin line to the bottom of outgoing networked posts from this\n" - "sub-board, set this option to `No`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Append Tag/Origin Line to Posts",uifcYesNoOpts); - if(n==-1) - break; - if(!n && cfg.sub[i]->misc&SUB_NOTAG) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_NOTAG; - break; - } - if(n==1 && !(cfg.sub[i]->misc&SUB_NOTAG)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_NOTAG; - } - break; - case 1: - n=0; - uifc.helpbuf= - "`Export ASCII Characters Only:`\n" - "\n" - "If the network that this sub-board is echoed on does not allow extended\n" - "ASCII (>127) or control codes (<20, not including CR), set this option\n" - "to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Export ASCII Characters Only",uifcYesNoOpts); - if(n==-1) - break; - if(n && cfg.sub[i]->misc&SUB_ASCII) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_ASCII; - break; - } - if(!n && !(cfg.sub[i]->misc&SUB_ASCII)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_ASCII; - } - break; - case 2: - n=1; - uifc.helpbuf= - "`Gate Between Net Types:`\n" - "\n" - "If this sub-board is networked using more than one network technology,\n" - "and you want messages to be `gated` between the networks, set this\n" - "option to `Yes`.\n" - "\n" - "If this option is set to `No`, messages imported from one network type\n" - "will `not` be exported to another network type. This is the default and\n" - "should be used unless you have `specific` permission from both networks\n" - "to gate this sub-board. Incorrectly gated sub-boards can cause duplicate\n" - "messages loops and cross-posted messages.\n" - "\n" - "This option does not affect the exporting of messages created on your\n" - "BBS.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Gate Between Net Types",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_GATE)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_GATE; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_GATE) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_GATE; - } - break; - case 3: - n=1; - uifc.helpbuf= - "`Sub-board Networked via QWK Packets:`\n" - "\n" - "If this sub-board is networked with other BBSs via QWK packets, this\n" - "option should be set to `Yes`. With this option set to `Yes`, titles of\n" - "posts on this sub-board will be limited to the QWK packet limitation of\n" - "25 characters. It also allows the `N`etwork restriction to function\n" - "properly.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via QWK Packets",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_QNET)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_QNET; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_QNET) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_QNET; - } - break; - case 4: - uifc.helpbuf= - "`Sub-board QWK Network Tagline:`\n" - "\n" - "If you want to use a different QWK tagline than the configured default\n" - "tagline in the `Networks` configuration, you should enter that tagline\n" - "here. If this option is left blank, the default tagline is used.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->tagline - ,sizeof(cfg.sub[i]->tagline)-1,K_MSG|K_EDIT); - break; - case 5: - n=1; - uifc.helpbuf= - "`Sub-board Networked via Internet:`\n" - "\n" - "If this sub-board is networked to the Internet via UUCP or NNTP, this\n" - "option should be set to `Yes`.\n" - "\n" - "It will allow the `N`etwork user restriction to function properly.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via Internet",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_INET)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_INET; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_INET) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_INET; - } - break; - case 6: - n=1; - uifc.helpbuf= - "`Sub-board Networked via PostLink or PCRelay:`\n" - "\n" - "If this sub-board is networked with other BBSs via PostLink or PCRelay,\n" - "this option should be set to `Yes`. With this option set to `Yes`,\n" - "titles of posts on this sub-board will be limited to the UTI\n" - "specification limitation of 25 characters. It also allows the `N`etwork\n" - "restriction to function properly.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via PostLink or PCRelay",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_PNET)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_PNET; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_PNET) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_PNET; - } - break; - case 7: - n=1; - uifc.helpbuf= - "`Sub-board Networked via FidoNet EchoMail:`\n" - "\n" - "If this sub-board is part of a FidoNet EchoMail conference, set this\n" - "option to `Yes`.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via FidoNet EchoMail",uifcYesNoOpts); - if(n==-1) - break; - if(!n && !(cfg.sub[i]->misc&SUB_FIDO)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_FIDO; - break; - } - if(n==1 && cfg.sub[i]->misc&SUB_FIDO) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~SUB_FIDO; - } - break; - case 8: - smb_faddrtoa(&cfg.sub[i]->faddr,str); - uifc.helpbuf= - "`Sub-board FidoNet Address:`\n" - "\n" - "If this sub-board is part of a FidoNet EchoMail conference, this is\n" - "the address used for this sub-board. Format: `Zone:Net/Node[.Point]`\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,"FidoNet Address" - ,str,25,K_EDIT); - cfg.sub[i]->faddr=atofaddr(str); - break; - case 9: - uifc.helpbuf= - "`Sub-board FidoNet Origin Line:`\n" - "\n" - "If this sub-board is part of a FidoNet EchoMail conference and you\n" - "want to use an origin line other than the default origin line in the\n" - "`Networks` configuration, set this value to the desired origin line.\n" - "\n" - "If this option is blank, the default origin line is used.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->origline - ,sizeof(cfg.sub[i]->origline)-1,K_EDIT); - break; - } - } - break; - case 15: - while(1) { - n=0; - if(cfg.sub[i]->qwkconf) - sprintf(str,"Static (%u)",cfg.sub[i]->qwkconf); - else - strcpy(str,"Dynamic"); - sprintf(opt[n++],"%-27.27s%s","QWK Conference Number" - ,str); - sprintf(opt[n++],"%-27.27s%s","Storage Method" - ,cfg.sub[i]->misc&SUB_HYPER ? "Hyper Allocation" - : cfg.sub[i]->misc&SUB_FAST ? "Fast Allocation" - : "Self-packing"); - if(!cfg.sub[i]->data_dir[0]) - sprintf(str,"%ssubs/",cfg.data_dir); - else - strcpy(str,cfg.sub[i]->data_dir); - sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str); - sprintf(opt[n++],"%-27.27s%.40s","Semaphore File",cfg.sub[i]->post_sem); - sprintf(opt[n++],"%-27.27s%u","Pointer File Index",cfg.sub[i]->ptridx); - sprintf(opt[n++],"%-27.27sNow %u / Was %u","Sub-board Index", i, cfg.sub[i]->subnum); - opt[n][0]=0; + uifc.input(WIN_MID|WIN_SAV,0,17,"" + ,cfg.sub[i]->newsgroup,sizeof(cfg.sub[i]->newsgroup)-1,K_EDIT); + break; + case 5: + sprintf(str,"%s Access",cfg.sub[i]->sname); + getar(str,cfg.sub[i]->arstr); + break; + case 6: + sprintf(str,"%s Reading",cfg.sub[i]->sname); + getar(str,cfg.sub[i]->read_arstr); + break; + case 7: + sprintf(str,"%s Posting",cfg.sub[i]->sname); + getar(str,cfg.sub[i]->post_arstr); + break; + case 8: + sprintf(str,"%s Operator",cfg.sub[i]->sname); + getar(str,cfg.sub[i]->op_arstr); + break; + case 9: + sprintf(str,"%s Moderated Posting User",cfg.sub[i]->sname); + getar(str,cfg.sub[i]->mod_arstr); + break; + case 10: + sprintf(str,"%"PRIu32,cfg.sub[i]->maxmsgs); uifc.helpbuf= - "`Sub-board Advanced Options:`\n" + "`Maximum Number of Messages:`\n" + "\n" + "This value is the maximum number of messages that will be kept in the\n" + "sub-board. It is possible for newly-posted or imported messages to\n" + "exceed this maximum (it is `not` an immediately imposed limit).\n" + "\n" + "Older messages that exceed this maximum count are purged using `smbutil`,\n" + "typically run as a timed event (e.g. `MSGMAINT`).\n" "\n" - "This menu contains options for the selected sub-board that are advanced\n" - "in nature.\n" + "A value of `0` means no maximum number of stored messages will be\n" + "imposed during message-base maintenance." ; - n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0 - ,"Advanced Options",opt); - if(n==-1) - break; - switch(n) { - case 0: - uifc.helpbuf= - "`Sub-board QWK Conference Number:`\n" - "\n" - "If you wish to have the QWK conference number for this sub-board\n" - "automatically generated by Synchronet (based on the group number\n" - "and sub-board number for the user), set this option to `Dynamic`.\n" - "\n" - "If you wish to have the same QWK conference number for this sub-board\n" - "regardless of which user access it, set this option to `Static`\n" - "by entering the conference number you want to use.\n" - ; - if(cfg.sub[i]->qwkconf) - sprintf(str,"%u",cfg.sub[i]->qwkconf); - else - str[0]=0; - if(uifc.input(WIN_MID|WIN_SAV,0,17 - ,"QWK Conference Number (0=Dynamic)" - ,str,5,K_EDIT|K_NUMBER)>=0) - cfg.sub[i]->qwkconf=atoi(str); + uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages" + ,str,9,K_EDIT|K_NUMBER); + cfg.sub[i]->maxmsgs=atoi(str); + cfg.sub[i]->misc|=SUB_HDRMOD; + break; + case 11: + sprintf(str,"%u",cfg.sub[i]->maxage); + uifc.helpbuf= + "`Maximum Age of Messages:`\n" + "\n" + "This value is the maximum number of days that messages will be kept in\n" + "the sub-board.\n" + "\n" + "Message age is calculated from the date and time of message import/post\n" + "and not necessarily the date/time the message was originally written.\n" + "\n" + "Old messages are purged using `smbutil`, typically run as a timed\n" + "event (e.g. `MSGMAINT`).\n" + "\n" + "A value of `0` means no maximum age of stored messages will be\n" + "imposed during message-base maintenance." + ; + uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)" + ,str,5,K_EDIT|K_NUMBER); + cfg.sub[i]->maxage=atoi(str); + cfg.sub[i]->misc|=SUB_HDRMOD; + break; + case 12: + sprintf(str,"%"PRIu32,cfg.sub[i]->maxcrcs); + uifc.helpbuf= + "`Maximum Number of CRCs:`\n" + "\n" + "This value is the maximum number of CRCs that will be kept in the\n" + "sub-board for duplicate message checking. Once this maximum number of\n" + "CRCs is reached, the oldest CRCs will be automatically purged.\n" + "\n" + "A value of `0` means no CRCs (or other hashes) of message body text\n" + "or meta-data will be saved (i.e. for purposes of duplicate message\n" + "detection and rejection)." + ; + uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs" + ,str,9,K_EDIT|K_NUMBER); + cfg.sub[i]->maxcrcs=atol(str); + cfg.sub[i]->misc|=SUB_HDRMOD; + break; + case 13: + while(1) { + n=0; + sprintf(opt[n++],"%-27.27s%s","Allow Private Posts" + ,cfg.sub[i]->misc&SUB_PRIV ? cfg.sub[i]->misc&SUB_PONLY + ? "Only":"Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts" + ,cfg.sub[i]->misc&SUB_ANON ? cfg.sub[i]->misc&SUB_AONLY + ? "Only":"Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Post Using Real Names" + ,cfg.sub[i]->misc&SUB_NAME ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Users Can Edit Posts" + ,cfg.sub[i]->misc&SUB_EDIT ? cfg.sub[i]->misc&SUB_EDITLAST + ? "Last" : "Yes" : "No"); + sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts" + ,cfg.sub[i]->misc&SUB_DEL ? cfg.sub[i]->misc&SUB_DELLAST + ? "Last" : "Yes" : "No"); + sprintf(opt[n++],"%-27.27s%s","Default On for New Scan" + ,cfg.sub[i]->misc&SUB_NSDEF ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan" + ,cfg.sub[i]->misc&SUB_FORCED ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan" + ,cfg.sub[i]->misc&SUB_SSDEF ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Public 'To' User" + ,cfg.sub[i]->misc&SUB_TOUSER ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Allow Message Voting" + ,cfg.sub[i]->misc&SUB_NOVOTING ? "No":"Yes"); + sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting" + ,cfg.sub[i]->misc&SUB_QUOTE ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Suppress User Signatures" + ,cfg.sub[i]->misc&SUB_NOUSERSIG ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs" + ,cfg.sub[i]->misc&SUB_SYSPERM ? "Yes":"No"); + #if 0 /* this is not actually implemented (yet?) */ + sprintf(opt[n++],"%-27.27s%s","Kill Read Messages" + ,cfg.sub[i]->misc&SUB_KILL ? "Yes" + : (cfg.sub[i]->misc&SUB_KILLP ? "Pvt" : "No")); + #endif + sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)" + ,cfg.sub[i]->misc&SUB_LZH ? "Yes" : "No"); + sprintf(opt[n++],"%-27.27s%s","Template for New Subs" + ,cfg.sub[i]->misc&SUB_TEMPLATE ? "Yes" : "No"); + + opt[n][0]=0; + uifc.helpbuf= + "`Sub-board Toggle Options:`\n" + "\n" + "This menu allows you to toggle certain options for the selected\n" + "sub-board between two or more settings, such as `Yes` and `No`.\n" + ; + n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0 + ,"Toggle Options",opt); + if(n==-1) break; - case 1: - n=0; - strcpy(opt[0],"Hyper Allocation"); - strcpy(opt[1],"Fast Allocation"); - strcpy(opt[2],"Self-packing"); - opt[3][0]=0; - uifc.helpbuf= - "`Self-Packing` is the slowest storage method because it conserves disk\n" - " space as it imports messages by using deleted message header and data\n" - " blocks for new messages automatically. If you use this storage method,\n" - " you will not need to run `smbutil p` on this message base unless you\n" - " accumilate a large number of deleted message blocks and wish to free\n" - " that disk space. You can switch from self-packing to fast allocation\n" - " storage method and back again as you wish.\n" - "`Fast Allocation` is faster than self-packing because it does not search\n" - " for deleted message blocks for new messages. It automatically places\n" - " all new message blocks at the end of the header and data files. If you\n" - " use this storage method, you will need to run `smbutil p` on this\n" - " message base periodically or it will continually use up disk space.\n" - "`Hyper Allocation` is the fastest storage method because it does not\n" - " maintain allocation files at all. Once a message base is setup to use\n" - " this storage method, it should not be changed without first deleting\n" - " the message base data files in your `data/subs` directory for this\n" - " sub-board. You must use `smbutil p` as with the fast allocation method.\n" - ; - n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Storage Method",opt); - if(n==-1) + switch(n) { + case 0: + if(cfg.sub[i]->misc&SUB_PONLY) + n=2; + else + n=(cfg.sub[i]->misc&SUB_PRIV) ? 0:1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + strcpy(opt[2],"Only"); + opt[3][0]=0; + uifc.helpbuf= + "`Allow Private Posts on Sub-board:`\n" + "\n" + "If you want users to be able to post private messages to other users\n" + "on this sub-board, set this value to `Yes`. Usually, E-mail is the\n" + "preferred method of private communication. If you want users to be able\n" + "to post private messages only on this sub-board, select `Only`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Allow Private Posts",opt); + if(n==-1) + break; + if(!n && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY)) + !=SUB_PRIV) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_PONLY; + cfg.sub[i]->misc|=SUB_PRIV; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_PRIV) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_PRIV; + break; + } + if(n==2 && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY)) + !=(SUB_PRIV|SUB_PONLY)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=(SUB_PRIV|SUB_PONLY); + } break; - if(!n && !(cfg.sub[i]->misc&SUB_HYPER)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_HYPER; - cfg.sub[i]->misc&=~SUB_FAST; - cfg.sub[i]->misc|=SUB_HDRMOD; - break; - } - if(!n) + case 1: + if(cfg.sub[i]->misc&SUB_AONLY) + n=2; + else + n=(cfg.sub[i]->misc&SUB_ANON) ? 0:1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + strcpy(opt[2],"Only"); + opt[3][0]=0; + uifc.helpbuf= + "`Allow Anonymous Posts on Sub-board:`\n" + "\n" + "If you want users with the `A` exemption to be able to post anonymously on\n" + "this sub-board, select `Yes`. If you want all posts on this sub-board to be\n" + "forced anonymous, select `Only`. If you do not want anonymous posts allowed\n" + "on this sub-board at all, select `No`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Allow Anonymous Posts",opt); + if(n==-1) + break; + if(!n && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) + !=SUB_ANON) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_AONLY; + cfg.sub[i]->misc|=SUB_ANON; + break; + } + if(n==1 && cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~(SUB_ANON|SUB_AONLY); + break; + } + if(n==2 && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) + !=(SUB_ANON|SUB_AONLY)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=(SUB_ANON|SUB_AONLY); + } + break; + case 2: + n=(cfg.sub[i]->misc&SUB_NAME) ? 0:1; + uifc.helpbuf= + "`User Real Names in Posts on Sub-board:`\n" + "\n" + "If you allow aliases on your system, you can have messages on this\n" + "sub-board automatically use the real name of the posting user by setting\n" + "this option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Use Real Names in Posts",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_NAME)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_NAME; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_NAME) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_NAME; + } + break; + case 3: + if(cfg.sub[i]->misc&SUB_EDITLAST) + n=2; + else + n=(cfg.sub[i]->misc&SUB_EDIT) ? 0:1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + strcpy(opt[2],"Last Post Only"); + opt[3][0]=0; + uifc.helpbuf= + "`Users Can Edit Posts on Sub-board:`\n" + "\n" + "If you wish to allow users to edit their messages after they have been\n" + "posted, this option to `Yes`. If you wish to allow users to edit only the\n" + "last message on a message base, set this option to `Last Post Only`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Users Can Edit Messages",opt); + if(n==-1) + break; + if(n==0 /* yes */ + && (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)) + !=SUB_EDIT + ) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_EDIT; + cfg.sub[i]->misc&=~SUB_EDITLAST; + break; + } + if(n==1 /* no */ + && cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST) + ) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~(SUB_EDIT|SUB_EDITLAST); + break; + } + if(n==2 /* last only */ + && (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)) + !=(SUB_EDIT|SUB_EDITLAST) + ) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=(SUB_EDIT|SUB_EDITLAST); + break; + } break; - if(cfg.sub[i]->misc&SUB_HYPER) { /* Switching from hyper */ + case 4: + if(cfg.sub[i]->misc&SUB_DELLAST) + n=2; + else + n=(cfg.sub[i]->misc&SUB_DEL) ? 0:1; + strcpy(opt[0],"Yes"); - strcpy(opt[1],"No, I want to use Hyper Allocation"); - opt[2][0]=0; - m=0; - if(uifc.list(WIN_SAV|WIN_MID,0,0,0,&m,0 - ,"Delete all messages in this sub-board?",opt)!=0) + strcpy(opt[1],"No"); + strcpy(opt[2],"Last Post Only"); + opt[3][0]=0; + uifc.helpbuf= + "`Users Can Delete Posts on Sub-board:`\n" + "\n" + "If you want users to be able to delete any of their own posts on this\n" + "sub-board, set this option to `Yes`. If you want to allow users the\n" + "ability to delete their message only if it is the last message on the\n" + "sub-board, select `Last Post Only`. If you want to disallow users from\n" + "deleting any of their posts, set this option to `No`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Users Can Delete Posts",opt); + if(n==-1) + break; + if(!n && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST)) + !=SUB_DEL) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_DELLAST; + cfg.sub[i]->misc|=SUB_DEL; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_DEL) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_DEL; + break; + } + if(n==2 && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST)) + !=(SUB_DEL|SUB_DELLAST)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=(SUB_DEL|SUB_DELLAST); + } + break; + case 5: + n=(cfg.sub[i]->misc&SUB_NSDEF) ? 0:1; + uifc.helpbuf= + "`Default On for New Scan:`\n" + "\n" + "If you want this sub-board to be included in all user new message scans\n" + "by default, set this option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Default On for New Scan",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_NSDEF)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_NSDEF; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_NSDEF) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_NSDEF; + } + break; + case 6: + n=(cfg.sub[i]->misc&SUB_FORCED) ? 0:1; + uifc.helpbuf= + "`Forced On for New Scan:`\n" + "\n" + "If you want this sub-board to be included in all user new message scans\n" + "even if the user has removed it from their new scan configuration, set\n" + "this option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Forced New Scan",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_FORCED)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_FORCED; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_FORCED) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_FORCED; + } + break; + case 7: + n=(cfg.sub[i]->misc&SUB_SSDEF) ? 0:1; + uifc.helpbuf= + "`Default On for Your Scan:`\n" + "\n" + "If you want this sub-board to be included in all user personal message\n" + "scans by default, set this option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Default On for Your Scan",uifcYesNoOpts); + if(n==-1) break; - if(cfg.sub[i]->data_dir[0]) - sprintf(str,"%s",cfg.sub[i]->data_dir); + if(!n && !(cfg.sub[i]->misc&SUB_SSDEF)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_SSDEF; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_SSDEF) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_SSDEF; + } + break; + case 8: + n=(cfg.sub[i]->misc&SUB_TOUSER) ? 0:1; + uifc.helpbuf= + "`Prompt for 'To' User on Public Posts:`\n" + "\n" + "If you want all posts on this sub-board to be prompted for a 'To' user,\n" + "set this option to `Yes`. This is a useful option for sub-boards that\n" + "are on a network that does not allow private posts.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Prompt for 'To' User on Public Posts",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_TOUSER)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_TOUSER; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_TOUSER) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_TOUSER; + } + break; + case 9: + n=(cfg.sub[i]->misc&SUB_NOVOTING) ? 1:0; + uifc.helpbuf= + "`Allow Message Voting:`\n" + "\n" + "If you want users to be allowed to Up-Vote or Down-Vote messages on this\n" + "sub-board, set this option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Allow Message Voting",uifcYesNoOpts); + if(n==-1) + break; + if(!n && (cfg.sub[i]->misc&SUB_NOVOTING)) { + uifc.changes = TRUE; + cfg.sub[i]->misc ^= SUB_NOVOTING; + break; + } + if(n==1 && !(cfg.sub[i]->misc&SUB_NOVOTING)) { + uifc.changes = TRUE; + cfg.sub[i]->misc ^= SUB_NOVOTING; + } + break; + case 10: + n=(cfg.sub[i]->misc&SUB_QUOTE) ? 0:1; + uifc.helpbuf= + "`Allow Message Quoting:`\n" + "\n" + "If you want users to be allowed to quote messages on this sub-board, set\n" + "this option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Allow Message Quoting",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_QUOTE)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_QUOTE; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_QUOTE) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_QUOTE; + } + break; + case 11: + n=(cfg.sub[i]->misc&SUB_NOUSERSIG) ? 0:1; + uifc.helpbuf= + "Suppress User Signatures:\n" + "\n" + "If you do not wish to have user signatures automatically appended to\n" + "messages posted in this sub-board, set this option to Yes.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Suppress User Signatures",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_NOUSERSIG)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_NOUSERSIG; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_NOUSERSIG) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_NOUSERSIG; + } + break; + case 12: + n=(cfg.sub[i]->misc&SUB_SYSPERM) ? 0:1; + uifc.helpbuf= + "`Operator Messages Automatically Permanent:`\n" + "\n" + "If you want messages posted by `System` and `Sub-board Operators` to be\n" + "automatically permanent (non-purgeable) for this sub-board, set this\n" + "option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Permanent Operator Messages",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_SYSPERM)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_SYSPERM; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_SYSPERM) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_SYSPERM; + } + break; + #if 0 /* This is not actually implemented (yet?) */ + case 12: + if(cfg.sub[i]->misc&SUB_KILLP) + n=2; + else + n=(cfg.sub[i]->misc&SUB_KILL) ? 0:1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + strcpy(opt[2],"Private"); + opt[3][0]=0; + uifc.helpbuf= + "`Kill Read Messages Automatically:`\n" + "\n" + "If you want messages that have been read by the intended recipient to\n" + "be automatically deleted by `SMBUTIL`, set this option to `Yes` or\n" + "`Private` if you want only private messages to be automatically deleted.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Kill Read Messages",opt); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_KILL)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_KILL; + cfg.sub[i]->misc&=~SUB_KILLP; + break; + } + if(n==1 && cfg.sub[i]->misc&(SUB_KILL|SUB_KILLP)) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~(SUB_KILL|SUB_KILLP); + } + if(n==2 && !(cfg.sub[i]->misc&SUB_KILLP)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_KILLP; + cfg.sub[i]->misc&=~SUB_KILL; + break; + } + break; + #endif + case 13: + n=(cfg.sub[i]->misc&SUB_LZH) ? 0:1; + uifc.helpbuf= + "`Compress Messages with LZH Encoding:`\n" + "\n" + "If you want all messages in this sub-board to be automatically\n" + "compressed via `LZH` (Lempel/Ziv/Huffman algorithm used in LHarc, LHA,\n" + "and other popular compression and archive programs), this option to `Yes`.\n" + "\n" + "Compression will slow down the reading and writing of messages slightly,\n" + "but the storage space saved can be as much as `50 percent`.\n" + "\n" + "Before setting this option to `Yes`, make sure that all of the SMB\n" + "compatible mail programs you use support the `LZH` translation.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Compress Messages (LZH)",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_LZH)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_LZH; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_LZH) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_LZH; + } + break; + case 14: + n=(cfg.sub[i]->misc&SUB_TEMPLATE) ? 0:1; + uifc.helpbuf= + "`Use this Sub-board as a Template for New Subs:`\n" + "\n" + "If you want this sub-board's options / settings to be used as the\n" + "template for newly-created or cloned sub-boards in this message group,\n" + "set this option to `Yes`.\n" + "\n" + "If multiple sub-boards have this option enabled, only the first will be\n" + "used as the template." + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Use this Sub-board as a Template for New Subs",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_TEMPLATE)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_TEMPLATE; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_TEMPLATE) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_TEMPLATE; + } + break; + } + } + break; + case 14: + while(1) { + n=0; + sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line" + ,cfg.sub[i]->misc&SUB_NOTAG ? "No":"Yes"); + sprintf(opt[n++],"%-27.27s%s","Export ASCII Only" + ,cfg.sub[i]->misc&SUB_ASCII ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types" + ,cfg.sub[i]->misc&SUB_GATE ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","QWK Networked" + ,cfg.sub[i]->misc&SUB_QNET ? "Yes":"No"); + sprintf(opt[n++],"QWK Tagline"); + sprintf(opt[n++],"%-27.27s%s","Internet (UUCP/NNTP)" + ,cfg.sub[i]->misc&SUB_INET ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay" + ,cfg.sub[i]->misc&SUB_PNET ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail" + ,cfg.sub[i]->misc&SUB_FIDO ? "Yes":"No"); + sprintf(opt[n++],"%-27.27s%s","FidoNet Address" + ,smb_faddrtoa(&cfg.sub[i]->faddr,tmp)); + sprintf(opt[n++],"EchoMail Origin Line"); + opt[n][0]=0; + uifc.helpbuf= + "`Sub-board Network Options:`\n" + "\n" + "This menu contains options for the selected sub-board that pertain\n" + "specifically to message networking.\n" + ; + n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0 + ,"Network Options",opt); + if(n==-1) + break; + switch(n) { + case 0: + n=0; + uifc.helpbuf= + "`Append Tag/Origin Line to Posts:`\n" + "\n" + "If you want to disable the automatic addition of a network tagline or\n" + "origin line to the bottom of outgoing networked posts from this\n" + "sub-board, set this option to `No`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Append Tag/Origin Line to Posts",uifcYesNoOpts); + if(n==-1) + break; + if(!n && cfg.sub[i]->misc&SUB_NOTAG) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_NOTAG; + break; + } + if(n==1 && !(cfg.sub[i]->misc&SUB_NOTAG)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_NOTAG; + } + break; + case 1: + n=0; + uifc.helpbuf= + "`Export ASCII Characters Only:`\n" + "\n" + "If the network that this sub-board is echoed on does not allow extended\n" + "ASCII (>127) or control codes (<20, not including CR), set this option\n" + "to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Export ASCII Characters Only",uifcYesNoOpts); + if(n==-1) + break; + if(n && cfg.sub[i]->misc&SUB_ASCII) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_ASCII; + break; + } + if(!n && !(cfg.sub[i]->misc&SUB_ASCII)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_ASCII; + } + break; + case 2: + n=1; + uifc.helpbuf= + "`Gate Between Net Types:`\n" + "\n" + "If this sub-board is networked using more than one network technology,\n" + "and you want messages to be `gated` between the networks, set this\n" + "option to `Yes`.\n" + "\n" + "If this option is set to `No`, messages imported from one network type\n" + "will `not` be exported to another network type. This is the default and\n" + "should be used unless you have `specific` permission from both networks\n" + "to gate this sub-board. Incorrectly gated sub-boards can cause duplicate\n" + "messages loops and cross-posted messages.\n" + "\n" + "This option does not affect the exporting of messages created on your\n" + "BBS.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Gate Between Net Types",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_GATE)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_GATE; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_GATE) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_GATE; + } + break; + case 3: + n=1; + uifc.helpbuf= + "`Sub-board Networked via QWK Packets:`\n" + "\n" + "If this sub-board is networked with other BBSs via QWK packets, this\n" + "option should be set to `Yes`. With this option set to `Yes`, titles of\n" + "posts on this sub-board will be limited to the QWK packet limitation of\n" + "25 characters. It also allows the `N`etwork restriction to function\n" + "properly.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Networked via QWK Packets",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_QNET)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_QNET; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_QNET) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_QNET; + } + break; + case 4: + uifc.helpbuf= + "`Sub-board QWK Network Tagline:`\n" + "\n" + "If you want to use a different QWK tagline than the configured default\n" + "tagline in the `Networks` configuration, you should enter that tagline\n" + "here. If this option is left blank, the default tagline is used.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->tagline + ,sizeof(cfg.sub[i]->tagline)-1,K_MSG|K_EDIT); + break; + case 5: + n=1; + uifc.helpbuf= + "`Sub-board Networked via Internet:`\n" + "\n" + "If this sub-board is networked to the Internet via UUCP or NNTP, this\n" + "option should be set to `Yes`.\n" + "\n" + "It will allow the `N`etwork user restriction to function properly.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Networked via Internet",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_INET)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_INET; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_INET) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_INET; + } + break; + case 6: + n=1; + uifc.helpbuf= + "`Sub-board Networked via PostLink or PCRelay:`\n" + "\n" + "If this sub-board is networked with other BBSs via PostLink or PCRelay,\n" + "this option should be set to `Yes`. With this option set to `Yes`,\n" + "titles of posts on this sub-board will be limited to the UTI\n" + "specification limitation of 25 characters. It also allows the `N`etwork\n" + "restriction to function properly.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Networked via PostLink or PCRelay",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_PNET)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_PNET; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_PNET) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_PNET; + } + break; + case 7: + n=1; + uifc.helpbuf= + "`Sub-board Networked via FidoNet EchoMail:`\n" + "\n" + "If this sub-board is part of a FidoNet EchoMail conference, set this\n" + "option to `Yes`.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Networked via FidoNet EchoMail",uifcYesNoOpts); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_FIDO)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_FIDO; + break; + } + if(n==1 && cfg.sub[i]->misc&SUB_FIDO) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~SUB_FIDO; + } + break; + case 8: + smb_faddrtoa(&cfg.sub[i]->faddr,str); + uifc.helpbuf= + "`Sub-board FidoNet Address:`\n" + "\n" + "If this sub-board is part of a FidoNet EchoMail conference, this is\n" + "the address used for this sub-board. Format: `Zone:Net/Node[.Point]`\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,"FidoNet Address" + ,str,25,K_EDIT); + cfg.sub[i]->faddr=atofaddr(str); + break; + case 9: + uifc.helpbuf= + "`Sub-board FidoNet Origin Line:`\n" + "\n" + "If this sub-board is part of a FidoNet EchoMail conference and you\n" + "want to use an origin line other than the default origin line in the\n" + "`Networks` configuration, set this value to the desired origin line.\n" + "\n" + "If this option is blank, the default origin line is used.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->origline + ,sizeof(cfg.sub[i]->origline)-1,K_EDIT); + break; + } + } + break; + case 15: + while(1) { + n=0; + if(cfg.sub[i]->qwkconf) + sprintf(str,"Static (%u)",cfg.sub[i]->qwkconf); + else + strcpy(str,"Dynamic"); + sprintf(opt[n++],"%-27.27s%s","QWK Conference Number" + ,str); + sprintf(opt[n++],"%-27.27s%s","Storage Method" + ,cfg.sub[i]->misc&SUB_HYPER ? "Hyper Allocation" + : cfg.sub[i]->misc&SUB_FAST ? "Fast Allocation" + : "Self-packing"); + if(!cfg.sub[i]->data_dir[0]) + sprintf(str,"%ssubs/",cfg.data_dir); + else + strcpy(str,cfg.sub[i]->data_dir); + sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str); + sprintf(opt[n++],"%-27.27s%.40s","Semaphore File",cfg.sub[i]->post_sem); + sprintf(opt[n++],"%-27.27s%u","Pointer File Index",cfg.sub[i]->ptridx); + sprintf(opt[n++],"%-27.27sNow %u / Was %u","Sub-board Index", i, cfg.sub[i]->subnum); + opt[n][0]=0; + uifc.helpbuf= + "`Sub-board Advanced Options:`\n" + "\n" + "This menu contains options for the selected sub-board that are advanced\n" + "in nature.\n" + ; + n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0 + ,"Advanced Options",opt); + if(n==-1) + break; + switch(n) { + case 0: + uifc.helpbuf= + "`Sub-board QWK Conference Number:`\n" + "\n" + "If you wish to have the QWK conference number for this sub-board\n" + "automatically generated by Synchronet (based on the group number\n" + "and sub-board number for the user), set this option to `Dynamic`.\n" + "\n" + "If you wish to have the same QWK conference number for this sub-board\n" + "regardless of which user access it, set this option to `Static`\n" + "by entering the conference number you want to use.\n" + ; + if(cfg.sub[i]->qwkconf) + sprintf(str,"%u",cfg.sub[i]->qwkconf); else - sprintf(str,"%ssubs/",cfg.data_dir); - sprintf(str2,"%s%s.*" - ,cfg.grp[cfg.sub[i]->grp]->code_prefix - ,cfg.sub[i]->code_suffix); - strlwr(str2); - delfiles(str,str2); - } + str[0]=0; + if(uifc.input(WIN_MID|WIN_SAV,0,17 + ,"QWK Conference Number (0=Dynamic)" + ,str,5,K_EDIT|K_NUMBER)>=0) + cfg.sub[i]->qwkconf=atoi(str); + break; + case 1: + n=0; + strcpy(opt[0],"Hyper Allocation"); + strcpy(opt[1],"Fast Allocation"); + strcpy(opt[2],"Self-packing"); + opt[3][0]=0; + uifc.helpbuf= + "`Self-Packing` is the slowest storage method because it conserves disk\n" + " space as it imports messages by using deleted message header and data\n" + " blocks for new messages automatically. If you use this storage method,\n" + " you will not need to run `smbutil p` on this message base unless you\n" + " accumilate a large number of deleted message blocks and wish to free\n" + " that disk space. You can switch from self-packing to fast allocation\n" + " storage method and back again as you wish.\n" + "`Fast Allocation` is faster than self-packing because it does not search\n" + " for deleted message blocks for new messages. It automatically places\n" + " all new message blocks at the end of the header and data files. If you\n" + " use this storage method, you will need to run `smbutil p` on this\n" + " message base periodically or it will continually use up disk space.\n" + "`Hyper Allocation` is the fastest storage method because it does not\n" + " maintain allocation files at all. Once a message base is setup to use\n" + " this storage method, it should not be changed without first deleting\n" + " the message base data files in your `data/subs` directory for this\n" + " sub-board. You must use `smbutil p` as with the fast allocation method.\n" + ; + n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 + ,"Storage Method",opt); + if(n==-1) + break; + if(!n && !(cfg.sub[i]->misc&SUB_HYPER)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_HYPER; + cfg.sub[i]->misc&=~SUB_FAST; + cfg.sub[i]->misc|=SUB_HDRMOD; + break; + } + if(!n) + break; + if(cfg.sub[i]->misc&SUB_HYPER) { /* Switching from hyper */ + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No, I want to use Hyper Allocation"); + opt[2][0]=0; + m=0; + if(uifc.list(WIN_SAV|WIN_MID,0,0,0,&m,0 + ,"Delete all messages in this sub-board?",opt)!=0) + break; + if(cfg.sub[i]->data_dir[0]) + sprintf(str,"%s",cfg.sub[i]->data_dir); + else + sprintf(str,"%ssubs/",cfg.data_dir); + sprintf(str2,"%s%s.*" + ,cfg.grp[cfg.sub[i]->grp]->code_prefix + ,cfg.sub[i]->code_suffix); + strlwr(str2); + delfiles(str,str2); + } - if(cfg.sub[i]->misc&SUB_HYPER) - cfg.sub[i]->misc|=SUB_HDRMOD; - if(n==1 && !(cfg.sub[i]->misc&SUB_FAST)) { - uifc.changes = TRUE; - cfg.sub[i]->misc|=SUB_FAST; - cfg.sub[i]->misc&=~SUB_HYPER; + if(cfg.sub[i]->misc&SUB_HYPER) + cfg.sub[i]->misc|=SUB_HDRMOD; + if(n==1 && !(cfg.sub[i]->misc&SUB_FAST)) { + uifc.changes = TRUE; + cfg.sub[i]->misc|=SUB_FAST; + cfg.sub[i]->misc&=~SUB_HYPER; + break; + } + if(n==2 && cfg.sub[i]->misc&(SUB_FAST|SUB_HYPER)) { + uifc.changes = TRUE; + cfg.sub[i]->misc&=~(SUB_FAST|SUB_HYPER); + break; + } + break; + case 2: + uifc.helpbuf= + "`Sub-board Storage Directory:`\n" + "\n" + "Use this if you wish to place the data directory for this sub-board on\n" + "another drive or in another directory besides the default setting.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,17,"Directory" + ,cfg.sub[i]->data_dir,sizeof(cfg.sub[i]->data_dir)-1,K_EDIT); break; - } - if(n==2 && cfg.sub[i]->misc&(SUB_FAST|SUB_HYPER)) { - uifc.changes = TRUE; - cfg.sub[i]->misc&=~(SUB_FAST|SUB_HYPER); + case 3: + uifc.helpbuf= + "`Sub-board Semaphore File:`\n" + "\n" + "This is a filename that will be created as a semaphore (signal) to an\n" + "external program or event whenever a message is posted in this sub-board.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,17,"Semaphore File" + ,cfg.sub[i]->post_sem,sizeof(cfg.sub[i]->post_sem)-1,K_EDIT); break; - } - break; - case 2: - uifc.helpbuf= - "`Sub-board Storage Directory:`\n" - "\n" - "Use this if you wish to place the data directory for this sub-board on\n" - "another drive or in another directory besides the default setting.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,17,"Directory" - ,cfg.sub[i]->data_dir,sizeof(cfg.sub[i]->data_dir)-1,K_EDIT); - break; - case 3: - uifc.helpbuf= - "`Sub-board Semaphore File:`\n" - "\n" - "This is a filename that will be created as a semaphore (signal) to an\n" - "external program or event whenever a message is posted in this sub-board.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,17,"Semaphore File" - ,cfg.sub[i]->post_sem,sizeof(cfg.sub[i]->post_sem)-1,K_EDIT); - break; - case 4: - uifc.helpbuf= - "`Sub-board Pointer Index:`\n" - "\n" - "You should normally have no reason to modify this value. If you get\n" - "crossed-up or duplicate ptridx values, then you may want to adjust\n" - "this value, but do so with great care and trepidation.\n" - ; - sprintf(str,"%u",cfg.sub[i]->ptridx); - if(uifc.input(WIN_MID|WIN_SAV,0,17 - ,"Pointer File Index (Danger!)" - ,str,5,K_EDIT|K_NUMBER)>=0) - cfg.sub[i]->ptridx=atoi(str); - break; - case 5: - uifc.msg("This value cannot be changed."); - break; + case 4: + uifc.helpbuf= + "`Sub-board Pointer Index:`\n" + "\n" + "You should normally have no reason to modify this value. If you get\n" + "crossed-up or duplicate ptridx values, then you may want to adjust\n" + "this value, but do so with great care and trepidation.\n" + ; + sprintf(str,"%u",cfg.sub[i]->ptridx); + if(uifc.input(WIN_MID|WIN_SAV,0,17 + ,"Pointer File Index (Danger!)" + ,str,5,K_EDIT|K_NUMBER)>=0) + cfg.sub[i]->ptridx=atoi(str); + break; + case 5: + uifc.msg("This value cannot be changed."); + break; - } - } - break; + } + } + break; } } } diff --git a/src/sbbs3/scfg/scfgsys.c b/src/sbbs3/scfg/scfgsys.c index f3b5f808f8d7d1979cc46a7d3266c0168f09f0f3..59a825cadaf6227e756c982d151e26bb4300bf86 100644 --- a/src/sbbs3/scfg/scfgsys.c +++ b/src/sbbs3/scfg/scfgsys.c @@ -76,2044 +76,2043 @@ void sys_cfg(void) char str[81],done=0; int i,j,k,dflt,bar; -while(1) { - i=0; - sprintf(opt[i++],"%-33.33s%s","BBS Name",cfg.sys_name); - sprintf(opt[i++],"%-33.33s%s","Location",cfg.sys_location); - sprintf(opt[i++],"%-33.33s%s %s","Local Time Zone" - ,smb_zonestr(cfg.sys_timezone,NULL) - ,SMB_TZ_HAS_DST(cfg.sys_timezone) && cfg.sys_misc&SM_AUTO_DST ? "(Auto-DST)" : ""); - sprintf(opt[i++],"%-33.33s%s","Operator",cfg.sys_op); - sprintf(opt[i++],"%-33.33s%s","Password","**********"); + while(1) { + i=0; + sprintf(opt[i++],"%-33.33s%s","BBS Name",cfg.sys_name); + sprintf(opt[i++],"%-33.33s%s","Location",cfg.sys_location); + sprintf(opt[i++],"%-33.33s%s %s","Local Time Zone" + ,smb_zonestr(cfg.sys_timezone,NULL) + ,SMB_TZ_HAS_DST(cfg.sys_timezone) && cfg.sys_misc&SM_AUTO_DST ? "(Auto-DST)" : ""); + sprintf(opt[i++],"%-33.33s%s","Operator",cfg.sys_op); + sprintf(opt[i++],"%-33.33s%s","Password","**********"); - sprintf(str,"%s Password" - ,cfg.sys_misc&SM_PWEDIT && cfg.sys_pwdays ? "Users Must Change" - : cfg.sys_pwdays ? "Users Get New Random" : "Users Can Change"); - if(cfg.sys_pwdays) - sprintf(tmp,"Every %u Days",cfg.sys_pwdays); - else if(cfg.sys_misc&SM_PWEDIT) - strcpy(tmp,"Yes"); - else - strcpy(tmp,"No"); - sprintf(opt[i++],"%-33.33s%s",str,tmp); + sprintf(str,"%s Password" + ,cfg.sys_misc&SM_PWEDIT && cfg.sys_pwdays ? "Users Must Change" + : cfg.sys_pwdays ? "Users Get New Random" : "Users Can Change"); + if(cfg.sys_pwdays) + sprintf(tmp,"Every %u Days",cfg.sys_pwdays); + else if(cfg.sys_misc&SM_PWEDIT) + strcpy(tmp,"Yes"); + else + strcpy(tmp,"No"); + sprintf(opt[i++],"%-33.33s%s",str,tmp); - sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users" - ,cfg.sys_deldays); - sprintf(opt[i++],"%-33.33s%s","Maximum Days of Inactivity" - ,cfg.sys_autodel ? ultoa(cfg.sys_autodel,tmp,10) : "Unlimited"); - sprintf(opt[i++],"%-33.33s%s","New User Password",cfg.new_pass); + sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users" + ,cfg.sys_deldays); + sprintf(opt[i++],"%-33.33s%s","Maximum Days of Inactivity" + ,cfg.sys_autodel ? ultoa(cfg.sys_autodel,tmp,10) : "Unlimited"); + sprintf(opt[i++],"%-33.33s%s","New User Password",cfg.new_pass); - strcpy(opt[i++],"Toggle Options..."); - strcpy(opt[i++],"New User Values..."); - strcpy(opt[i++],"Advanced Options..."); - strcpy(opt[i++],"Loadable Modules..."); - strcpy(opt[i++],"Security Level Values..."); - strcpy(opt[i++],"Expired Account Values..."); - strcpy(opt[i++],"Quick-Validation Values..."); - opt[i][0]=0; - uifc.helpbuf= - "`System Configuration:`\n" - "\n" - "This menu contains options and sub-menus of options that affect the\n" - "entire BBS system and the Synchronet Terminal Server in particular.\n" - ; - switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&sys_dflt,0 - ,"System Configuration",opt)) { - case -1: - i=save_changes(WIN_MID); - if(i==-1) + strcpy(opt[i++],"Toggle Options..."); + strcpy(opt[i++],"New User Values..."); + strcpy(opt[i++],"Advanced Options..."); + strcpy(opt[i++],"Loadable Modules..."); + strcpy(opt[i++],"Security Level Values..."); + strcpy(opt[i++],"Expired Account Values..."); + strcpy(opt[i++],"Quick-Validation Values..."); + opt[i][0]=0; + uifc.helpbuf= + "`System Configuration:`\n" + "\n" + "This menu contains options and sub-menus of options that affect the\n" + "entire BBS system and the Synchronet Terminal Server in particular.\n" + ; + switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&sys_dflt,0 + ,"System Configuration",opt)) { + case -1: + i=save_changes(WIN_MID); + if(i==-1) + break; + if(!i) { + cfg.new_install=new_install; + write_main_cfg(&cfg,backup_level); + refresh_cfg(&cfg); + } + return; + case 0: + uifc.helpbuf= + "`BBS Name:`\n" + "\n" + "This is the name of the BBS.\n" + ; + uifc.input(WIN_MID,0,0,"BBS Name",cfg.sys_name,sizeof(cfg.sys_name)-1,K_EDIT); break; - if(!i) { - cfg.new_install=new_install; - write_main_cfg(&cfg,backup_level); - refresh_cfg(&cfg); - } - return; - case 0: - uifc.helpbuf= - "`BBS Name:`\n" - "\n" - "This is the name of the BBS.\n" - ; - uifc.input(WIN_MID,0,0,"BBS Name",cfg.sys_name,sizeof(cfg.sys_name)-1,K_EDIT); - break; - case 1: - uifc.helpbuf= - "`System Location:`\n" - "\n" - "This is the location of the BBS. The format is flexible, but it is\n" - "suggested you use the `City, State` format for clarity.\n" - ; - uifc.input(WIN_MID,0,0,"Location",cfg.sys_location,sizeof(cfg.sys_location)-1,K_EDIT); - break; - case 2: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - uifc.helpbuf= - "`United States Time Zone:`\n" - "\n" - "If your local time zone is the United States, select `Yes`.\n" - ; - - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"United States Time Zone",opt); - if(i==-1) + case 1: + uifc.helpbuf= + "`System Location:`\n" + "\n" + "This is the location of the BBS. The format is flexible, but it is\n" + "suggested you use the `City, State` format for clarity.\n" + ; + uifc.input(WIN_MID,0,0,"Location",cfg.sys_location,sizeof(cfg.sys_location)-1,K_EDIT); break; - if(i==0) { - strcpy(opt[i++],"Atlantic"); - strcpy(opt[i++],"Eastern"); - strcpy(opt[i++],"Central"); - strcpy(opt[i++],"Mountain"); - strcpy(opt[i++],"Pacific"); - strcpy(opt[i++],"Yukon"); - strcpy(opt[i++],"Hawaii/Alaska"); - strcpy(opt[i++],"Bering"); - opt[i][0]=0; + case 2: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; i=0; uifc.helpbuf= - "`U.S. Time Zone:`\n" + "`United States Time Zone:`\n" "\n" - "Choose the region which most closely reflects your local U.S. time zone.\n" + "If your local time zone is the United States, select `Yes`.\n" ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"U.S. Time Zone",opt); + ,"United States Time Zone",opt); if(i==-1) break; - uifc.changes=1; - switch(i) { - case 0: - cfg.sys_timezone=AST; - break; - case 1: - cfg.sys_timezone=EST; - break; - case 2: - cfg.sys_timezone=CST; - break; - case 3: - cfg.sys_timezone=MST; - break; - case 4: - cfg.sys_timezone=PST; - break; - case 5: - cfg.sys_timezone=YST; - break; - case 6: - cfg.sys_timezone=HST; - break; - case 7: - cfg.sys_timezone=BST; - break; - } - configure_dst(); - break; - } - i=0; - strcpy(opt[i++],"Midway"); - strcpy(opt[i++],"Vancouver"); - strcpy(opt[i++],"Edmonton"); - strcpy(opt[i++],"Winnipeg"); - strcpy(opt[i++],"Bogota"); - strcpy(opt[i++],"Caracas"); - strcpy(opt[i++],"Rio de Janeiro"); - strcpy(opt[i++],"Fernando de Noronha"); - strcpy(opt[i++],"Azores"); - strcpy(opt[i++],"Western Europe (WET)"); - strcpy(opt[i++],"Central Europe (CET)"); - strcpy(opt[i++],"Eastern Europe (EET)"); - strcpy(opt[i++],"Moscow"); - strcpy(opt[i++],"Dubai"); - strcpy(opt[i++],"Kabul"); - strcpy(opt[i++],"Karachi"); - strcpy(opt[i++],"Bombay"); - strcpy(opt[i++],"Kathmandu"); - strcpy(opt[i++],"Dhaka"); - strcpy(opt[i++],"Bangkok"); - strcpy(opt[i++],"Hong Kong"); - strcpy(opt[i++],"Tokyo"); - strcpy(opt[i++],"Sydney"); - strcpy(opt[i++],"Noumea"); - strcpy(opt[i++],"Wellington"); - strcpy(opt[i++],"Other..."); - opt[i][0]=0; - i=0; - uifc.helpbuf= - "`Non-U.S. Time Zone:`\n" - "\n" - "Choose the region which most closely reflects your local time zone.\n" - "\n" - "Choose `Other...` if a region representing your local time zone is\n" - "not listed (you will be able to set the UTC offset manually)." - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"None-U.S. Time Zone",opt); - if(i==-1) - break; - uifc.changes=1; - switch(i) { - case 0: - cfg.sys_timezone=MID; - break; - case 1: - cfg.sys_timezone=VAN; - break; - case 2: - cfg.sys_timezone=EDM; - break; - case 3: - cfg.sys_timezone=WIN; - break; - case 4: - cfg.sys_timezone=BOG; - break; - case 5: - cfg.sys_timezone=CAR; - break; - case 6: - cfg.sys_timezone=RIO; - break; - case 7: - cfg.sys_timezone=FER; - break; - case 8: - cfg.sys_timezone=AZO; - break; - case 9: - cfg.sys_timezone=WET; - configure_dst(); - break; - case 10: - cfg.sys_timezone=CET; - configure_dst(); - break; - case 11: - cfg.sys_timezone=EET; - configure_dst(); - break; - case 12: - cfg.sys_timezone=MOS; - break; - case 13: - cfg.sys_timezone=DUB; - break; - case 14: - cfg.sys_timezone=KAB; - break; - case 15: - cfg.sys_timezone=KAR; - break; - case 16: - cfg.sys_timezone=BOM; - break; - case 17: - cfg.sys_timezone=KAT; - break; - case 18: - cfg.sys_timezone=DHA; - break; - case 19: - cfg.sys_timezone=BAN; - break; - case 20: - cfg.sys_timezone=HON; - break; - case 21: - cfg.sys_timezone=TOK; - break; - case 22: - cfg.sys_timezone=SYD; - break; - case 23: - cfg.sys_timezone=NOU; - break; - case 24: - cfg.sys_timezone=WEL; - break; - default: - if(cfg.sys_timezone>720 || cfg.sys_timezone<-720) - cfg.sys_timezone=0; - if(cfg.sys_timezone==0) - str[0]=0; - else - sprintf(str,"%02d:%02d" - ,cfg.sys_timezone/60,cfg.sys_timezone<0 - ? (-cfg.sys_timezone)%60 : cfg.sys_timezone%60); + if(i==0) { + strcpy(opt[i++],"Atlantic"); + strcpy(opt[i++],"Eastern"); + strcpy(opt[i++],"Central"); + strcpy(opt[i++],"Mountain"); + strcpy(opt[i++],"Pacific"); + strcpy(opt[i++],"Yukon"); + strcpy(opt[i++],"Hawaii/Alaska"); + strcpy(opt[i++],"Bering"); + opt[i][0]=0; + i=0; uifc.helpbuf= - "`Time Zone Offset:`\n" + "`U.S. Time Zone:`\n" "\n" - "Enter your local time zone offset from Universal Time (UTC/GMT)\n" - "in `HH:MM` format.\n" + "Choose the region which most closely reflects your local U.S. time zone.\n" ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Time (HH:MM) East (+) or West (-) of Universal " - "Time" - ,str,6,K_EDIT|K_UPPER); - cfg.sys_timezone=atoi(str)*60; - char *p=strchr(str,':'); - if(p) { - if(cfg.sys_timezone<0) - cfg.sys_timezone-=atoi(p+1); - else - cfg.sys_timezone+=atoi(p+1); - } - break; - } - break; - case 3: - uifc.helpbuf= - "`System Operator:`\n" - "\n" - "This is the name or alias of the system operator. This does not have to\n" - "be the same as user #1. This field is used for informational purposes\n" - "only.\n" - ; - uifc.input(WIN_MID,0,0,"System Operator",cfg.sys_op,sizeof(cfg.sys_op)-1,K_EDIT); - break; - case 4: - uifc.helpbuf= - "`System Password:`\n" - "\n" - "This is an extra security password required for sysop logon and certain\n" - "sysop functions. This password should be something not easily guessed\n" - "and should be kept absolutely confidential. This password must be\n" - "entered at the Terminal Server `SY:` prompt.\n" - ; - uifc.input(WIN_MID,0,0,"System Password",cfg.sys_pass,sizeof(cfg.sys_pass)-1,K_EDIT|K_UPPER); - break; - case 5: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - uifc.helpbuf= - "`Allow Users to Change Their Password:`\n" - "\n" - "If you want the users of your system to have the option of changing\n" - "their password to a string of their choice, set this option to `Yes`.\n" - "For the highest level of security, set this option to `No.`\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Change Their Password",opt); - if(!i && !(cfg.sys_misc&SM_PWEDIT)) { - cfg.sys_misc|=SM_PWEDIT; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_PWEDIT) { - cfg.sys_misc&=~SM_PWEDIT; - uifc.changes=1; - } - i=0; - uifc.helpbuf= - "`Force Periodic Password uifc.changes:`\n" - "\n" - "If you want your users to be forced to change their passwords\n" - "periodically, select `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Force Periodic Password Changes",opt); - if(!i) { - ultoa(cfg.sys_pwdays,str,10); - uifc.helpbuf= - "`Maximum Days Between Password uifc.changes:`\n" - "\n" - "Enter the maximum number of days allowed between password uifc.changes.\n" - "If a user has not voluntarily changed his or her password in this\n" - "many days, he or she will be forced to change their password upon\n" - "logon.\n" - ; - uifc.input(WIN_MID,0,0,"Maximum Days Between Password Changes" - ,str,5,K_NUMBER|K_EDIT); - cfg.sys_pwdays=atoi(str); - } - else if(i==1 && cfg.sys_pwdays) { - cfg.sys_pwdays=0; - uifc.changes=1; - } - - break; - case 6: - sprintf(str,"%u",cfg.sys_deldays); - uifc.helpbuf= - "`Days Since Last Logon to Preserve Deleted Users:`\n" - "\n" - "Deleted user slots can be `undeleted` until the slot is written over\n" - "by a new user. If you want deleted user slots to be preserved for period\n" - "of time since their last logon, set this value to the number of days to\n" - "keep new users from taking over a deleted user's slot.\n" - ; - uifc.input(WIN_MID,0,0,"Days Since Last Logon to Preserve Deleted Users" - ,str,5,K_EDIT|K_NUMBER); - cfg.sys_deldays=atoi(str); - break; - case 7: - sprintf(str,"%u",cfg.sys_autodel); - uifc.helpbuf= - "`Maximum Days of Inactivity Before Auto-Deletion:`\n" - "\n" - "If you want users that haven't logged on in certain period of time to\n" - "be automatically deleted, set this value to the maximum number of days\n" - "of inactivity before the user is deleted. Setting this value to `0`\n" - "disables this feature.\n" - "\n" - "Users with the `P` exemption will not be deleted due to inactivity.\n" - ; - uifc.input(WIN_MID,0,0,"Maximum Days of Inactivity Before Auto-Deletion" - ,str,5,K_EDIT|K_NUMBER); - cfg.sys_autodel=atoi(str); - break; - case 8: - uifc.helpbuf= - "`New User Password:`\n" - "\n" - "If you want callers to only be able to logon as `New` if they know a\n" - "certain password, enter that password here. If you want any caller to\n" - "be able to logon as New, leave this option blank.\n" - ; - uifc.input(WIN_MID,0,0,"New User Password",cfg.new_pass,sizeof(cfg.new_pass)-1 - ,K_EDIT|K_UPPER); - break; - case 9: /* Toggle Options */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-33.33s%s","Allow Aliases" - ,cfg.uq&UQ_ALIASES ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Time Banking" - ,cfg.sys_misc&SM_TIMEBANK ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Credit Conversions" - ,cfg.sys_misc&SM_NOCDTCVT ? "No" : "Yes"); - sprintf(opt[i++],"%-33.33s%s","Allow Sysop Logins" - ,cfg.sys_misc&SM_R_SYSOP ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Display/Log Passwords Locally" - ,cfg.sys_misc&SM_ECHO_PW ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Short Sysop Page" - ,cfg.sys_misc&SM_SHRTPAGE ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Include Sysop in Statistics" - ,cfg.sys_misc&SM_SYSSTAT ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Closed to New Users" - ,cfg.sys_misc&SM_CLOSED ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Use Location in User Lists" - ,cfg.sys_misc&SM_LISTLOC ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Military (24 hour) Time Format" - ,cfg.sys_misc&SM_MILITARY ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","European Date Format (DD/MM/YY)" - ,cfg.sys_misc&SM_EURODATE ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","User Expires When Out-of-time" - ,cfg.sys_misc&SM_TIME_EXP ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Display Sys Info During Logon" - ,cfg.sys_misc&SM_NOSYSINFO ? "No" : "Yes"); - sprintf(opt[i++],"%-33.33s%s","Display Node List During Logon" - ,cfg.sys_misc&SM_NONODELIST ? "No" : "Yes"); - opt[i][0]=0; - uifc.helpbuf= - "`System Toggle Options:`\n" - "\n" - "This is a menu of system related options that can be toggled between\n" - "two or more states, such as `Yes` and `No`.\n" - ; - switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,41,&tog_dflt,0 - ,"Toggle Options",opt)) { - case -1: - done=1; - break; - case 0: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.uq&UQ_ALIASES ? 0:1; - uifc.helpbuf= - "`Allow Users to Use Aliases:`\n" - "\n" - "If you want the users of your system to be allowed to be known by a\n" - "false name, handle, or alias, set this option to `Yes`. If you want all\n" - "users on your system to be known only by their real names, select `No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Use Aliases",opt); - if(!i && !(cfg.uq&UQ_ALIASES)) { - cfg.uq|=UQ_ALIASES; - uifc.changes=1; - } - else if(i==1 && cfg.uq&UQ_ALIASES) { - cfg.uq&=~UQ_ALIASES; - uifc.changes=1; - } - break; - case 1: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_TIMEBANK ? 0:1; - uifc.helpbuf= - "`Allow Time Banking:`\n" - "\n" - "If you want the users of your system to be allowed to be deposit\n" - "any extra time they may have left during a call into their minute bank,\n" - "set this option to `Yes`. If this option is set to `No`, then the only\n" - "way a user may get minutes in their minute bank is to purchase them\n" - "with credits.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Depost Time in Minute Bank",opt); - if(!i && !(cfg.sys_misc&SM_TIMEBANK)) { - cfg.sys_misc|=SM_TIMEBANK; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_TIMEBANK) { - cfg.sys_misc&=~SM_TIMEBANK; - uifc.changes=1; - } - break; - case 2: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_NOCDTCVT ? 1:0; - uifc.helpbuf= - "`Allow Credits to be Converted into Minutes:`\n" - "\n" - "If you want the users of your system to be allowed to be convert\n" - "any credits they may have into minutes for their minute bank,\n" - "set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Convert Credits into Minutes" - ,opt); - if(!i && cfg.sys_misc&SM_NOCDTCVT) { - cfg.sys_misc&=~SM_NOCDTCVT; - uifc.changes=1; - } - else if(i==1 && !(cfg.sys_misc&SM_NOCDTCVT)) { - cfg.sys_misc|=SM_NOCDTCVT; - uifc.changes=1; - } - break; - case 3: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_R_SYSOP ? 0:1; - uifc.helpbuf= - "`Allow Sysop Logins:`\n" - "\n" - "If you want to be able to login with sysop access, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Sysop Logins",opt); - if(!i && !(cfg.sys_misc&SM_R_SYSOP)) { - cfg.sys_misc|=SM_R_SYSOP; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_R_SYSOP) { - cfg.sys_misc&=~SM_R_SYSOP; - uifc.changes=1; - } - break; - case 4: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_ECHO_PW ? 0:1; - uifc.helpbuf= - "`Display/Log Passwords Locally:`\n" - "\n" - "If you want to passwords to be displayed locally and/or logged to disk\n" - "(e.g. when there's a failed login attempt), set this option to `Yes`.\n" - "\n" - "For elevated security, set this option to `No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Display/Log Passwords Locally",opt); - if(!i && !(cfg.sys_misc&SM_ECHO_PW)) { - cfg.sys_misc|=SM_ECHO_PW; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_ECHO_PW) { - cfg.sys_misc&=~SM_ECHO_PW; - uifc.changes=1; - } - break; - case 5: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_SHRTPAGE ? 0:1; - uifc.helpbuf= - "`Short Sysop Page:`\n" - "\n" - "If you would like the sysop page to be a short series of beeps rather\n" - "than continuous random tones, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Short Sysop Page" - ,opt); - if(i==1 && cfg.sys_misc&SM_SHRTPAGE) { - cfg.sys_misc&=~SM_SHRTPAGE; - uifc.changes=1; - } - else if(!i && !(cfg.sys_misc&SM_SHRTPAGE)) { - cfg.sys_misc|=SM_SHRTPAGE; - uifc.changes=1; - } + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"U.S. Time Zone",opt); + if(i==-1) break; - case 6: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_SYSSTAT ? 0:1; - uifc.helpbuf= - "`Include Sysop Activity in System Statistics:`\n" - "\n" - "If you want sysops to be included in the statistical data of the BBS,\n" - "set this option to `Yes`. The suggested setting for this option is\n" - "`No` so that statistical data will only reflect user usage and not\n" - "include sysop maintenance activity.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Include Sysop Activity in System Statistics" - ,opt); - if(!i && !(cfg.sys_misc&SM_SYSSTAT)) { - cfg.sys_misc|=SM_SYSSTAT; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_SYSSTAT) { - cfg.sys_misc&=~SM_SYSSTAT; - uifc.changes=1; - } - break; - case 7: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_CLOSED ? 0:1; - uifc.helpbuf= - "`Closed to New Users:`\n" - "\n" - "If you want callers to be able to logon as `New`, set this option to `No`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Closed to New Users",opt); - if(!i && !(cfg.sys_misc&SM_CLOSED)) { - cfg.sys_misc|=SM_CLOSED; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_CLOSED) { - cfg.sys_misc&=~SM_CLOSED; - uifc.changes=1; - } - break; - case 8: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_LISTLOC ? 0:1; - uifc.helpbuf= - "`User Location in User Lists:`\n" - "\n" - "If you want user locations (city, state) displayed in the user lists,\n" - "set this option to `Yes`. If this option is set to `No`, the user notes\n" - "(if they exist) are displayed in the user lists.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"User Location (Instead of Note) in User Lists" - ,opt); - if(!i && !(cfg.sys_misc&SM_LISTLOC)) { - cfg.sys_misc|=SM_LISTLOC; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_LISTLOC) { - cfg.sys_misc&=~SM_LISTLOC; - uifc.changes=1; - } - break; - case 9: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_MILITARY ? 0:1; - uifc.helpbuf= - "`Military:`\n" - "\n" - "If you would like the time-of-day to be displayed and entered in 24 hour\n" - "format always, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Military Time Format",opt); - if(!i && !(cfg.sys_misc&SM_MILITARY)) { - cfg.sys_misc|=SM_MILITARY; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_MILITARY) { - cfg.sys_misc&=~SM_MILITARY; - uifc.changes=1; - } - break; - case 10: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_EURODATE ? 0:1; - uifc.helpbuf= - "`European Date Format:`\n" - "\n" - "If you would like dates to be displayed and entered in `DD/MM/YY` format\n" - "instead of `MM/DD/YY` format, set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"European Date Format",opt); - if(!i && !(cfg.sys_misc&SM_EURODATE)) { - cfg.sys_misc|=SM_EURODATE; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_EURODATE) { - cfg.sys_misc&=~SM_EURODATE; - uifc.changes=1; - } - break; - case 11: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_TIME_EXP ? 0:1; - uifc.helpbuf= - "`User Expires When Out-of-time:`\n" - "\n" - "If you want users to be set to `Expired User Values` if they run out of\n" - "time online, then set this option to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"User Expires When Out-of-time",opt); - if(!i && !(cfg.sys_misc&SM_TIME_EXP)) { - cfg.sys_misc|=SM_TIME_EXP; - uifc.changes=1; - } - else if(i==1 && cfg.sys_misc&SM_TIME_EXP) { - cfg.sys_misc&=~SM_TIME_EXP; - uifc.changes=1; - } - break; - case 12: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_NOSYSINFO ? 1:0; - uifc.helpbuf= - "`Display System Information During Logon:`\n" - "\n" - "If you want system information displayed during logon, set this option\n" - "to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Display System Information During Logon",opt); - if(!i && cfg.sys_misc&SM_NOSYSINFO) { - cfg.sys_misc&=~SM_NOSYSINFO; - uifc.changes=1; - } - else if(i==1 && !(cfg.sys_misc&SM_NOSYSINFO)) { - cfg.sys_misc|=SM_NOSYSINFO; - uifc.changes=1; - } - break; - case 13: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=cfg.sys_misc&SM_NONODELIST ? 1:0; - uifc.helpbuf= - "`Display Active Node List During Logon:`\n" - "\n" - "If you want the active nodes displayed during logon, set this option\n" - "to `Yes`.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Display Active Node List During Logon",opt); - if(!i && cfg.sys_misc&SM_NONODELIST) { - cfg.sys_misc&=~SM_NONODELIST; - uifc.changes=1; - } - else if(i==1 && !(cfg.sys_misc&SM_NONODELIST)) { - cfg.sys_misc|=SM_NONODELIST; - uifc.changes=1; - } - break; - } + uifc.changes=1; + switch(i) { + case 0: + cfg.sys_timezone=AST; + break; + case 1: + cfg.sys_timezone=EST; + break; + case 2: + cfg.sys_timezone=CST; + break; + case 3: + cfg.sys_timezone=MST; + break; + case 4: + cfg.sys_timezone=PST; + break; + case 5: + cfg.sys_timezone=YST; + break; + case 6: + cfg.sys_timezone=HST; + break; + case 7: + cfg.sys_timezone=BST; + break; + } + configure_dst(); + break; } - break; - case 10: /* New User Values */ - done=0; - while(!done) { i=0; - sprintf(opt[i++],"%-27.27s%u","Level",cfg.new_level); - sprintf(opt[i++],"%-27.27s%s","Flag Set #1" - ,ltoaf(cfg.new_flags1,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #2" - ,ltoaf(cfg.new_flags2,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #3" - ,ltoaf(cfg.new_flags3,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #4" - ,ltoaf(cfg.new_flags4,str)); - sprintf(opt[i++],"%-27.27s%s","Exemptions" - ,ltoaf(cfg.new_exempt,str)); - sprintf(opt[i++],"%-27.27s%s","Restrictions" - ,ltoaf(cfg.new_rest,str)); - sprintf(opt[i++],"%-27.27s%s","Expiration Days" - ,ultoa(cfg.new_expire,str,10)); - - ultoac(cfg.new_cdt,str); - sprintf(opt[i++],"%-27.27s%s","Credits",str); - ultoac(cfg.new_min,str); - sprintf(opt[i++],"%-27.27s%s","Minutes",str); - sprintf(opt[i++],"%-27.27s%s","Editor" - ,cfg.new_xedit); - sprintf(opt[i++],"%-27.27s%s","Command Shell" - ,cfg.shell[cfg.new_shell]->code); - if(cfg.new_prot!=' ') - sprintf(str,"%c",cfg.new_prot); - else - strcpy(str,"None"); - sprintf(opt[i++],"%-27.27s%s","Download Protocol",str); - sprintf(opt[i++],"%-27.27s%hu","Days of New Messages", cfg.new_msgscan_init); - strcpy(opt[i++],"Default Toggles..."); - strcpy(opt[i++],"Question Toggles..."); + strcpy(opt[i++],"Midway"); + strcpy(opt[i++],"Vancouver"); + strcpy(opt[i++],"Edmonton"); + strcpy(opt[i++],"Winnipeg"); + strcpy(opt[i++],"Bogota"); + strcpy(opt[i++],"Caracas"); + strcpy(opt[i++],"Rio de Janeiro"); + strcpy(opt[i++],"Fernando de Noronha"); + strcpy(opt[i++],"Azores"); + strcpy(opt[i++],"Western Europe (WET)"); + strcpy(opt[i++],"Central Europe (CET)"); + strcpy(opt[i++],"Eastern Europe (EET)"); + strcpy(opt[i++],"Moscow"); + strcpy(opt[i++],"Dubai"); + strcpy(opt[i++],"Kabul"); + strcpy(opt[i++],"Karachi"); + strcpy(opt[i++],"Bombay"); + strcpy(opt[i++],"Kathmandu"); + strcpy(opt[i++],"Dhaka"); + strcpy(opt[i++],"Bangkok"); + strcpy(opt[i++],"Hong Kong"); + strcpy(opt[i++],"Tokyo"); + strcpy(opt[i++],"Sydney"); + strcpy(opt[i++],"Noumea"); + strcpy(opt[i++],"Wellington"); + strcpy(opt[i++],"Other..."); opt[i][0]=0; + i=0; uifc.helpbuf= - "`New User Values:`\n" + "`Non-U.S. Time Zone:`\n" + "\n" + "Choose the region which most closely reflects your local time zone.\n" "\n" - "This menu allows you to determine the default settings for new users.\n" + "Choose `Other...` if a region representing your local time zone is\n" + "not listed (you will be able to set the UTC offset manually)." ; - switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&new_dflt,0 - ,"New User Values",opt)) { - case -1: - done=1; - break; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"None-U.S. Time Zone",opt); + if(i==-1) + break; + uifc.changes=1; + switch(i) { case 0: - ultoa(cfg.new_level,str,10); - uifc.helpbuf= - "`New User Security Level:`\n" - "\n" - "This is the security level automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level" - ,str,2,K_EDIT|K_NUMBER); - cfg.new_level=atoi(str); + cfg.sys_timezone=MID; break; case 1: - truncsp(ltoaf(cfg.new_flags1,str)); - uifc.helpbuf= - "`New User Security Flags:`\n" - "\n" - "These are the security flags automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #1" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.new_flags1=aftol(str); + cfg.sys_timezone=VAN; break; case 2: - truncsp(ltoaf(cfg.new_flags2,str)); - uifc.helpbuf= - "`New User Security Flags:`\n" - "\n" - "These are the security flags automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #2" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.new_flags2=aftol(str); - break; + cfg.sys_timezone=EDM; + break; case 3: - truncsp(ltoaf(cfg.new_flags3,str)); - uifc.helpbuf= - "`New User Security Flags:`\n" - "\n" - "These are the security flags automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #3" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.new_flags3=aftol(str); - break; + cfg.sys_timezone=WIN; + break; case 4: - truncsp(ltoaf(cfg.new_flags4,str)); - uifc.helpbuf= - "`New User Security Flags:`\n" - "\n" - "These are the security flags automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #4" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.new_flags4=aftol(str); - break; + cfg.sys_timezone=BOG; + break; case 5: - truncsp(ltoaf(cfg.new_exempt,str)); - uifc.helpbuf= - "`New User Exemption Flags:`\n" - "\n" - "These are the exemptions that are automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - cfg.new_exempt=aftol(str); + cfg.sys_timezone=CAR; break; case 6: - truncsp(ltoaf(cfg.new_rest,str)); - uifc.helpbuf= - "`New User Restriction Flags:`\n" - "\n" - "These are the restrictions that are automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - cfg.new_rest=aftol(str); + cfg.sys_timezone=RIO; break; case 7: - ultoa(cfg.new_expire,str,10); - uifc.helpbuf= - "`New User Expiration Days:`\n" - "\n" - "If you wish new users to have an automatic expiration date, set this\n" - "value to the number of days before the user will expire. To disable\n" - "New User expiration, set this value to `0`.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Expiration Days",str,4 - ,K_EDIT|K_NUMBER); - cfg.new_expire=atoi(str); + cfg.sys_timezone=FER; break; case 8: - ultoa(cfg.new_cdt,str,10); - uifc.helpbuf= - "`New User Credits:`\n" - "\n" - "This is the amount of credits that are automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Credits",str,10 - ,K_EDIT|K_NUMBER); - cfg.new_cdt=atol(str); - break; + cfg.sys_timezone=AZO; + break; case 9: - ultoa(cfg.new_min,str,10); - uifc.helpbuf= - "`New User Minutes:`\n" - "\n" - "This is the number of extra minutes automatically given to new users.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Minutes (Time Credit)" - ,str,10,K_EDIT|K_NUMBER); - cfg.new_min=atol(str); + cfg.sys_timezone=WET; + configure_dst(); break; case 10: - if(!cfg.total_xedits) { - uifc.msg("No External Editors Configured"); - break; - } - strcpy(opt[0],"Internal"); - for(i=1;i<=cfg.total_xedits;i++) - strcpy(opt[i],cfg.xedit[i-1]->code); - opt[i][0]=0; - i=0; - uifc.helpbuf= - "`New User Editor:`\n" - "\n" - "You can use this option to select the default editor for new users.\n" - ; - i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0,"Editors",opt); - if(i==-1) - break; - uifc.changes=1; - if(i && i<=cfg.total_xedits) - sprintf(cfg.new_xedit,"%-.8s",cfg.xedit[i-1]->code); - else - cfg.new_xedit[0]=0; + cfg.sys_timezone=CET; + configure_dst(); break; case 11: - for(i=0;i<cfg.total_shells && i<MAX_OPTS;i++) - sprintf(opt[i],"%-.8s",cfg.shell[i]->code); - opt[i][0]=0; - i=0; - uifc.helpbuf= - "`New User Command Shell:`\n" - "\n" - "You can use this option to select the default command shell for new\n" - "users.\n" - ; - i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0 - ,"Command Shells",opt); - if(i==-1) - break; - cfg.new_shell=i; - uifc.changes=1; + cfg.sys_timezone=EET; + configure_dst(); break; case 12: - uifc.helpbuf= - "`New User Default Download Protocol:`\n" - "\n" - "This option allows you to set the default download protocol of new users\n" - "(protocol command key or `BLANK` for no default).\n" - ; - sprintf(str,"%c",cfg.new_prot); - uifc.input(WIN_SAV|WIN_MID,0,0 - ,"Default Download Protocol (SPACE=Disabled)" - ,str,1,K_EDIT|K_UPPER); - cfg.new_prot=str[0]; - if(cfg.new_prot<' ') - cfg.new_prot=' '; - break; + cfg.sys_timezone=MOS; + break; case 13: - uifc.helpbuf= - "`New User Days of New Messages:`\n" - "\n" - "This option allows you to set the number of days worth of messages\n" - "which will be included in the new user's first `new message scan`.\n" - "\n" - "The value `0` means there will be `no` new messages for the new user.\n" - ; - sprintf(str,"%hu",cfg.new_msgscan_init); - uifc.input(WIN_SAV|WIN_MID,0,0 - ,"Days of New Messages for New User's first new message scan" - ,str,4,K_EDIT|K_NUMBER); - cfg.new_msgscan_init=atoi(str); - break; + cfg.sys_timezone=DUB; + break; case 14: - uifc.helpbuf= - "`New User Default Toggle Options:`\n" - "\n" - "This menu contains the default state of new user toggle options. All new\n" - "users on your system will have their defaults set according to the\n" - "settings on this menu. The user can then change them to his or her\n" - "liking.\n" - "\n" - "See the Synchronet User Manual for more information on the individual\n" - "options available.\n" - ; - j=0; - k=0; - while(1) { - i=0; - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Expert Menu Mode" - ,cfg.new_misc&EXPERT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Screen Pause" - ,cfg.new_misc&UPAUSE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Spinning Cursor" - ,cfg.new_misc&SPIN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Clear Screen" - ,cfg.new_misc&CLRSCRN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Ask For New Scan" - ,cfg.new_misc&ASK_NSCAN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Ask For Your Msg Scan" - ,cfg.new_misc&ASK_SSCAN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Automatic New File Scan" - ,cfg.new_misc&ANFSCAN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Remember Current Sub-board" - ,cfg.new_misc&CURSUB ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Batch Download File Flag" - ,cfg.new_misc&BATCHFLAG ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Extended File Descriptions" - ,cfg.new_misc&EXTDESC ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Hot Keys" - ,cfg.new_misc&COLDKEYS ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Auto Hang-up After Xfer" - ,cfg.new_misc&AUTOHANG ? "Yes":"No"); - opt[i][0]=0; - j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k - ,"Default Toggle Options",opt); - if(j==-1) - break; - uifc.changes=1; - switch(j) { - case 0: - cfg.new_misc^=EXPERT; - break; - case 1: - cfg.new_misc^=UPAUSE; - break; - case 2: - cfg.new_misc^=SPIN; - break; - case 3: - cfg.new_misc^=CLRSCRN; - break; - case 4: - cfg.new_misc^=ASK_NSCAN; - break; - case 5: - cfg.new_misc^=ASK_SSCAN; - break; - case 6: - cfg.new_misc^=ANFSCAN; - break; - case 7: - cfg.new_misc^=CURSUB; - break; - case 8: - cfg.new_misc^=BATCHFLAG; - break; - case 9: - cfg.new_misc^=EXTDESC; - break; - case 10: - cfg.new_misc^=COLDKEYS; - break; - case 11: - cfg.new_misc^=AUTOHANG; - break; - - } - } + cfg.sys_timezone=KAB; break; case 15: + cfg.sys_timezone=KAR; + break; + case 16: + cfg.sys_timezone=BOM; + break; + case 17: + cfg.sys_timezone=KAT; + break; + case 18: + cfg.sys_timezone=DHA; + break; + case 19: + cfg.sys_timezone=BAN; + break; + case 20: + cfg.sys_timezone=HON; + break; + case 21: + cfg.sys_timezone=TOK; + break; + case 22: + cfg.sys_timezone=SYD; + break; + case 23: + cfg.sys_timezone=NOU; + break; + case 24: + cfg.sys_timezone=WEL; + break; + default: + if(cfg.sys_timezone>720 || cfg.sys_timezone<-720) + cfg.sys_timezone=0; + if(cfg.sys_timezone==0) + str[0]=0; + else + sprintf(str,"%02d:%02d" + ,cfg.sys_timezone/60,cfg.sys_timezone<0 + ? (-cfg.sys_timezone)%60 : cfg.sys_timezone%60); uifc.helpbuf= - "`New User Question Toggle Options:`\n" + "`Time Zone Offset:`\n" "\n" - "This menu allows you to decide which questions will be asked of a new\n" - "user.\n" - ; - j=0; - k=0; - while(1) { - i=0; - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Real Name" - ,cfg.uq&UQ_REALNAME ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Force Unique Real Name" - ,cfg.uq&UQ_DUPREAL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Force Upper/Lower Case" - ,cfg.uq&UQ_NOUPRLWR ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Company Name" - ,cfg.uq&UQ_COMPANY ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Chat Handle / Call Sign" - ,cfg.uq&UQ_HANDLE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Force Unique Handle / Call Sign" - ,cfg.uq&UQ_DUPHAND ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"E-mail/NetMail Address" - ,cfg.uq&UQ_NONETMAIL ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Sex (Gender)" - ,cfg.uq&UQ_SEX ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Birthday" - ,cfg.uq&UQ_BIRTH ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Address and Zip Code" - ,cfg.uq&UQ_ADDRESS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Location" - ,cfg.uq&UQ_LOCATION ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Require Comma in Location" - ,cfg.uq&UQ_NOCOMMAS ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Phone Number" - ,cfg.uq&UQ_PHONE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Allow EX-ASCII in Answers" - ,cfg.uq&UQ_NOEXASC ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"External Editor" - ,cfg.uq&UQ_XEDIT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Command Shell" - ,cfg.uq&UQ_CMDSHELL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Default Settings" - ,cfg.uq&UQ_NODEF ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Color Terminal" - ,cfg.uq&UQ_COLORTERM ? "Yes":"No"); - opt[i][0]=0; - j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k - ,"New User Questions",opt); - if(j==-1) - break; - uifc.changes=1; - switch(j) { - case 0: - cfg.uq^=UQ_REALNAME; - break; - case 1: - cfg.uq^=UQ_DUPREAL; - break; - case 2: - cfg.uq^=UQ_NOUPRLWR; - break; - case 3: - cfg.uq^=UQ_COMPANY; - break; - case 4: - cfg.uq^=UQ_HANDLE; - break; - case 5: - cfg.uq^=UQ_DUPHAND; - break; - case 6: - cfg.uq^=UQ_NONETMAIL; - break; - case 7: - cfg.uq^=UQ_SEX; - break; - case 8: - cfg.uq^=UQ_BIRTH; - break; - case 9: - cfg.uq^=UQ_ADDRESS; - break; - case 10: - cfg.uq^=UQ_LOCATION; - break; - case 11: - cfg.uq^=UQ_NOCOMMAS; - break; - case 12: - cfg.uq^=UQ_PHONE; - break; - case 13: - cfg.uq^=UQ_NOEXASC; - break; - case 14: - cfg.uq^=UQ_XEDIT; - break; - case 15: - cfg.uq^=UQ_CMDSHELL; - break; - case 16: - cfg.uq^=UQ_NODEF; - break; - case 17: - cfg.uq^=UQ_COLORTERM; - break; - } - } - break; - } - } - break; - case 11: /* Advanced Options */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","New User Magic Word",cfg.new_magic); - sprintf(opt[i++],"%-27.27s%.40s","Data Directory" - ,cfg.data_dir); - sprintf(opt[i++],"%-27.27s%.40s","Logs Directory" - ,cfg.logs_dir); - sprintf(opt[i++],"%-27.27s%.40s","Exec Directory" - ,cfg.exec_dir); - sprintf(opt[i++],"%-27.27s%.40s","Mods Directory" - ,cfg.mods_dir); - sprintf(opt[i++],"%-27.27s%s","Input SIF Questionnaire" - ,cfg.new_sif); - sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire" - ,cfg.new_sof); - ultoac(cfg.cdt_per_dollar,str); - sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str); - sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits" - ,cfg.cdt_min_value); - sprintf(opt[i++],"%-27.27s%s","Maximum Number of Minutes" - ,cfg.max_minutes ? ultoa(cfg.max_minutes,tmp,10) : "Unlimited"); - sprintf(opt[i++],"%-27.27s%u","Warning Days Till Expire" - ,cfg.sys_exp_warn); - sprintf(opt[i++],"%-27.27s%u","Last Displayable Node" - ,cfg.sys_lastnode); - sprintf(opt[i++],"%-27.27s%s","Phone Number Format" - ,cfg.sys_phonefmt); - sprintf(opt[i++],"%-27.27s%.40s","Sysop Chat Override" - ,cfg.sys_chat_arstr); - if(cfg.user_backup_level) - sprintf(str,"%hu",cfg.user_backup_level); - else - strcpy(str,"None"); - sprintf(opt[i++],"%-27.27s%s","User Database Backups",str); - if(cfg.mail_backup_level) - sprintf(str,"%hu",cfg.mail_backup_level); - else - strcpy(str,"None"); - sprintf(opt[i++],"%-27.27s%s","Mail Database Backups",str); - sprintf(opt[i++],"%-27.27s%"PRIX32,"Control Key Pass-through" - ,cfg.ctrlkey_passthru); - opt[i][0]=0; - uifc.helpbuf= - "`System Advanced Options:`\n" - "\n" - "Care should be taken when modifying any of the options listed here.\n" - ; - switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&adv_dflt,0 - ,"Advanced Options",opt)) { - case -1: - done=1; - break; - - case 0: - uifc.helpbuf= - "`New User Magic Word:`\n" - "\n" - "If this field has a value, it is assumed the sysop has placed some\n" - "reference to this `magic word` in `text/newuser.msg` and new users\n" - "will be prompted for the magic word after they enter their password.\n" - "If they do not enter it correctly, it is assumed they didn't read the\n" - "new user information displayed to them and they are disconnected.\n" - "\n" - "Think of it as a password to guarantee that new users read the text\n" - "displayed to them.\n" - ; - uifc.input(WIN_MID,0,0,"New User Magic Word",cfg.new_magic,sizeof(cfg.new_magic)-1 - ,K_EDIT|K_UPPER); - break; - case 1: - uifc.helpbuf= - "`Data File Directory:`\n" - "\n" - "The Synchronet data directory contains almost all the data for your BBS.\n" - "This directory must be located where `ALL` nodes can access it and\n" - "`MUST NOT` be placed on a RAM disk or other volatile media.\n" - "\n" - "This option allows you to change the location of your data directory.\n" - ; - strcpy(str,cfg.data_dir); - if(uifc.input(WIN_MID|WIN_SAV,0,9,"Data Directory" - ,str,sizeof(cfg.data_dir)-1,K_EDIT)>0) { - backslash(str); - SAFECOPY(cfg.data_dir,str); - } - break; - case 2: - uifc.helpbuf= - "`Log File Directory:`\n" - "\n" - "Log files will be stored in this directory.\n" - ; - strcpy(str,cfg.logs_dir); - if(uifc.input(WIN_MID|WIN_SAV,0,9,"Logs Directory" - ,str,sizeof(cfg.logs_dir)-1,K_EDIT)>0) { - backslash(str); - SAFECOPY(cfg.logs_dir,str); - } - break; - case 3: - uifc.helpbuf= - "`Executable/Module File Directory:`\n" - "\n" - "The Synchronet exec directory contains executable files that your BBS\n" - "executes. This directory does `not` need to be in your DOS search path.\n" - "If you place programs in this directory for the BBS to execute, you\n" - "should place the `%!` abbreviation for the exec directory at the\n" - "beginning of the configured command-lines.\n" - "\n" - "This option allows you to change the location of your exec directory.\n" - ; - strcpy(str,cfg.exec_dir); - if(uifc.input(WIN_MID|WIN_SAV,0,9,"Exec Directory" - ,str,sizeof(cfg.exec_dir)-1,K_EDIT)>0) { - backslash(str); - SAFECOPY(cfg.exec_dir,str); - } - break; - case 4: - uifc.helpbuf= - "`Modified Modules Directory:`\n" - "\n" - "This optional directory can be used to specify a location where modified\n" - "module files are stored. These modified modules will take precedence over\n" - "stock modules with the same filename (in the exec directory) and will\n" - "not be overwritten by future updates/upgrades.\n" - "\n" - "If this directory is `blank`, then this feature is not used and all modules\n" - "are assumed to be located in the `exec` directory.\n" - ; - strcpy(str,cfg.mods_dir); - if(uifc.input(WIN_MID|WIN_SAV,0,9,"Mods Directory" - ,str,sizeof(cfg.mods_dir)-1,K_EDIT)>0) { - backslash(str); - SAFECOPY(cfg.mods_dir,str); - } - break; - case 5: - strcpy(str,cfg.new_sif); - uifc.helpbuf= - "`SIF Questionnaire for User Input:`\n" - "\n" - "This is the name of a SIF questionnaire file that resides your text\n" - "directory that all users will be prompted to answer.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"SIF Questionnaire for User Input" - ,str,LEN_CODE,K_UPPER|K_EDIT); - if(!str[0] || code_ok(str)) - strcpy(cfg.new_sif,str); - else - uifc.msg("Invalid SIF Name"); - break; - case 6: - strcpy(str,cfg.new_sof); - uifc.helpbuf= - "`SIF Questionnaire for Reviewing User Input:`\n" - "\n" - "This is the SIF file used to review the input of users from the user\n" - "edit function.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"SIF Questionnaire for Reviewing User Input" - ,str,LEN_CODE,K_EDIT); - if(!str[0] || code_ok(str)) - strcpy(cfg.new_sof,str); - else - uifc.msg("Invalid SIF Name"); - break; - case 7: - uifc.helpbuf= - "`Credits Per Dollar:`\n" - "\n" - "This is the monetary value of a credit (How many credits per dollar).\n" - "This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.)\n" - "since credits are usually converted by 100 kilobyte (102400) blocks.\n" - "To make a dollar worth two megabytes of credits, set this value to\n" - "2,097,152 (a megabyte is 1024*1024 or 1048576).\n" - ; - ultoa(cfg.cdt_per_dollar,str,10); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Credits Per Dollar",str,10,K_NUMBER|K_EDIT); - cfg.cdt_per_dollar=atol(str); - break; - case 8: - uifc.helpbuf= - "`Minutes Per 100K Credits:`\n" - "\n" - "This is the value of a minute of time online. This field is the number\n" - "of minutes to give the user in exchange for each 100K credit block.\n" - ; - sprintf(str,"%u",cfg.cdt_min_value); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Minutes Per 100K Credits",str,5,K_NUMBER|K_EDIT); - cfg.cdt_min_value=atoi(str); - break; - case 9: - uifc.helpbuf= - "`Maximum Number of Minutes User Can Have:`\n" - "\n" - "This value is the maximum total number of minutes a user can have. If a\n" - "user has this number of minutes or more, they will not be allowed to\n" - "convert credits into minutes. A sysop can add minutes to a user's\n" - "account regardless of this maximum. If this value is set to `0`, users\n" - "will have no limit on the total number of minutes they can have.\n" - ; - sprintf(str,"%"PRIu32,cfg.max_minutes); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Maximum Number of Minutes a User Can Have " - "(0=No Limit)" - ,str,10,K_NUMBER|K_EDIT); - cfg.max_minutes=atol(str); - break; - case 10: - uifc.helpbuf= - "`Warning Days Till Expire:`\n" - "\n" - "If a user's account will expire in this many days or less, the user will\n" - "be notified at logon. Setting this value to `0` disables the warning\n" - "completely.\n" - ; - sprintf(str,"%u",cfg.sys_exp_warn); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Warning Days Till Expire",str,5,K_NUMBER|K_EDIT); - cfg.sys_exp_warn=atoi(str); - break; - case 11: - uifc.helpbuf= - "`Last Displayed Node:`\n" - "\n" - "This is the number of the last node to display to users in node lists.\n" - "This allows the sysop to define the higher numbered nodes as `invisible`\n" - "to users.\n" - ; - sprintf(str,"%u",cfg.sys_lastnode); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Last Displayed Node",str,5,K_NUMBER|K_EDIT); - cfg.sys_lastnode=atoi(str); - break; - case 12: - uifc.helpbuf= - "`Phone Number Format:`\n" - "\n" - "This is the format used for phone numbers in your local calling\n" - "area. Use `N` for number positions, `A` for alphabetic, or `!` for any\n" - "character. All other characters will be static in the phone number\n" - "format. An example for North American phone numbers is `NNN-NNN-NNNN`.\n" + "Enter your local time zone offset from Universal Time (UTC/GMT)\n" + "in `HH:MM` format.\n" ; uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Phone Number Format",cfg.sys_phonefmt - ,LEN_PHONE,K_UPPER|K_EDIT); - break; - case 13: - getar("Sysop Chat Override",cfg.sys_chat_arstr); + ,"Time (HH:MM) East (+) or West (-) of Universal " + "Time" + ,str,6,K_EDIT|K_UPPER); + cfg.sys_timezone=atoi(str)*60; + char *p=strchr(str,':'); + if(p) { + if(cfg.sys_timezone<0) + cfg.sys_timezone-=atoi(p+1); + else + cfg.sys_timezone+=atoi(p+1); + } break; - case 14: - uifc.helpbuf= - "`User Database Backups:`\n" - "\n" - "Setting this option to anything but 0 will enable automatic daily\n" - "backups of the user database. This number determines how many backups\n" - "to keep on disk.\n" - ; - sprintf(str,"%u",cfg.user_backup_level); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Number of Daily User Database Backups to Keep" - ,str,4,K_NUMBER|K_EDIT); - cfg.user_backup_level=atoi(str); - break; - case 15: - uifc.helpbuf= - "`Mail Database Backups:`\n" - "\n" - "Setting this option to anything but 0 will enable automatic daily\n" - "backups of the mail database. This number determines how many backups\n" - "to keep on disk.\n" - ; - sprintf(str,"%u",cfg.mail_backup_level); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Number of Daily Mail Database Backups to Keep" - ,str,4,K_NUMBER|K_EDIT); - cfg.mail_backup_level=atoi(str); - break; - case 16: - uifc.helpbuf= - "`Control Key Pass-through:`\n" - "\n" - "This value is a 32-bit hexadecimal number. Each set bit represents a\n" - "control key combination that will `not` be handled internally by\n" - "Synchronet or by a Global Hot Key Event.\n" - "\n" - "To disable internal handling of the `Ctrl-C` key combination (for example)\n" - "set this value to `8`. The value is determined by taking 2 to the power of\n" - "the ASCII value of the control character (Ctrl-A is 1, Ctrl-B is 2, \n" - "etc.). In the case of Ctrl-C, taking 2 to the power of 3 equals 8.\n" - "\n" - "To pass-through multiple control key combinations, multiple bits must be\n" - "set (or'd together) to create the necessary value, which may require the\n" - "use of a hexadecimal calculator.\n" - "\n" - "If unsure, leave this value set to `0`, the default.\n" - ; - sprintf(str,"%"PRIX32,cfg.ctrlkey_passthru); - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Control Key Pass-through" - ,str,8,K_UPPER|K_EDIT); - cfg.ctrlkey_passthru=strtoul(str,NULL,16); - break; - } } break; - case 12: /* Loadable Modules */ - done=0; - k=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-16.16s%s","Login",cfg.login_mod); - sprintf(opt[i++],"%-16.16s%s","Logon",cfg.logon_mod); - sprintf(opt[i++],"%-16.16s%s","Sync",cfg.sync_mod); - sprintf(opt[i++],"%-16.16s%s","Logoff",cfg.logoff_mod); - sprintf(opt[i++],"%-16.16s%s","Logout",cfg.logout_mod); - sprintf(opt[i++],"%-16.16s%s","New User",cfg.newuser_mod); - sprintf(opt[i++],"%-16.16s%s","Expired User",cfg.expire_mod); - sprintf(opt[i++],"%-16.16s%s","Read Mail",cfg.readmail_mod); - sprintf(opt[i++],"%-16.16s%s","Scan Msgs",cfg.scanposts_mod); - sprintf(opt[i++],"%-16.16s%s","Scan Subs",cfg.scansubs_mod); - opt[i][0]=0; + case 3: uifc.helpbuf= - "`Loadable Modules:`\n" + "`System Operator:`\n" "\n" - "Baja modules (`.bin` files) or JavaScript modules (`.js` files) can be\n" - "automatically loaded and executed during certain Terminal Server\n" - "operations. The name (root filename) of the module can be specified for\n" - "each of the available operations listed below:\n" + "This is the name or alias of the system operator. This does not have to\n" + "be the same as user #1. This field is used for informational purposes\n" + "only.\n" + ; + uifc.input(WIN_MID,0,0,"System Operator",cfg.sys_op,sizeof(cfg.sys_op)-1,K_EDIT); + break; + case 4: + uifc.helpbuf= + "`System Password:`\n" "\n" - "`Login` Required module for interactive terminal logins (answer)\n" - "`Logon` Executed during terminal logon procedure\n" - "`Sync` Executed when terminal nodes are periodically synchronized\n" - "`Logoff` Executed during terminal logoff procedure (interactive)\n" - "`Logout` Executed during terminal logout procedure (offline)\n" - "`New User` Executed at end of new terminal user creation process\n" - "`Expired User` Executed during daily event when user expires (offline)\n" + "This is an extra security password required for sysop logon and certain\n" + "sysop functions. This password should be something not easily guessed\n" + "and should be kept absolutely confidential. This password must be\n" + "entered at the Terminal Server `SY:` prompt.\n" + ; + uifc.input(WIN_MID,0,0,"System Password",cfg.sys_pass,sizeof(cfg.sys_pass)-1,K_EDIT|K_UPPER); + break; + case 5: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=1; + uifc.helpbuf= + "`Allow Users to Change Their Password:`\n" "\n" - "Full module command-lines may be used for the operations listed below:\n" + "If you want the users of your system to have the option of changing\n" + "their password to a string of their choice, set this option to `Yes`.\n" + "For the highest level of security, set this option to `No.`\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Change Their Password",opt); + if(!i && !(cfg.sys_misc&SM_PWEDIT)) { + cfg.sys_misc|=SM_PWEDIT; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_PWEDIT) { + cfg.sys_misc&=~SM_PWEDIT; + uifc.changes=1; + } + i=0; + uifc.helpbuf= + "`Force Periodic Password uifc.changes:`\n" "\n" - "`Read Mail` Executed when a user reads email/netmail\n" - "`Scan Msgs` Executed when a user reads or scans a message sub-board\n" - "`Scan Subs` Executed when a user scans one or more sub-boards for msgs\n" + "If you want your users to be forced to change their passwords\n" + "periodically, select `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Force Periodic Password Changes",opt); + if(!i) { + ultoa(cfg.sys_pwdays,str,10); + uifc.helpbuf= + "`Maximum Days Between Password uifc.changes:`\n" "\n" - "`Note:` JavaScript modules take precedence over Baja modules if both exist\n" - "in your `exec` or `mods` directories.\n" + "Enter the maximum number of days allowed between password uifc.changes.\n" + "If a user has not voluntarily changed his or her password in this\n" + "many days, he or she will be forced to change their password upon\n" + "logon.\n" ; - switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,32,&k,0 - ,"Loadable Modules",opt)) { - - case -1: - done=1; - break; - - case 0: - uifc.input(WIN_MID|WIN_SAV,0,0,"Login Module" - ,cfg.login_mod,sizeof(cfg.login_mod)-1,K_EDIT); - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Module" - ,cfg.logon_mod,sizeof(cfg.logon_mod)-1,K_EDIT); - break; - case 2: - uifc.input(WIN_MID|WIN_SAV,0,0,"Synchronize Module" - ,cfg.sync_mod,sizeof(cfg.sync_mod)-1,K_EDIT); - break; - case 3: - uifc.input(WIN_MID|WIN_SAV,0,0,"Logoff Module" - ,cfg.logoff_mod,sizeof(cfg.logoff_mod)-1,K_EDIT); - break; - case 4: - uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Module" - ,cfg.logout_mod,sizeof(cfg.logout_mod)-1,K_EDIT); - break; - case 5: - uifc.input(WIN_MID|WIN_SAV,0,0,"New User Module" - ,cfg.newuser_mod,sizeof(cfg.newuser_mod)-1,K_EDIT); - break; - case 6: - uifc.input(WIN_MID|WIN_SAV,0,0,"Expired User Module" - ,cfg.expire_mod,sizeof(cfg.expire_mod)-1,K_EDIT); - break; - case 7: - uifc.input(WIN_MID|WIN_SAV,0,0,"Read Mail Command" - ,cfg.readmail_mod,sizeof(cfg.readmail_mod)-1,K_EDIT); - break; - case 8: - uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Msgs Command" - ,cfg.scanposts_mod,sizeof(cfg.scanposts_mod)-1,K_EDIT); - break; - case 9: - uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Subs Command" - ,cfg.scansubs_mod,sizeof(cfg.scansubs_mod)-1,K_EDIT); - break; - } - } - break; - - case 13: /* Security Levels */ - dflt=bar=0; - k=0; - while(1) { - for(i=0;i<100;i++) { - sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L); - sprintf(opt[i],"%-2d %5d %5d " - "%5d %5d %5d %5d %6s %7s %2u",i - ,cfg.level_timeperday[i],cfg.level_timepercall[i] - ,cfg.level_callsperday[i],cfg.level_emailperday[i] - ,cfg.level_postsperday[i],cfg.level_linespermsg[i] - ,tmp - ,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Val Set" : "Level" - ,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ? - cfg.level_expireto[i] : cfg.expired_level); + uifc.input(WIN_MID,0,0,"Maximum Days Between Password Changes" + ,str,5,K_NUMBER|K_EDIT); + cfg.sys_pwdays=atoi(str); } - opt[i][0]=0; - i=0; + else if(i==1 && cfg.sys_pwdays) { + cfg.sys_pwdays=0; + uifc.changes=1; + } + + break; + case 6: + sprintf(str,"%u",cfg.sys_deldays); + uifc.helpbuf= + "`Days Since Last Logon to Preserve Deleted Users:`\n" + "\n" + "Deleted user slots can be `undeleted` until the slot is written over\n" + "by a new user. If you want deleted user slots to be preserved for period\n" + "of time since their last logon, set this value to the number of days to\n" + "keep new users from taking over a deleted user's slot.\n" + ; + uifc.input(WIN_MID,0,0,"Days Since Last Logon to Preserve Deleted Users" + ,str,5,K_EDIT|K_NUMBER); + cfg.sys_deldays=atoi(str); + break; + case 7: + sprintf(str,"%u",cfg.sys_autodel); uifc.helpbuf= - "`Security Level Values:`\n" + "`Maximum Days of Inactivity Before Auto-Deletion:`\n" "\n" - "This menu allows you to change the security options for every possible\n" - "security level from 0 to 99. The available options for each level are:\n" + "If you want users that haven't logged on in certain period of time to\n" + "be automatically deleted, set this value to the maximum number of days\n" + "of inactivity before the user is deleted. Setting this value to `0`\n" + "disables this feature.\n" "\n" - " Time Per Day Maximum online time per day\n" - " Time Per Call Maximum online time per call\n" - " Calls Per Day Maximum number of calls per day\n" - " Email Per Day Maximum number of email per day\n" - " Posts Per Day Maximum number of posts per day\n" - " Lines Per Message Maximum number of lines per message\n" - " Free Credits Per Day Number of free credits per day\n" - " Expire To Level or validation set to Expire to\n" + "Users with the `P` exemption will not be deleted due to inactivity.\n" ; - i=uifc.list(WIN_RHT|WIN_ACT,0,3,0,&dflt,&bar - ,"Level T/D T/C C/D E/D P/D L/M F/D " - "Expire To",opt); - if(i==-1) - break; - while(1) { - sprintf(str,"Security Level %d Values",i); - j=0; - sprintf(opt[j++],"%-22.22s%-5u","Time Per Day" - ,cfg.level_timeperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Time Per Call" - ,cfg.level_timepercall[i]); - sprintf(opt[j++],"%-22.22s%-5u","Calls Per Day" - ,cfg.level_callsperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Email Per Day" - ,cfg.level_emailperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Posts Per Day" - ,cfg.level_postsperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Lines Per Message" - ,cfg.level_linespermsg[i]); - sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L); - sprintf(opt[j++],"%-22.22s%-6s","Free Credits Per Day" - ,tmp); - sprintf(opt[j++],"%-22.22s%s %u","Expire To" - ,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Validation Set" - : "Level" - ,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ? - cfg.level_expireto[i] : cfg.expired_level); - opt[j][0]=0; - j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0 - ,str,opt); - if(j==-1) - break; - switch(j) { + uifc.input(WIN_MID,0,0,"Maximum Days of Inactivity Before Auto-Deletion" + ,str,5,K_EDIT|K_NUMBER); + cfg.sys_autodel=atoi(str); + break; + case 8: + uifc.helpbuf= + "`New User Password:`\n" + "\n" + "If you want callers to only be able to logon as `New` if they know a\n" + "certain password, enter that password here. If you want any caller to\n" + "be able to logon as New, leave this option blank.\n" + ; + uifc.input(WIN_MID,0,0,"New User Password",cfg.new_pass,sizeof(cfg.new_pass)-1 + ,K_EDIT|K_UPPER); + break; + case 9: /* Toggle Options */ + done=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-33.33s%s","Allow Aliases" + ,cfg.uq&UQ_ALIASES ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Allow Time Banking" + ,cfg.sys_misc&SM_TIMEBANK ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Allow Credit Conversions" + ,cfg.sys_misc&SM_NOCDTCVT ? "No" : "Yes"); + sprintf(opt[i++],"%-33.33s%s","Allow Sysop Logins" + ,cfg.sys_misc&SM_R_SYSOP ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Display/Log Passwords Locally" + ,cfg.sys_misc&SM_ECHO_PW ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Short Sysop Page" + ,cfg.sys_misc&SM_SHRTPAGE ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Include Sysop in Statistics" + ,cfg.sys_misc&SM_SYSSTAT ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Closed to New Users" + ,cfg.sys_misc&SM_CLOSED ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Use Location in User Lists" + ,cfg.sys_misc&SM_LISTLOC ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Military (24 hour) Time Format" + ,cfg.sys_misc&SM_MILITARY ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","European Date Format (DD/MM/YY)" + ,cfg.sys_misc&SM_EURODATE ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","User Expires When Out-of-time" + ,cfg.sys_misc&SM_TIME_EXP ? "Yes" : "No"); + sprintf(opt[i++],"%-33.33s%s","Display Sys Info During Logon" + ,cfg.sys_misc&SM_NOSYSINFO ? "No" : "Yes"); + sprintf(opt[i++],"%-33.33s%s","Display Node List During Logon" + ,cfg.sys_misc&SM_NONODELIST ? "No" : "Yes"); + opt[i][0]=0; + uifc.helpbuf= + "`System Toggle Options:`\n" + "\n" + "This is a menu of system related options that can be toggled between\n" + "two or more states, such as `Yes` and `No`.\n" + ; + switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,41,&tog_dflt,0 + ,"Toggle Options",opt)) { + case -1: + done=1; + break; case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Total Time Allowed Per Day" - ,ultoa(cfg.level_timeperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - cfg.level_timeperday[i]=atoi(tmp); - if(cfg.level_timeperday[i]>1440) - cfg.level_timeperday[i]=1440; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.uq&UQ_ALIASES ? 0:1; + uifc.helpbuf= + "`Allow Users to Use Aliases:`\n" + "\n" + "If you want the users of your system to be allowed to be known by a\n" + "false name, handle, or alias, set this option to `Yes`. If you want all\n" + "users on your system to be known only by their real names, select `No`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Use Aliases",opt); + if(!i && !(cfg.uq&UQ_ALIASES)) { + cfg.uq|=UQ_ALIASES; + uifc.changes=1; + } + else if(i==1 && cfg.uq&UQ_ALIASES) { + cfg.uq&=~UQ_ALIASES; + uifc.changes=1; + } break; case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Time Allowed Per Call" - ,ultoa(cfg.level_timepercall[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - cfg.level_timepercall[i]=atoi(tmp); - if(cfg.level_timepercall[i]>1440) - cfg.level_timepercall[i]=1440; - break; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_TIMEBANK ? 0:1; + uifc.helpbuf= + "`Allow Time Banking:`\n" + "\n" + "If you want the users of your system to be allowed to be deposit\n" + "any extra time they may have left during a call into their minute bank,\n" + "set this option to `Yes`. If this option is set to `No`, then the only\n" + "way a user may get minutes in their minute bank is to purchase them\n" + "with credits.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Depost Time in Minute Bank",opt); + if(!i && !(cfg.sys_misc&SM_TIMEBANK)) { + cfg.sys_misc|=SM_TIMEBANK; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_TIMEBANK) { + cfg.sys_misc&=~SM_TIMEBANK; + uifc.changes=1; + } + break; case 2: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Calls Allowed Per Day" - ,ultoa(cfg.level_callsperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - cfg.level_callsperday[i]=atoi(tmp); - break; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_NOCDTCVT ? 1:0; + uifc.helpbuf= + "`Allow Credits to be Converted into Minutes:`\n" + "\n" + "If you want the users of your system to be allowed to be convert\n" + "any credits they may have into minutes for their minute bank,\n" + "set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Users to Convert Credits into Minutes" + ,opt); + if(!i && cfg.sys_misc&SM_NOCDTCVT) { + cfg.sys_misc&=~SM_NOCDTCVT; + uifc.changes=1; + } + else if(i==1 && !(cfg.sys_misc&SM_NOCDTCVT)) { + cfg.sys_misc|=SM_NOCDTCVT; + uifc.changes=1; + } + break; case 3: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Email Allowed Per Day" - ,ultoa(cfg.level_emailperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - cfg.level_emailperday[i]=atoi(tmp); - break; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_R_SYSOP ? 0:1; + uifc.helpbuf= + "`Allow Sysop Logins:`\n" + "\n" + "If you want to be able to login with sysop access, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Allow Sysop Logins",opt); + if(!i && !(cfg.sys_misc&SM_R_SYSOP)) { + cfg.sys_misc|=SM_R_SYSOP; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_R_SYSOP) { + cfg.sys_misc&=~SM_R_SYSOP; + uifc.changes=1; + } + break; case 4: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Posts Allowed Per Day" - ,ultoa(cfg.level_postsperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - cfg.level_postsperday[i]=atoi(tmp); - break; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_ECHO_PW ? 0:1; + uifc.helpbuf= + "`Display/Log Passwords Locally:`\n" + "\n" + "If you want to passwords to be displayed locally and/or logged to disk\n" + "(e.g. when there's a failed login attempt), set this option to `Yes`.\n" + "\n" + "For elevated security, set this option to `No`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Display/Log Passwords Locally",opt); + if(!i && !(cfg.sys_misc&SM_ECHO_PW)) { + cfg.sys_misc|=SM_ECHO_PW; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_ECHO_PW) { + cfg.sys_misc&=~SM_ECHO_PW; + uifc.changes=1; + } + break; case 5: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Lines Allowed Per Message (Post/E-mail)" - ,ultoa(cfg.level_linespermsg[i],tmp,10),5 - ,K_NUMBER|K_EDIT); - cfg.level_linespermsg[i]=atoi(tmp); + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_SHRTPAGE ? 0:1; + uifc.helpbuf= + "`Short Sysop Page:`\n" + "\n" + "If you would like the sysop page to be a short series of beeps rather\n" + "than continuous random tones, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Short Sysop Page" + ,opt); + if(i==1 && cfg.sys_misc&SM_SHRTPAGE) { + cfg.sys_misc&=~SM_SHRTPAGE; + uifc.changes=1; + } + else if(!i && !(cfg.sys_misc&SM_SHRTPAGE)) { + cfg.sys_misc|=SM_SHRTPAGE; + uifc.changes=1; + } break; case 6: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Free Credits Per Day (in Kilobytes)" - ,ultoa(cfg.level_freecdtperday[i]/1024L,tmp,10),8 - ,K_EDIT|K_UPPER); - cfg.level_freecdtperday[i]=atol(tmp)*1024L; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_SYSSTAT ? 0:1; + uifc.helpbuf= + "`Include Sysop Activity in System Statistics:`\n" + "\n" + "If you want sysops to be included in the statistical data of the BBS,\n" + "set this option to `Yes`. The suggested setting for this option is\n" + "`No` so that statistical data will only reflect user usage and not\n" + "include sysop maintenance activity.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Include Sysop Activity in System Statistics" + ,opt); + if(!i && !(cfg.sys_misc&SM_SYSSTAT)) { + cfg.sys_misc|=SM_SYSSTAT; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_SYSSTAT) { + cfg.sys_misc&=~SM_SYSSTAT; + uifc.changes=1; + } break; case 7: - j=0; - sprintf(opt[j++],"Default Expired Level " - "(Currently %u)",cfg.expired_level); - sprintf(opt[j++],"Specific Level"); - sprintf(opt[j++],"Quick-Validation Set"); - opt[j][0]=0; - j=0; - sprintf(str,"Level %u Expires To",i); - j=uifc.list(WIN_SAV,2,1,0,&j,0 - ,str,opt); - if(j==-1) - break; - if(j==0) { - cfg.level_misc[i]&= - ~(LEVEL_EXPTOLVL|LEVEL_EXPTOVAL); - uifc.changes=1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_CLOSED ? 0:1; + uifc.helpbuf= + "`Closed to New Users:`\n" + "\n" + "If you want callers to be able to logon as `New`, set this option to `No`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Closed to New Users",opt); + if(!i && !(cfg.sys_misc&SM_CLOSED)) { + cfg.sys_misc|=SM_CLOSED; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_CLOSED) { + cfg.sys_misc&=~SM_CLOSED; + uifc.changes=1; + } + break; + case 8: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_LISTLOC ? 0:1; + uifc.helpbuf= + "`User Location in User Lists:`\n" + "\n" + "If you want user locations (city, state) displayed in the user lists,\n" + "set this option to `Yes`. If this option is set to `No`, the user notes\n" + "(if they exist) are displayed in the user lists.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"User Location (Instead of Note) in User Lists" + ,opt); + if(!i && !(cfg.sys_misc&SM_LISTLOC)) { + cfg.sys_misc|=SM_LISTLOC; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_LISTLOC) { + cfg.sys_misc&=~SM_LISTLOC; + uifc.changes=1; + } + break; + case 9: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_MILITARY ? 0:1; + uifc.helpbuf= + "`Military:`\n" + "\n" + "If you would like the time-of-day to be displayed and entered in 24 hour\n" + "format always, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Use Military Time Format",opt); + if(!i && !(cfg.sys_misc&SM_MILITARY)) { + cfg.sys_misc|=SM_MILITARY; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_MILITARY) { + cfg.sys_misc&=~SM_MILITARY; + uifc.changes=1; + } + break; + case 10: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_EURODATE ? 0:1; + uifc.helpbuf= + "`European Date Format:`\n" + "\n" + "If you would like dates to be displayed and entered in `DD/MM/YY` format\n" + "instead of `MM/DD/YY` format, set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"European Date Format",opt); + if(!i && !(cfg.sys_misc&SM_EURODATE)) { + cfg.sys_misc|=SM_EURODATE; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_EURODATE) { + cfg.sys_misc&=~SM_EURODATE; + uifc.changes=1; + } + break; + case 11: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_TIME_EXP ? 0:1; + uifc.helpbuf= + "`User Expires When Out-of-time:`\n" + "\n" + "If you want users to be set to `Expired User Values` if they run out of\n" + "time online, then set this option to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"User Expires When Out-of-time",opt); + if(!i && !(cfg.sys_misc&SM_TIME_EXP)) { + cfg.sys_misc|=SM_TIME_EXP; + uifc.changes=1; + } + else if(i==1 && cfg.sys_misc&SM_TIME_EXP) { + cfg.sys_misc&=~SM_TIME_EXP; + uifc.changes=1; + } + break; + case 12: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_NOSYSINFO ? 1:0; + uifc.helpbuf= + "`Display System Information During Logon:`\n" + "\n" + "If you want system information displayed during logon, set this option\n" + "to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Display System Information During Logon",opt); + if(!i && cfg.sys_misc&SM_NOSYSINFO) { + cfg.sys_misc&=~SM_NOSYSINFO; + uifc.changes=1; + } + else if(i==1 && !(cfg.sys_misc&SM_NOSYSINFO)) { + cfg.sys_misc|=SM_NOSYSINFO; + uifc.changes=1; + } + break; + case 13: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=cfg.sys_misc&SM_NONODELIST ? 1:0; + uifc.helpbuf= + "`Display Active Node List During Logon:`\n" + "\n" + "If you want the active nodes displayed during logon, set this option\n" + "to `Yes`.\n" + ; + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Display Active Node List During Logon",opt); + if(!i && cfg.sys_misc&SM_NONODELIST) { + cfg.sys_misc&=~SM_NONODELIST; + uifc.changes=1; + } + else if(i==1 && !(cfg.sys_misc&SM_NONODELIST)) { + cfg.sys_misc|=SM_NONODELIST; + uifc.changes=1; + } + break; + } + } + break; + case 10: /* New User Values */ + done=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%u","Level",cfg.new_level); + sprintf(opt[i++],"%-27.27s%s","Flag Set #1" + ,ltoaf(cfg.new_flags1,str)); + sprintf(opt[i++],"%-27.27s%s","Flag Set #2" + ,ltoaf(cfg.new_flags2,str)); + sprintf(opt[i++],"%-27.27s%s","Flag Set #3" + ,ltoaf(cfg.new_flags3,str)); + sprintf(opt[i++],"%-27.27s%s","Flag Set #4" + ,ltoaf(cfg.new_flags4,str)); + sprintf(opt[i++],"%-27.27s%s","Exemptions" + ,ltoaf(cfg.new_exempt,str)); + sprintf(opt[i++],"%-27.27s%s","Restrictions" + ,ltoaf(cfg.new_rest,str)); + sprintf(opt[i++],"%-27.27s%s","Expiration Days" + ,ultoa(cfg.new_expire,str,10)); + + ultoac(cfg.new_cdt,str); + sprintf(opt[i++],"%-27.27s%s","Credits",str); + ultoac(cfg.new_min,str); + sprintf(opt[i++],"%-27.27s%s","Minutes",str); + sprintf(opt[i++],"%-27.27s%s","Editor" + ,cfg.new_xedit); + sprintf(opt[i++],"%-27.27s%s","Command Shell" + ,cfg.shell[cfg.new_shell]->code); + if(cfg.new_prot!=' ') + sprintf(str,"%c",cfg.new_prot); + else + strcpy(str,"None"); + sprintf(opt[i++],"%-27.27s%s","Download Protocol",str); + sprintf(opt[i++],"%-27.27s%hu","Days of New Messages", cfg.new_msgscan_init); + strcpy(opt[i++],"Default Toggles..."); + strcpy(opt[i++],"Question Toggles..."); + opt[i][0]=0; + uifc.helpbuf= + "`New User Values:`\n" + "\n" + "This menu allows you to determine the default settings for new users.\n" + ; + switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&new_dflt,0 + ,"New User Values",opt)) { + case -1: + done=1; + break; + case 0: + ultoa(cfg.new_level,str,10); + uifc.helpbuf= + "`New User Security Level:`\n" + "\n" + "This is the security level automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level" + ,str,2,K_EDIT|K_NUMBER); + cfg.new_level=atoi(str); + break; + case 1: + truncsp(ltoaf(cfg.new_flags1,str)); + uifc.helpbuf= + "`New User Security Flags:`\n" + "\n" + "These are the security flags automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #1" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.new_flags1=aftol(str); + break; + case 2: + truncsp(ltoaf(cfg.new_flags2,str)); + uifc.helpbuf= + "`New User Security Flags:`\n" + "\n" + "These are the security flags automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #2" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.new_flags2=aftol(str); + break; + case 3: + truncsp(ltoaf(cfg.new_flags3,str)); + uifc.helpbuf= + "`New User Security Flags:`\n" + "\n" + "These are the security flags automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #3" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.new_flags3=aftol(str); + break; + case 4: + truncsp(ltoaf(cfg.new_flags4,str)); + uifc.helpbuf= + "`New User Security Flags:`\n" + "\n" + "These are the security flags automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #4" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.new_flags4=aftol(str); + break; + case 5: + truncsp(ltoaf(cfg.new_exempt,str)); + uifc.helpbuf= + "`New User Exemption Flags:`\n" + "\n" + "These are the exemptions that are automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26 + ,K_EDIT|K_UPPER|K_ALPHA); + cfg.new_exempt=aftol(str); + break; + case 6: + truncsp(ltoaf(cfg.new_rest,str)); + uifc.helpbuf= + "`New User Restriction Flags:`\n" + "\n" + "These are the restrictions that are automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26 + ,K_EDIT|K_UPPER|K_ALPHA); + cfg.new_rest=aftol(str); + break; + case 7: + ultoa(cfg.new_expire,str,10); + uifc.helpbuf= + "`New User Expiration Days:`\n" + "\n" + "If you wish new users to have an automatic expiration date, set this\n" + "value to the number of days before the user will expire. To disable\n" + "New User expiration, set this value to `0`.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Expiration Days",str,4 + ,K_EDIT|K_NUMBER); + cfg.new_expire=atoi(str); + break; + case 8: + ultoa(cfg.new_cdt,str,10); + uifc.helpbuf= + "`New User Credits:`\n" + "\n" + "This is the amount of credits that are automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Credits",str,10 + ,K_EDIT|K_NUMBER); + cfg.new_cdt=atol(str); + break; + case 9: + ultoa(cfg.new_min,str,10); + uifc.helpbuf= + "`New User Minutes:`\n" + "\n" + "This is the number of extra minutes automatically given to new users.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Minutes (Time Credit)" + ,str,10,K_EDIT|K_NUMBER); + cfg.new_min=atol(str); + break; + case 10: + if(!cfg.total_xedits) { + uifc.msg("No External Editors Configured"); break; } - if(j==1) { - cfg.level_misc[i]&=~LEVEL_EXPTOVAL; - cfg.level_misc[i]|=LEVEL_EXPTOLVL; + strcpy(opt[0],"Internal"); + for(i=1;i<=cfg.total_xedits;i++) + strcpy(opt[i],cfg.xedit[i-1]->code); + opt[i][0]=0; + i=0; + uifc.helpbuf= + "`New User Editor:`\n" + "\n" + "You can use this option to select the default editor for new users.\n" + ; + i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0,"Editors",opt); + if(i==-1) + break; + uifc.changes=1; + if(i && i<=cfg.total_xedits) + sprintf(cfg.new_xedit,"%-.8s",cfg.xedit[i-1]->code); + else + cfg.new_xedit[0]=0; + break; + case 11: + for(i=0;i<cfg.total_shells && i<MAX_OPTS;i++) + sprintf(opt[i],"%-.8s",cfg.shell[i]->code); + opt[i][0]=0; + i=0; + uifc.helpbuf= + "`New User Command Shell:`\n" + "\n" + "You can use this option to select the default command shell for new\n" + "users.\n" + ; + i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0 + ,"Command Shells",opt); + if(i==-1) + break; + cfg.new_shell=i; + uifc.changes=1; + break; + case 12: + uifc.helpbuf= + "`New User Default Download Protocol:`\n" + "\n" + "This option allows you to set the default download protocol of new users\n" + "(protocol command key or `BLANK` for no default).\n" + ; + sprintf(str,"%c",cfg.new_prot); + uifc.input(WIN_SAV|WIN_MID,0,0 + ,"Default Download Protocol (SPACE=Disabled)" + ,str,1,K_EDIT|K_UPPER); + cfg.new_prot=str[0]; + if(cfg.new_prot<' ') + cfg.new_prot=' '; + break; + case 13: + uifc.helpbuf= + "`New User Days of New Messages:`\n" + "\n" + "This option allows you to set the number of days worth of messages\n" + "which will be included in the new user's first `new message scan`.\n" + "\n" + "The value `0` means there will be `no` new messages for the new user.\n" + ; + sprintf(str,"%hu",cfg.new_msgscan_init); + uifc.input(WIN_SAV|WIN_MID,0,0 + ,"Days of New Messages for New User's first new message scan" + ,str,4,K_EDIT|K_NUMBER); + cfg.new_msgscan_init=atoi(str); + break; + case 14: + uifc.helpbuf= + "`New User Default Toggle Options:`\n" + "\n" + "This menu contains the default state of new user toggle options. All new\n" + "users on your system will have their defaults set according to the\n" + "settings on this menu. The user can then change them to his or her\n" + "liking.\n" + "\n" + "See the Synchronet User Manual for more information on the individual\n" + "options available.\n" + ; + j=0; + k=0; + while(1) { + i=0; + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Expert Menu Mode" + ,cfg.new_misc&EXPERT ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Screen Pause" + ,cfg.new_misc&UPAUSE ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Spinning Cursor" + ,cfg.new_misc&SPIN ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Clear Screen" + ,cfg.new_misc&CLRSCRN ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Ask For New Scan" + ,cfg.new_misc&ASK_NSCAN ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Ask For Your Msg Scan" + ,cfg.new_misc&ASK_SSCAN ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Automatic New File Scan" + ,cfg.new_misc&ANFSCAN ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Remember Current Sub-board" + ,cfg.new_misc&CURSUB ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Batch Download File Flag" + ,cfg.new_misc&BATCHFLAG ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Extended File Descriptions" + ,cfg.new_misc&EXTDESC ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Hot Keys" + ,cfg.new_misc&COLDKEYS ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Auto Hang-up After Xfer" + ,cfg.new_misc&AUTOHANG ? "Yes":"No"); + opt[i][0]=0; + j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k + ,"Default Toggle Options",opt); + if(j==-1) + break; uifc.changes=1; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Expired Level" - ,ultoa(cfg.level_expireto[i],tmp,10),2 - ,K_EDIT|K_NUMBER); - cfg.level_expireto[i]=atoi(tmp); - break; + switch(j) { + case 0: + cfg.new_misc^=EXPERT; + break; + case 1: + cfg.new_misc^=UPAUSE; + break; + case 2: + cfg.new_misc^=SPIN; + break; + case 3: + cfg.new_misc^=CLRSCRN; + break; + case 4: + cfg.new_misc^=ASK_NSCAN; + break; + case 5: + cfg.new_misc^=ASK_SSCAN; + break; + case 6: + cfg.new_misc^=ANFSCAN; + break; + case 7: + cfg.new_misc^=CURSUB; + break; + case 8: + cfg.new_misc^=BATCHFLAG; + break; + case 9: + cfg.new_misc^=EXTDESC; + break; + case 10: + cfg.new_misc^=COLDKEYS; + break; + case 11: + cfg.new_misc^=AUTOHANG; + break; + + } } - cfg.level_misc[i]&=~LEVEL_EXPTOLVL; - cfg.level_misc[i]|=LEVEL_EXPTOVAL; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Quick-Validation Set to Expire To" - ,ultoa(cfg.level_expireto[i],tmp,10),1 - ,K_EDIT|K_NUMBER); - cfg.level_expireto[i]=atoi(tmp); break; - } - } - } - break; - case 14: /* Expired Acccount Values */ - dflt=0; - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%u","Level",cfg.expired_level); - sprintf(opt[i++],"%-27.27s%s","Flag Set #1 to Remove" - ,ltoaf(cfg.expired_flags1,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #2 to Remove" - ,ltoaf(cfg.expired_flags2,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #3 to Remove" - ,ltoaf(cfg.expired_flags3,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #4 to Remove" - ,ltoaf(cfg.expired_flags4,str)); - sprintf(opt[i++],"%-27.27s%s","Exemptions to Remove" - ,ltoaf(cfg.expired_exempt,str)); - sprintf(opt[i++],"%-27.27s%s","Restrictions to Add" - ,ltoaf(cfg.expired_rest,str)); - opt[i][0]=0; - uifc.helpbuf= - "`Expired Account Values:`\n" - "\n" - "If a user's account expires, the security levels for that account will\n" - "be modified according to the settings of this menu. The `Main Level` and\n" - "`Transfer Level` will be set to the values listed on this menu. The `Main\n" - "Flags`, `Transfer Flags`, and `Exemptions` listed on this menu will be\n" - "removed from the account if they are set. The `Restrictions` listed will\n" - "be added to the account.\n" - ; - switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&dflt,0 - ,"Expired Account Values",opt)) { - case -1: - done=1; - break; - case 0: - ultoa(cfg.expired_level,str,10); - uifc.helpbuf= - "`Expired Account Security Level:`\n" - "\n" - "This is the security level automatically given to expired user accounts.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level" - ,str,2,K_EDIT|K_NUMBER); - cfg.expired_level=atoi(str); - break; - case 1: - truncsp(ltoaf(cfg.expired_flags1,str)); - uifc.helpbuf= - "`Expired Security Flags to Remove:`\n" - "\n" - "These are the security flags automatically removed when a user account\n" - "has expired.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #1" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.expired_flags1=aftol(str); - break; - case 2: - truncsp(ltoaf(cfg.expired_flags2,str)); - uifc.helpbuf= - "`Expired Security Flags to Remove:`\n" - "\n" - "These are the security flags automatically removed when a user account\n" - "has expired.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #2" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.expired_flags2=aftol(str); - break; - case 3: - truncsp(ltoaf(cfg.expired_flags3,str)); - uifc.helpbuf= - "`Expired Security Flags to Remove:`\n" - "\n" - "These are the security flags automatically removed when a user account\n" - "has expired.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #3" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.expired_flags3=aftol(str); - break; - case 4: - truncsp(ltoaf(cfg.expired_flags4,str)); - uifc.helpbuf= - "`Expired Security Flags to Remove:`\n" - "\n" - "These are the security flags automatically removed when a user account\n" - "has expired.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #4" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - cfg.expired_flags4=aftol(str); - break; - case 5: - truncsp(ltoaf(cfg.expired_exempt,str)); - uifc.helpbuf= - "`Expired Exemption Flags to Remove:`\n" - "\n" - "These are the exemptions that are automatically removed from a user\n" - "account if it expires.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - cfg.expired_exempt=aftol(str); - break; - case 6: - truncsp(ltoaf(cfg.expired_rest,str)); - uifc.helpbuf= - "`Expired Restriction Flags to Add:`\n" - "\n" - "These are the restrictions that are automatically added to a user\n" - "account if it expires.\n" - ; - uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - cfg.expired_rest=aftol(str); + case 15: + uifc.helpbuf= + "`New User Question Toggle Options:`\n" + "\n" + "This menu allows you to decide which questions will be asked of a new\n" + "user.\n" + ; + j=0; + k=0; + while(1) { + i=0; + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Real Name" + ,cfg.uq&UQ_REALNAME ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Force Unique Real Name" + ,cfg.uq&UQ_DUPREAL ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Force Upper/Lower Case" + ,cfg.uq&UQ_NOUPRLWR ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Company Name" + ,cfg.uq&UQ_COMPANY ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Chat Handle / Call Sign" + ,cfg.uq&UQ_HANDLE ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Force Unique Handle / Call Sign" + ,cfg.uq&UQ_DUPHAND ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"E-mail/NetMail Address" + ,cfg.uq&UQ_NONETMAIL ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Sex (Gender)" + ,cfg.uq&UQ_SEX ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Birthday" + ,cfg.uq&UQ_BIRTH ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Address and Zip Code" + ,cfg.uq&UQ_ADDRESS ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Location" + ,cfg.uq&UQ_LOCATION ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Require Comma in Location" + ,cfg.uq&UQ_NOCOMMAS ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Phone Number" + ,cfg.uq&UQ_PHONE ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Allow EX-ASCII in Answers" + ,cfg.uq&UQ_NOEXASC ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"External Editor" + ,cfg.uq&UQ_XEDIT ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Command Shell" + ,cfg.uq&UQ_CMDSHELL ? "Yes":"No"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Default Settings" + ,cfg.uq&UQ_NODEF ? "No":"Yes"); + sprintf(opt[i++],"%-27.27s %-3.3s" + ,"Color Terminal" + ,cfg.uq&UQ_COLORTERM ? "Yes":"No"); + opt[i][0]=0; + j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k + ,"New User Questions",opt); + if(j==-1) + break; + uifc.changes=1; + switch(j) { + case 0: + cfg.uq^=UQ_REALNAME; + break; + case 1: + cfg.uq^=UQ_DUPREAL; + break; + case 2: + cfg.uq^=UQ_NOUPRLWR; + break; + case 3: + cfg.uq^=UQ_COMPANY; + break; + case 4: + cfg.uq^=UQ_HANDLE; + break; + case 5: + cfg.uq^=UQ_DUPHAND; + break; + case 6: + cfg.uq^=UQ_NONETMAIL; + break; + case 7: + cfg.uq^=UQ_SEX; + break; + case 8: + cfg.uq^=UQ_BIRTH; + break; + case 9: + cfg.uq^=UQ_ADDRESS; + break; + case 10: + cfg.uq^=UQ_LOCATION; + break; + case 11: + cfg.uq^=UQ_NOCOMMAS; + break; + case 12: + cfg.uq^=UQ_PHONE; + break; + case 13: + cfg.uq^=UQ_NOEXASC; + break; + case 14: + cfg.uq^=UQ_XEDIT; + break; + case 15: + cfg.uq^=UQ_CMDSHELL; + break; + case 16: + cfg.uq^=UQ_NODEF; + break; + case 17: + cfg.uq^=UQ_COLORTERM; + break; + } + } break; } - } - break; - case 15: /* Quick-Validation Values */ - dflt=0; - k=0; - while(1) { - for(i=0;i<10;i++) - sprintf(opt[i],"%d SL: %-2d F1: %s" - ,i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],str)); - opt[i][0]=0; - i=0; - uifc.helpbuf= - "`Quick-Validation Values:`\n" - "\n" - "This is a list of the ten quick-validation sets. These sets are used to\n" - "quickly set a user's security values (Level, Flags, Exemptions,\n" - "Restrictions, Expiration Date, and Credits) with one key stroke. The\n" - "user's expiration date may be extended and additional credits may also\n" - "be added using quick-validation sets.\n" - "\n" - "Holding down ~ ALT ~ and one of the number keys (`1-9`) while a user\n" - "is online, automatically sets his or user security values to the\n" - "quick-validation set for that number key.\n" - "\n" - "From within the `User Edit` function, a sysop can use the `V`alidate\n" - "User command and select from this quick-validation list to change a\n" - "user's security values with very few key-strokes.\n" - ; - i=uifc.list(WIN_RHT|WIN_BOT|WIN_ACT|WIN_SAV,0,0,0,&dflt,0 - ,"Quick-Validation Values",opt); - if(i==-1) - break; - sprintf(str,"Quick-Validation Set %d",i); - while(1) { - j=0; - sprintf(opt[j++],"%-22.22s%u","Level",cfg.val_level[i]); - sprintf(opt[j++],"%-22.22s%s","Flag Set #1" - ,ltoaf(cfg.val_flags1[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Flag Set #2" - ,ltoaf(cfg.val_flags2[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Flag Set #3" - ,ltoaf(cfg.val_flags3[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Flag Set #4" - ,ltoaf(cfg.val_flags4[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Exemptions" - ,ltoaf(cfg.val_exempt[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Restrictions" - ,ltoaf(cfg.val_rest[i],tmp)); - sprintf(opt[j++],"%-22.22s%u days","Extend Expiration" - ,cfg.val_expire[i]); - sprintf(opt[j++],"%-22.22s%u","Additional Credits" - ,cfg.val_cdt[i]); - opt[j][0]=0; - j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0 - ,str,opt); - if(j==-1) - break; - switch(j) { + } + break; + case 11: /* Advanced Options */ + done=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%s","New User Magic Word",cfg.new_magic); + sprintf(opt[i++],"%-27.27s%.40s","Data Directory" + ,cfg.data_dir); + sprintf(opt[i++],"%-27.27s%.40s","Logs Directory" + ,cfg.logs_dir); + sprintf(opt[i++],"%-27.27s%.40s","Exec Directory" + ,cfg.exec_dir); + sprintf(opt[i++],"%-27.27s%.40s","Mods Directory" + ,cfg.mods_dir); + sprintf(opt[i++],"%-27.27s%s","Input SIF Questionnaire" + ,cfg.new_sif); + sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire" + ,cfg.new_sof); + ultoac(cfg.cdt_per_dollar,str); + sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str); + sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits" + ,cfg.cdt_min_value); + sprintf(opt[i++],"%-27.27s%s","Maximum Number of Minutes" + ,cfg.max_minutes ? ultoa(cfg.max_minutes,tmp,10) : "Unlimited"); + sprintf(opt[i++],"%-27.27s%u","Warning Days Till Expire" + ,cfg.sys_exp_warn); + sprintf(opt[i++],"%-27.27s%u","Last Displayable Node" + ,cfg.sys_lastnode); + sprintf(opt[i++],"%-27.27s%s","Phone Number Format" + ,cfg.sys_phonefmt); + sprintf(opt[i++],"%-27.27s%.40s","Sysop Chat Override" + ,cfg.sys_chat_arstr); + if(cfg.user_backup_level) + sprintf(str,"%hu",cfg.user_backup_level); + else + strcpy(str,"None"); + sprintf(opt[i++],"%-27.27s%s","User Database Backups",str); + if(cfg.mail_backup_level) + sprintf(str,"%hu",cfg.mail_backup_level); + else + strcpy(str,"None"); + sprintf(opt[i++],"%-27.27s%s","Mail Database Backups",str); + sprintf(opt[i++],"%-27.27s%"PRIX32,"Control Key Pass-through" + ,cfg.ctrlkey_passthru); + opt[i][0]=0; + uifc.helpbuf= + "`System Advanced Options:`\n" + "\n" + "Care should be taken when modifying any of the options listed here.\n" + ; + switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&adv_dflt,0 + ,"Advanced Options",opt)) { + case -1: + done=1; + break; + case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Level" - ,ultoa(cfg.val_level[i],tmp,10),2 - ,K_NUMBER|K_EDIT); - cfg.val_level[i]=atoi(tmp); + uifc.helpbuf= + "`New User Magic Word:`\n" + "\n" + "If this field has a value, it is assumed the sysop has placed some\n" + "reference to this `magic word` in `text/newuser.msg` and new users\n" + "will be prompted for the magic word after they enter their password.\n" + "If they do not enter it correctly, it is assumed they didn't read the\n" + "new user information displayed to them and they are disconnected.\n" + "\n" + "Think of it as a password to guarantee that new users read the text\n" + "displayed to them.\n" + ; + uifc.input(WIN_MID,0,0,"New User Magic Word",cfg.new_magic,sizeof(cfg.new_magic)-1 + ,K_EDIT|K_UPPER); break; case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #1" - ,truncsp(ltoaf(cfg.val_flags1[i],tmp)),26 - ,K_UPPER|K_ALPHA|K_EDIT); - cfg.val_flags1[i]=aftol(tmp); - break; + uifc.helpbuf= + "`Data File Directory:`\n" + "\n" + "The Synchronet data directory contains almost all the data for your BBS.\n" + "This directory must be located where `ALL` nodes can access it and\n" + "`MUST NOT` be placed on a RAM disk or other volatile media.\n" + "\n" + "This option allows you to change the location of your data directory.\n" + ; + strcpy(str,cfg.data_dir); + if(uifc.input(WIN_MID|WIN_SAV,0,9,"Data Directory" + ,str,sizeof(cfg.data_dir)-1,K_EDIT)>0) { + backslash(str); + SAFECOPY(cfg.data_dir,str); + } + break; case 2: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #2" - ,truncsp(ltoaf(cfg.val_flags2[i],tmp)),26 - ,K_UPPER|K_ALPHA|K_EDIT); - cfg.val_flags2[i]=aftol(tmp); - break; + uifc.helpbuf= + "`Log File Directory:`\n" + "\n" + "Log files will be stored in this directory.\n" + ; + strcpy(str,cfg.logs_dir); + if(uifc.input(WIN_MID|WIN_SAV,0,9,"Logs Directory" + ,str,sizeof(cfg.logs_dir)-1,K_EDIT)>0) { + backslash(str); + SAFECOPY(cfg.logs_dir,str); + } + break; case 3: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #3" - ,truncsp(ltoaf(cfg.val_flags3[i],tmp)),26 - ,K_UPPER|K_ALPHA|K_EDIT); - cfg.val_flags3[i]=aftol(tmp); - break; + uifc.helpbuf= + "`Executable/Module File Directory:`\n" + "\n" + "The Synchronet exec directory contains executable files that your BBS\n" + "executes. This directory does `not` need to be in your DOS search path.\n" + "If you place programs in this directory for the BBS to execute, you\n" + "should place the `%!` abbreviation for the exec directory at the\n" + "beginning of the configured command-lines.\n" + "\n" + "This option allows you to change the location of your exec directory.\n" + ; + strcpy(str,cfg.exec_dir); + if(uifc.input(WIN_MID|WIN_SAV,0,9,"Exec Directory" + ,str,sizeof(cfg.exec_dir)-1,K_EDIT)>0) { + backslash(str); + SAFECOPY(cfg.exec_dir,str); + } + break; case 4: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #4" - ,truncsp(ltoaf(cfg.val_flags4[i],tmp)),26 - ,K_UPPER|K_ALPHA|K_EDIT); - cfg.val_flags4[i]=aftol(tmp); - break; + uifc.helpbuf= + "`Modified Modules Directory:`\n" + "\n" + "This optional directory can be used to specify a location where modified\n" + "module files are stored. These modified modules will take precedence over\n" + "stock modules with the same filename (in the exec directory) and will\n" + "not be overwritten by future updates/upgrades.\n" + "\n" + "If this directory is `blank`, then this feature is not used and all modules\n" + "are assumed to be located in the `exec` directory.\n" + ; + strcpy(str,cfg.mods_dir); + if(uifc.input(WIN_MID|WIN_SAV,0,9,"Mods Directory" + ,str,sizeof(cfg.mods_dir)-1,K_EDIT)>0) { + backslash(str); + SAFECOPY(cfg.mods_dir,str); + } + break; case 5: + strcpy(str,cfg.new_sif); + uifc.helpbuf= + "`SIF Questionnaire for User Input:`\n" + "\n" + "This is the name of a SIF questionnaire file that resides your text\n" + "directory that all users will be prompted to answer.\n" + ; uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Exemption Flags" - ,truncsp(ltoaf(cfg.val_exempt[i],tmp)),26 - ,K_UPPER|K_ALPHA|K_EDIT); - cfg.val_exempt[i]=aftol(tmp); - break; + ,"SIF Questionnaire for User Input" + ,str,LEN_CODE,K_UPPER|K_EDIT); + if(!str[0] || code_ok(str)) + strcpy(cfg.new_sif,str); + else + uifc.msg("Invalid SIF Name"); + break; case 6: + strcpy(str,cfg.new_sof); + uifc.helpbuf= + "`SIF Questionnaire for Reviewing User Input:`\n" + "\n" + "This is the SIF file used to review the input of users from the user\n" + "edit function.\n" + ; uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Restriction Flags" - ,truncsp(ltoaf(cfg.val_rest[i],tmp)),26 - ,K_UPPER|K_ALPHA|K_EDIT); - cfg.val_rest[i]=aftol(tmp); + ,"SIF Questionnaire for Reviewing User Input" + ,str,LEN_CODE,K_EDIT); + if(!str[0] || code_ok(str)) + strcpy(cfg.new_sof,str); + else + uifc.msg("Invalid SIF Name"); break; case 7: + uifc.helpbuf= + "`Credits Per Dollar:`\n" + "\n" + "This is the monetary value of a credit (How many credits per dollar).\n" + "This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.)\n" + "since credits are usually converted by 100 kilobyte (102400) blocks.\n" + "To make a dollar worth two megabytes of credits, set this value to\n" + "2,097,152 (a megabyte is 1024*1024 or 1048576).\n" + ; + ultoa(cfg.cdt_per_dollar,str,10); uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Days to Extend Expiration" - ,ultoa(cfg.val_expire[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - cfg.val_expire[i]=atoi(tmp); - break; + ,"Credits Per Dollar",str,10,K_NUMBER|K_EDIT); + cfg.cdt_per_dollar=atol(str); + break; case 8: + uifc.helpbuf= + "`Minutes Per 100K Credits:`\n" + "\n" + "This is the value of a minute of time online. This field is the number\n" + "of minutes to give the user in exchange for each 100K credit block.\n" + ; + sprintf(str,"%u",cfg.cdt_min_value); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Minutes Per 100K Credits",str,5,K_NUMBER|K_EDIT); + cfg.cdt_min_value=atoi(str); + break; + case 9: + uifc.helpbuf= + "`Maximum Number of Minutes User Can Have:`\n" + "\n" + "This value is the maximum total number of minutes a user can have. If a\n" + "user has this number of minutes or more, they will not be allowed to\n" + "convert credits into minutes. A sysop can add minutes to a user's\n" + "account regardless of this maximum. If this value is set to `0`, users\n" + "will have no limit on the total number of minutes they can have.\n" + ; + sprintf(str,"%"PRIu32,cfg.max_minutes); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Maximum Number of Minutes a User Can Have " + "(0=No Limit)" + ,str,10,K_NUMBER|K_EDIT); + cfg.max_minutes=atol(str); + break; + case 10: + uifc.helpbuf= + "`Warning Days Till Expire:`\n" + "\n" + "If a user's account will expire in this many days or less, the user will\n" + "be notified at logon. Setting this value to `0` disables the warning\n" + "completely.\n" + ; + sprintf(str,"%u",cfg.sys_exp_warn); uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Additional Credits" - ,ultoa(cfg.val_cdt[i],tmp,10),10 - ,K_NUMBER|K_EDIT); - cfg.val_cdt[i]=atol(tmp); + ,"Warning Days Till Expire",str,5,K_NUMBER|K_EDIT); + cfg.sys_exp_warn=atoi(str); + break; + case 11: + uifc.helpbuf= + "`Last Displayed Node:`\n" + "\n" + "This is the number of the last node to display to users in node lists.\n" + "This allows the sysop to define the higher numbered nodes as `invisible`\n" + "to users.\n" + ; + sprintf(str,"%u",cfg.sys_lastnode); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Last Displayed Node",str,5,K_NUMBER|K_EDIT); + cfg.sys_lastnode=atoi(str); + break; + case 12: + uifc.helpbuf= + "`Phone Number Format:`\n" + "\n" + "This is the format used for phone numbers in your local calling\n" + "area. Use `N` for number positions, `A` for alphabetic, or `!` for any\n" + "character. All other characters will be static in the phone number\n" + "format. An example for North American phone numbers is `NNN-NNN-NNNN`.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Phone Number Format",cfg.sys_phonefmt + ,LEN_PHONE,K_UPPER|K_EDIT); + break; + case 13: + getar("Sysop Chat Override",cfg.sys_chat_arstr); + break; + case 14: + uifc.helpbuf= + "`User Database Backups:`\n" + "\n" + "Setting this option to anything but 0 will enable automatic daily\n" + "backups of the user database. This number determines how many backups\n" + "to keep on disk.\n" + ; + sprintf(str,"%u",cfg.user_backup_level); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Number of Daily User Database Backups to Keep" + ,str,4,K_NUMBER|K_EDIT); + cfg.user_backup_level=atoi(str); + break; + case 15: + uifc.helpbuf= + "`Mail Database Backups:`\n" + "\n" + "Setting this option to anything but 0 will enable automatic daily\n" + "backups of the mail database. This number determines how many backups\n" + "to keep on disk.\n" + ; + sprintf(str,"%u",cfg.mail_backup_level); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Number of Daily Mail Database Backups to Keep" + ,str,4,K_NUMBER|K_EDIT); + cfg.mail_backup_level=atoi(str); + break; + case 16: + uifc.helpbuf= + "`Control Key Pass-through:`\n" + "\n" + "This value is a 32-bit hexadecimal number. Each set bit represents a\n" + "control key combination that will `not` be handled internally by\n" + "Synchronet or by a Global Hot Key Event.\n" + "\n" + "To disable internal handling of the `Ctrl-C` key combination (for example)\n" + "set this value to `8`. The value is determined by taking 2 to the power of\n" + "the ASCII value of the control character (Ctrl-A is 1, Ctrl-B is 2, \n" + "etc.). In the case of Ctrl-C, taking 2 to the power of 3 equals 8.\n" + "\n" + "To pass-through multiple control key combinations, multiple bits must be\n" + "set (or'd together) to create the necessary value, which may require the\n" + "use of a hexadecimal calculator.\n" + "\n" + "If unsure, leave this value set to `0`, the default.\n" + ; + sprintf(str,"%"PRIX32,cfg.ctrlkey_passthru); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Control Key Pass-through" + ,str,8,K_UPPER|K_EDIT); + cfg.ctrlkey_passthru=strtoul(str,NULL,16); + break; + } + } + break; + case 12: /* Loadable Modules */ + done=0; + k=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-16.16s%s","Login",cfg.login_mod); + sprintf(opt[i++],"%-16.16s%s","Logon",cfg.logon_mod); + sprintf(opt[i++],"%-16.16s%s","Sync",cfg.sync_mod); + sprintf(opt[i++],"%-16.16s%s","Logoff",cfg.logoff_mod); + sprintf(opt[i++],"%-16.16s%s","Logout",cfg.logout_mod); + sprintf(opt[i++],"%-16.16s%s","New User",cfg.newuser_mod); + sprintf(opt[i++],"%-16.16s%s","Expired User",cfg.expire_mod); + sprintf(opt[i++],"%-16.16s%s","Read Mail",cfg.readmail_mod); + sprintf(opt[i++],"%-16.16s%s","Scan Msgs",cfg.scanposts_mod); + sprintf(opt[i++],"%-16.16s%s","Scan Subs",cfg.scansubs_mod); + opt[i][0]=0; + uifc.helpbuf= + "`Loadable Modules:`\n" + "\n" + "Baja modules (`.bin` files) or JavaScript modules (`.js` files) can be\n" + "automatically loaded and executed during certain Terminal Server\n" + "operations. The name (root filename) of the module can be specified for\n" + "each of the available operations listed below:\n" + "\n" + "`Login` Required module for interactive terminal logins (answer)\n" + "`Logon` Executed during terminal logon procedure\n" + "`Sync` Executed when terminal nodes are periodically synchronized\n" + "`Logoff` Executed during terminal logoff procedure (interactive)\n" + "`Logout` Executed during terminal logout procedure (offline)\n" + "`New User` Executed at end of new terminal user creation process\n" + "`Expired User` Executed during daily event when user expires (offline)\n" + "\n" + "Full module command-lines may be used for the operations listed below:\n" + "\n" + "`Read Mail` Executed when a user reads email/netmail\n" + "`Scan Msgs` Executed when a user reads or scans a message sub-board\n" + "`Scan Subs` Executed when a user scans one or more sub-boards for msgs\n" + "\n" + "`Note:` JavaScript modules take precedence over Baja modules if both exist\n" + "in your `exec` or `mods` directories.\n" + ; + switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,32,&k,0 + ,"Loadable Modules",opt)) { + + case -1: + done=1; + break; + + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0,"Login Module" + ,cfg.login_mod,sizeof(cfg.login_mod)-1,K_EDIT); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Module" + ,cfg.logon_mod,sizeof(cfg.logon_mod)-1,K_EDIT); + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0,"Synchronize Module" + ,cfg.sync_mod,sizeof(cfg.sync_mod)-1,K_EDIT); + break; + case 3: + uifc.input(WIN_MID|WIN_SAV,0,0,"Logoff Module" + ,cfg.logoff_mod,sizeof(cfg.logoff_mod)-1,K_EDIT); + break; + case 4: + uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Module" + ,cfg.logout_mod,sizeof(cfg.logout_mod)-1,K_EDIT); + break; + case 5: + uifc.input(WIN_MID|WIN_SAV,0,0,"New User Module" + ,cfg.newuser_mod,sizeof(cfg.newuser_mod)-1,K_EDIT); + break; + case 6: + uifc.input(WIN_MID|WIN_SAV,0,0,"Expired User Module" + ,cfg.expire_mod,sizeof(cfg.expire_mod)-1,K_EDIT); + break; + case 7: + uifc.input(WIN_MID|WIN_SAV,0,0,"Read Mail Command" + ,cfg.readmail_mod,sizeof(cfg.readmail_mod)-1,K_EDIT); + break; + case 8: + uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Msgs Command" + ,cfg.scanposts_mod,sizeof(cfg.scanposts_mod)-1,K_EDIT); + break; + case 9: + uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Subs Command" + ,cfg.scansubs_mod,sizeof(cfg.scansubs_mod)-1,K_EDIT); + break; + } + } + break; + + case 13: /* Security Levels */ + dflt=bar=0; + k=0; + while(1) { + for(i=0;i<100;i++) { + sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L); + sprintf(opt[i],"%-2d %5d %5d " + "%5d %5d %5d %5d %6s %7s %2u",i + ,cfg.level_timeperday[i],cfg.level_timepercall[i] + ,cfg.level_callsperday[i],cfg.level_emailperday[i] + ,cfg.level_postsperday[i],cfg.level_linespermsg[i] + ,tmp + ,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Val Set" : "Level" + ,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ? + cfg.level_expireto[i] : cfg.expired_level); + } + opt[i][0]=0; + i=0; + uifc.helpbuf= + "`Security Level Values:`\n" + "\n" + "This menu allows you to change the security options for every possible\n" + "security level from 0 to 99. The available options for each level are:\n" + "\n" + " Time Per Day Maximum online time per day\n" + " Time Per Call Maximum online time per call\n" + " Calls Per Day Maximum number of calls per day\n" + " Email Per Day Maximum number of email per day\n" + " Posts Per Day Maximum number of posts per day\n" + " Lines Per Message Maximum number of lines per message\n" + " Free Credits Per Day Number of free credits per day\n" + " Expire To Level or validation set to Expire to\n" + ; + i=uifc.list(WIN_RHT|WIN_ACT,0,3,0,&dflt,&bar + ,"Level T/D T/C C/D E/D P/D L/M F/D " + "Expire To",opt); + if(i==-1) + break; + while(1) { + sprintf(str,"Security Level %d Values",i); + j=0; + sprintf(opt[j++],"%-22.22s%-5u","Time Per Day" + ,cfg.level_timeperday[i]); + sprintf(opt[j++],"%-22.22s%-5u","Time Per Call" + ,cfg.level_timepercall[i]); + sprintf(opt[j++],"%-22.22s%-5u","Calls Per Day" + ,cfg.level_callsperday[i]); + sprintf(opt[j++],"%-22.22s%-5u","Email Per Day" + ,cfg.level_emailperday[i]); + sprintf(opt[j++],"%-22.22s%-5u","Posts Per Day" + ,cfg.level_postsperday[i]); + sprintf(opt[j++],"%-22.22s%-5u","Lines Per Message" + ,cfg.level_linespermsg[i]); + sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L); + sprintf(opt[j++],"%-22.22s%-6s","Free Credits Per Day" + ,tmp); + sprintf(opt[j++],"%-22.22s%s %u","Expire To" + ,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Validation Set" + : "Level" + ,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ? + cfg.level_expireto[i] : cfg.expired_level); + opt[j][0]=0; + j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0 + ,str,opt); + if(j==-1) + break; + switch(j) { + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Total Time Allowed Per Day" + ,ultoa(cfg.level_timeperday[i],tmp,10),4 + ,K_NUMBER|K_EDIT); + cfg.level_timeperday[i]=atoi(tmp); + if(cfg.level_timeperday[i]>1440) + cfg.level_timeperday[i]=1440; + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Time Allowed Per Call" + ,ultoa(cfg.level_timepercall[i],tmp,10),4 + ,K_NUMBER|K_EDIT); + cfg.level_timepercall[i]=atoi(tmp); + if(cfg.level_timepercall[i]>1440) + cfg.level_timepercall[i]=1440; + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Calls Allowed Per Day" + ,ultoa(cfg.level_callsperday[i],tmp,10),4 + ,K_NUMBER|K_EDIT); + cfg.level_callsperday[i]=atoi(tmp); + break; + case 3: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Email Allowed Per Day" + ,ultoa(cfg.level_emailperday[i],tmp,10),4 + ,K_NUMBER|K_EDIT); + cfg.level_emailperday[i]=atoi(tmp); + break; + case 4: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Posts Allowed Per Day" + ,ultoa(cfg.level_postsperday[i],tmp,10),4 + ,K_NUMBER|K_EDIT); + cfg.level_postsperday[i]=atoi(tmp); + break; + case 5: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Lines Allowed Per Message (Post/E-mail)" + ,ultoa(cfg.level_linespermsg[i],tmp,10),5 + ,K_NUMBER|K_EDIT); + cfg.level_linespermsg[i]=atoi(tmp); + break; + case 6: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Free Credits Per Day (in Kilobytes)" + ,ultoa(cfg.level_freecdtperday[i]/1024L,tmp,10),8 + ,K_EDIT|K_UPPER); + cfg.level_freecdtperday[i]=atol(tmp)*1024L; + break; + case 7: + j=0; + sprintf(opt[j++],"Default Expired Level " + "(Currently %u)",cfg.expired_level); + sprintf(opt[j++],"Specific Level"); + sprintf(opt[j++],"Quick-Validation Set"); + opt[j][0]=0; + j=0; + sprintf(str,"Level %u Expires To",i); + j=uifc.list(WIN_SAV,2,1,0,&j,0 + ,str,opt); + if(j==-1) + break; + if(j==0) { + cfg.level_misc[i]&= + ~(LEVEL_EXPTOLVL|LEVEL_EXPTOVAL); + uifc.changes=1; + break; + } + if(j==1) { + cfg.level_misc[i]&=~LEVEL_EXPTOVAL; + cfg.level_misc[i]|=LEVEL_EXPTOLVL; + uifc.changes=1; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Expired Level" + ,ultoa(cfg.level_expireto[i],tmp,10),2 + ,K_EDIT|K_NUMBER); + cfg.level_expireto[i]=atoi(tmp); + break; + } + cfg.level_misc[i]&=~LEVEL_EXPTOLVL; + cfg.level_misc[i]|=LEVEL_EXPTOVAL; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Quick-Validation Set to Expire To" + ,ultoa(cfg.level_expireto[i],tmp,10),1 + ,K_EDIT|K_NUMBER); + cfg.level_expireto[i]=atoi(tmp); + break; + } + } + } + break; + case 14: /* Expired Acccount Values */ + dflt=0; + done=0; + while(!done) { + i=0; + sprintf(opt[i++],"%-27.27s%u","Level",cfg.expired_level); + sprintf(opt[i++],"%-27.27s%s","Flag Set #1 to Remove" + ,ltoaf(cfg.expired_flags1,str)); + sprintf(opt[i++],"%-27.27s%s","Flag Set #2 to Remove" + ,ltoaf(cfg.expired_flags2,str)); + sprintf(opt[i++],"%-27.27s%s","Flag Set #3 to Remove" + ,ltoaf(cfg.expired_flags3,str)); + sprintf(opt[i++],"%-27.27s%s","Flag Set #4 to Remove" + ,ltoaf(cfg.expired_flags4,str)); + sprintf(opt[i++],"%-27.27s%s","Exemptions to Remove" + ,ltoaf(cfg.expired_exempt,str)); + sprintf(opt[i++],"%-27.27s%s","Restrictions to Add" + ,ltoaf(cfg.expired_rest,str)); + opt[i][0]=0; + uifc.helpbuf= + "`Expired Account Values:`\n" + "\n" + "If a user's account expires, the security levels for that account will\n" + "be modified according to the settings of this menu. The `Main Level` and\n" + "`Transfer Level` will be set to the values listed on this menu. The `Main\n" + "Flags`, `Transfer Flags`, and `Exemptions` listed on this menu will be\n" + "removed from the account if they are set. The `Restrictions` listed will\n" + "be added to the account.\n" + ; + switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&dflt,0 + ,"Expired Account Values",opt)) { + case -1: + done=1; + break; + case 0: + ultoa(cfg.expired_level,str,10); + uifc.helpbuf= + "`Expired Account Security Level:`\n" + "\n" + "This is the security level automatically given to expired user accounts.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level" + ,str,2,K_EDIT|K_NUMBER); + cfg.expired_level=atoi(str); + break; + case 1: + truncsp(ltoaf(cfg.expired_flags1,str)); + uifc.helpbuf= + "`Expired Security Flags to Remove:`\n" + "\n" + "These are the security flags automatically removed when a user account\n" + "has expired.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #1" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.expired_flags1=aftol(str); + break; + case 2: + truncsp(ltoaf(cfg.expired_flags2,str)); + uifc.helpbuf= + "`Expired Security Flags to Remove:`\n" + "\n" + "These are the security flags automatically removed when a user account\n" + "has expired.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #2" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.expired_flags2=aftol(str); + break; + case 3: + truncsp(ltoaf(cfg.expired_flags3,str)); + uifc.helpbuf= + "`Expired Security Flags to Remove:`\n" + "\n" + "These are the security flags automatically removed when a user account\n" + "has expired.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #3" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.expired_flags3=aftol(str); + break; + case 4: + truncsp(ltoaf(cfg.expired_flags4,str)); + uifc.helpbuf= + "`Expired Security Flags to Remove:`\n" + "\n" + "These are the security flags automatically removed when a user account\n" + "has expired.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #4" + ,str,26,K_EDIT|K_UPPER|K_ALPHA); + cfg.expired_flags4=aftol(str); + break; + case 5: + truncsp(ltoaf(cfg.expired_exempt,str)); + uifc.helpbuf= + "`Expired Exemption Flags to Remove:`\n" + "\n" + "These are the exemptions that are automatically removed from a user\n" + "account if it expires.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26 + ,K_EDIT|K_UPPER|K_ALPHA); + cfg.expired_exempt=aftol(str); + break; + case 6: + truncsp(ltoaf(cfg.expired_rest,str)); + uifc.helpbuf= + "`Expired Restriction Flags to Add:`\n" + "\n" + "These are the restrictions that are automatically added to a user\n" + "account if it expires.\n" + ; + uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26 + ,K_EDIT|K_UPPER|K_ALPHA); + cfg.expired_rest=aftol(str); break; + } + } + break; + case 15: /* Quick-Validation Values */ + dflt=0; + k=0; + while(1) { + for(i=0;i<10;i++) + sprintf(opt[i],"%d SL: %-2d F1: %s" + ,i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],str)); + opt[i][0]=0; + i=0; + uifc.helpbuf= + "`Quick-Validation Values:`\n" + "\n" + "This is a list of the ten quick-validation sets. These sets are used to\n" + "quickly set a user's security values (Level, Flags, Exemptions,\n" + "Restrictions, Expiration Date, and Credits) with one key stroke. The\n" + "user's expiration date may be extended and additional credits may also\n" + "be added using quick-validation sets.\n" + "\n" + "Holding down ~ ALT ~ and one of the number keys (`1-9`) while a user\n" + "is online, automatically sets his or user security values to the\n" + "quick-validation set for that number key.\n" + "\n" + "From within the `User Edit` function, a sysop can use the `V`alidate\n" + "User command and select from this quick-validation list to change a\n" + "user's security values with very few key-strokes.\n" + ; + i=uifc.list(WIN_RHT|WIN_BOT|WIN_ACT|WIN_SAV,0,0,0,&dflt,0 + ,"Quick-Validation Values",opt); + if(i==-1) + break; + sprintf(str,"Quick-Validation Set %d",i); + while(1) { + j=0; + sprintf(opt[j++],"%-22.22s%u","Level",cfg.val_level[i]); + sprintf(opt[j++],"%-22.22s%s","Flag Set #1" + ,ltoaf(cfg.val_flags1[i],tmp)); + sprintf(opt[j++],"%-22.22s%s","Flag Set #2" + ,ltoaf(cfg.val_flags2[i],tmp)); + sprintf(opt[j++],"%-22.22s%s","Flag Set #3" + ,ltoaf(cfg.val_flags3[i],tmp)); + sprintf(opt[j++],"%-22.22s%s","Flag Set #4" + ,ltoaf(cfg.val_flags4[i],tmp)); + sprintf(opt[j++],"%-22.22s%s","Exemptions" + ,ltoaf(cfg.val_exempt[i],tmp)); + sprintf(opt[j++],"%-22.22s%s","Restrictions" + ,ltoaf(cfg.val_rest[i],tmp)); + sprintf(opt[j++],"%-22.22s%u days","Extend Expiration" + ,cfg.val_expire[i]); + sprintf(opt[j++],"%-22.22s%u","Additional Credits" + ,cfg.val_cdt[i]); + opt[j][0]=0; + j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0 + ,str,opt); + if(j==-1) + break; + switch(j) { + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Level" + ,ultoa(cfg.val_level[i],tmp,10),2 + ,K_NUMBER|K_EDIT); + cfg.val_level[i]=atoi(tmp); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Flag Set #1" + ,truncsp(ltoaf(cfg.val_flags1[i],tmp)),26 + ,K_UPPER|K_ALPHA|K_EDIT); + cfg.val_flags1[i]=aftol(tmp); + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Flag Set #2" + ,truncsp(ltoaf(cfg.val_flags2[i],tmp)),26 + ,K_UPPER|K_ALPHA|K_EDIT); + cfg.val_flags2[i]=aftol(tmp); + break; + case 3: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Flag Set #3" + ,truncsp(ltoaf(cfg.val_flags3[i],tmp)),26 + ,K_UPPER|K_ALPHA|K_EDIT); + cfg.val_flags3[i]=aftol(tmp); + break; + case 4: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Flag Set #4" + ,truncsp(ltoaf(cfg.val_flags4[i],tmp)),26 + ,K_UPPER|K_ALPHA|K_EDIT); + cfg.val_flags4[i]=aftol(tmp); + break; + case 5: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Exemption Flags" + ,truncsp(ltoaf(cfg.val_exempt[i],tmp)),26 + ,K_UPPER|K_ALPHA|K_EDIT); + cfg.val_exempt[i]=aftol(tmp); + break; + case 6: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Restriction Flags" + ,truncsp(ltoaf(cfg.val_rest[i],tmp)),26 + ,K_UPPER|K_ALPHA|K_EDIT); + cfg.val_rest[i]=aftol(tmp); + break; + case 7: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Days to Extend Expiration" + ,ultoa(cfg.val_expire[i],tmp,10),4 + ,K_NUMBER|K_EDIT); + cfg.val_expire[i]=atoi(tmp); + break; + case 8: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Additional Credits" + ,ultoa(cfg.val_cdt[i],tmp,10),10 + ,K_NUMBER|K_EDIT); + cfg.val_cdt[i]=atol(tmp); + break; + } } - } - } - break; + } + break; } } - } diff --git a/src/sbbs3/scfg/scfgxfr1.c b/src/sbbs3/scfg/scfgxfr1.c index cbf8ba1e22bd238d47929cfaeda11adffbc6e3f8..6f72310298351249f1c58228f877e6f5b8250521 100644 --- a/src/sbbs3/scfg/scfgxfr1.c +++ b/src/sbbs3/scfg/scfgxfr1.c @@ -59,1089 +59,1088 @@ void xfer_opts() static dlevent_t savdlevent; static char savaltpath[LEN_DIR+1]; -while(1) { - i=0; - sprintf(opt[i++],"%-33.33s%uk","Min Bytes Free Disk Space" - ,cfg.min_dspace); - sprintf(opt[i++],"%-33.33s%u","Max Files in Batch UL Queue" - ,cfg.max_batup); - sprintf(opt[i++],"%-33.33s%u","Max Files in Batch DL Queue" - ,cfg.max_batdn); - sprintf(opt[i++],"%-33.33s%u","Max Users in User Transfers" - ,cfg.max_userxfer); - sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Upload" - ,cfg.cdt_up_pct); - sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Download" - ,cfg.cdt_dn_pct); - if(cfg.leech_pct) - sprintf(str,"%u%% after %u seconds" - ,cfg.leech_pct,cfg.leech_sec); - else - strcpy(str,"Disabled"); - sprintf(opt[i++],"%-33.33s%s","Long Filenames in Listings" - ,cfg.file_misc&FM_NO_LFN ? "No":"Yes"); - sprintf(opt[i++],"%-33.33s%s","Leech Protocol Detection",str); - strcpy(opt[i++],"Viewable Files..."); - strcpy(opt[i++],"Testable Files..."); - strcpy(opt[i++],"Download Events..."); - strcpy(opt[i++],"Extractable Files..."); - strcpy(opt[i++],"Compressable Files..."); - strcpy(opt[i++],"Transfer Protocols..."); - strcpy(opt[i++],"Alternate File Paths..."); - opt[i][0]=0; + while(1) { + i=0; + sprintf(opt[i++],"%-33.33s%uk","Min Bytes Free Disk Space" + ,cfg.min_dspace); + sprintf(opt[i++],"%-33.33s%u","Max Files in Batch UL Queue" + ,cfg.max_batup); + sprintf(opt[i++],"%-33.33s%u","Max Files in Batch DL Queue" + ,cfg.max_batdn); + sprintf(opt[i++],"%-33.33s%u","Max Users in User Transfers" + ,cfg.max_userxfer); + sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Upload" + ,cfg.cdt_up_pct); + sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Download" + ,cfg.cdt_dn_pct); + if(cfg.leech_pct) + sprintf(str,"%u%% after %u seconds" + ,cfg.leech_pct,cfg.leech_sec); + else + strcpy(str,"Disabled"); + sprintf(opt[i++],"%-33.33s%s","Long Filenames in Listings" + ,cfg.file_misc&FM_NO_LFN ? "No":"Yes"); + sprintf(opt[i++],"%-33.33s%s","Leech Protocol Detection",str); + strcpy(opt[i++],"Viewable Files..."); + strcpy(opt[i++],"Testable Files..."); + strcpy(opt[i++],"Download Events..."); + strcpy(opt[i++],"Extractable Files..."); + strcpy(opt[i++],"Compressable Files..."); + strcpy(opt[i++],"Transfer Protocols..."); + strcpy(opt[i++],"Alternate File Paths..."); + opt[i][0]=0; + uifc.helpbuf= + "`File Transfer Configuration:`\n" + "\n" + "This menu has options and sub-menus that pertain specifically to the\n" + "file transfer section of the BBS.\n" + ; + switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&xfr_dflt,0 + ,"File Transfer Configuration",opt)) { + case -1: + i=save_changes(WIN_MID); + if(i==-1) + break; + if(!i) { + write_file_cfg(&cfg,backup_level); + refresh_cfg(&cfg); + } + return; + case 0: + uifc.helpbuf= + "`Minimum Kilobytes Free Disk Space to Allow Uploads:`\n" + "\n" + "This is the minimum free space in a file directory to allow user\n" + "uploads.\n" + ; + uifc.input(WIN_MID,0,0 + ,"Minimum Kilobytes Free Disk Space to Allow Uploads" + ,ultoa(cfg.min_dspace,tmp,10),5,K_EDIT|K_NUMBER); + cfg.min_dspace=atoi(tmp); + break; + case 1: + uifc.helpbuf= + "`Maximum Files in Batch Upload Queue:`\n" + "\n" + "This is the maximum number of files that can be placed in the batch\n" + "upload queue.\n" + ; + uifc.input(WIN_MID,0,0,"Maximum Files in Batch Upload Queue" + ,ultoa(cfg.max_batup,tmp,10),5,K_EDIT|K_NUMBER); + cfg.max_batup=atoi(tmp); + break; + case 2: + uifc.helpbuf= + "`Maximum Files in Batch Download Queue:`\n" + "\n" + "This is the maximum number of files that can be placed in the batch\n" + "download queue.\n" + ; + uifc.input(WIN_MID,0,0,"Maximum Files in Batch Download Queue" + ,ultoa(cfg.max_batdn,tmp,10),5,K_EDIT|K_NUMBER); + cfg.max_batdn=atoi(tmp); + break; + case 3: + uifc.helpbuf= + "`Maximum Destination Users in User to User Transfer:`\n" + "\n" + "This is the maximum number of users allowed in the destination user list\n" + "of a user to user upload.\n" + ; + uifc.input(WIN_MID,0,0 + ,"Maximum Destination Users in User to User Transfers" + ,ultoa(cfg.max_userxfer,tmp,10),5,K_EDIT|K_NUMBER); + cfg.max_userxfer=atoi(tmp); + break; + case 4: uifc.helpbuf= - "`File Transfer Configuration:`\n" + "`Default Percentage of Credits to Credit Uploader on Upload:`\n" "\n" - "This menu has options and sub-menus that pertain specifically to the\n" - "file transfer section of the BBS.\n" + "This is the default setting that will be used when new file\n" + "directories are created.\n" ; - switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&xfr_dflt,0 - ,"File Transfer Configuration",opt)) { - case -1: - i=save_changes(WIN_MID); - if(i==-1) + uifc.input(WIN_MID,0,0 + ,"Default Percentage of Credits to Credit Uploader on Upload" + ,ultoa(cfg.cdt_up_pct,tmp,10),4,K_EDIT|K_NUMBER); + cfg.cdt_up_pct=atoi(tmp); break; - if(!i) { - write_file_cfg(&cfg,backup_level); - refresh_cfg(&cfg); - } - return; - case 0: - uifc.helpbuf= - "`Minimum Kilobytes Free Disk Space to Allow Uploads:`\n" - "\n" - "This is the minimum free space in a file directory to allow user\n" - "uploads.\n" - ; - uifc.input(WIN_MID,0,0 - ,"Minimum Kilobytes Free Disk Space to Allow Uploads" - ,ultoa(cfg.min_dspace,tmp,10),5,K_EDIT|K_NUMBER); - cfg.min_dspace=atoi(tmp); - break; - case 1: - uifc.helpbuf= - "`Maximum Files in Batch Upload Queue:`\n" - "\n" - "This is the maximum number of files that can be placed in the batch\n" - "upload queue.\n" - ; - uifc.input(WIN_MID,0,0,"Maximum Files in Batch Upload Queue" - ,ultoa(cfg.max_batup,tmp,10),5,K_EDIT|K_NUMBER); - cfg.max_batup=atoi(tmp); - break; - case 2: - uifc.helpbuf= - "`Maximum Files in Batch Download Queue:`\n" - "\n" - "This is the maximum number of files that can be placed in the batch\n" - "download queue.\n" - ; - uifc.input(WIN_MID,0,0,"Maximum Files in Batch Download Queue" - ,ultoa(cfg.max_batdn,tmp,10),5,K_EDIT|K_NUMBER); - cfg.max_batdn=atoi(tmp); - break; - case 3: - uifc.helpbuf= - "`Maximum Destination Users in User to User Transfer:`\n" - "\n" - "This is the maximum number of users allowed in the destination user list\n" - "of a user to user upload.\n" - ; - uifc.input(WIN_MID,0,0 - ,"Maximum Destination Users in User to User Transfers" - ,ultoa(cfg.max_userxfer,tmp,10),5,K_EDIT|K_NUMBER); - cfg.max_userxfer=atoi(tmp); - break; - case 4: -uifc.helpbuf= - "`Default Percentage of Credits to Credit Uploader on Upload:`\n" - "\n" - "This is the default setting that will be used when new file\n" - "directories are created.\n" -; - uifc.input(WIN_MID,0,0 - ,"Default Percentage of Credits to Credit Uploader on Upload" - ,ultoa(cfg.cdt_up_pct,tmp,10),4,K_EDIT|K_NUMBER); - cfg.cdt_up_pct=atoi(tmp); - break; - case 5: -uifc.helpbuf= - "`Default Percentage of Credits to Credit Uploader on Download:`\n" - "\n" - "This is the default setting that will be used when new file\n" - "directories are created.\n" -; - uifc.input(WIN_MID,0,0 - ,"Default Percentage of Credits to Credit Uploader on Download" - ,ultoa(cfg.cdt_dn_pct,tmp,10),4,K_EDIT|K_NUMBER); - cfg.cdt_dn_pct=atoi(tmp); - break; - case 6: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - uifc.helpbuf= - "`Long Filenames in File Listings:`\n" - "\n" - "If you want long filenames to be displayed in the BBS file listings, set\n" - "this option to `Yes`. Note: This feature requires Windows 98, Windows 2000\n" - "or later.\n" - ; - i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Long Filenames in Listings (Win98/Win2K)",opt); - if(!i && cfg.file_misc&FM_NO_LFN) { - cfg.file_misc&=~FM_NO_LFN; - uifc.changes=1; - } else if(i==1 && !(cfg.file_misc&FM_NO_LFN)) { - cfg.file_misc|=FM_NO_LFN; - uifc.changes=1; - } - break; - - case 7: - uifc.helpbuf= - "`Leech Protocol Detection Percentage:`\n" - "\n" - "This value is the sensitivity of the leech protocol detection feature of\n" - "Synchronet. If the transfer is apparently unsuccessful, but the transfer\n" - "time was at least this percentage of the estimated transfer time (based\n" - "on the estimated CPS of the connection result code), then a leech\n" - "protocol error is issued and the user's leech download counter is\n" - "incremented. Setting this value to `0` disables leech protocol detection.\n" - ; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Leech Protocol Detection Percentage (0=Disabled)" - ,ultoa(cfg.leech_pct,tmp,10),3,K_EDIT|K_NUMBER); - cfg.leech_pct=atoi(tmp); - if(!cfg.leech_pct) + case 5: + uifc.helpbuf= + "`Default Percentage of Credits to Credit Uploader on Download:`\n" + "\n" + "This is the default setting that will be used when new file\n" + "directories are created.\n" + ; + uifc.input(WIN_MID,0,0 + ,"Default Percentage of Credits to Credit Uploader on Download" + ,ultoa(cfg.cdt_dn_pct,tmp,10),4,K_EDIT|K_NUMBER); + cfg.cdt_dn_pct=atoi(tmp); break; - uifc.helpbuf= - "`Leech Protocol Minimum Time (in Seconds):`\n" - "\n" - "This option allows you to adjust the sensitivity of the leech protocol\n" - "detection feature. This value is the minimum length of transfer time\n" - "(in seconds) that must elapse before an aborted tranfser will be\n" - "considered a possible leech attempt.\n" - ; - uifc.input(WIN_MID,0,0 - ,"Leech Protocol Minimum Time (in Seconds)" - ,ultoa(cfg.leech_sec,tmp,10),3,K_EDIT|K_NUMBER); - cfg.leech_sec=atoi(tmp); - break; - case 8: /* Viewable file types */ - while(1) { - for(i=0;i<cfg.total_fviews && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",cfg.fview[i]->ext,cfg.fview[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(cfg.total_fviews<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.total_fviews) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savfview.cmd[0]) - i|=WIN_PASTE; + case 6: + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=0; uifc.helpbuf= - "`Viewable File Types:`\n" + "`Long Filenames in File Listings:`\n" "\n" - "This is a list of file types that have content information that can be\n" - "viewed through the execution of an external program. Here are a couple of\n" - "command line examples for a few file types.\n" + "If you want long filenames to be displayed in the BBS file listings, set\n" + "this option to `Yes`. Note: This feature requires Windows 98, Windows 2000\n" + "or later.\n" ; - i=uifc.list(i,0,0,50,&fview_dflt,NULL,"Viewable File Types",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savfview = *cfg.fview[i]; - free(cfg.fview[i]); - cfg.total_fviews--; - while(i<cfg.total_fviews) { - cfg.fview[i]=cfg.fview[i+1]; - i++; - } + i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0 + ,"Long Filenames in Listings (Win98/Win2K)",opt); + if(!i && cfg.file_misc&FM_NO_LFN) { + cfg.file_misc&=~FM_NO_LFN; + uifc.changes=1; + } else if(i==1 && !(cfg.file_misc&FM_NO_LFN)) { + cfg.file_misc|=FM_NO_LFN; uifc.changes=1; - continue; } - if(msk == MSK_INS) { - if((cfg.fview=(fview_t **)realloc(cfg.fview - ,sizeof(fview_t *)*(cfg.total_fviews+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fviews+1); - cfg.total_fviews=0; - bail(1); + break; + + case 7: + uifc.helpbuf= + "`Leech Protocol Detection Percentage:`\n" + "\n" + "This value is the sensitivity of the leech protocol detection feature of\n" + "Synchronet. If the transfer is apparently unsuccessful, but the transfer\n" + "time was at least this percentage of the estimated transfer time (based\n" + "on the estimated CPS of the connection result code), then a leech\n" + "protocol error is issued and the user's leech download counter is\n" + "incremented. Setting this value to `0` disables leech protocol detection.\n" + ; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Leech Protocol Detection Percentage (0=Disabled)" + ,ultoa(cfg.leech_pct,tmp,10),3,K_EDIT|K_NUMBER); + cfg.leech_pct=atoi(tmp); + if(!cfg.leech_pct) + break; + uifc.helpbuf= + "`Leech Protocol Minimum Time (in Seconds):`\n" + "\n" + "This option allows you to adjust the sensitivity of the leech protocol\n" + "detection feature. This value is the minimum length of transfer time\n" + "(in seconds) that must elapse before an aborted tranfser will be\n" + "considered a possible leech attempt.\n" + ; + uifc.input(WIN_MID,0,0 + ,"Leech Protocol Minimum Time (in Seconds)" + ,ultoa(cfg.leech_sec,tmp,10),3,K_EDIT|K_NUMBER); + cfg.leech_sec=atoi(tmp); + break; + case 8: /* Viewable file types */ + while(1) { + for(i=0;i<cfg.total_fviews && i<MAX_OPTS;i++) + sprintf(opt[i],"%-3.3s %-40s",cfg.fview[i]->ext,cfg.fview[i]->cmd); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if(cfg.total_fviews<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.total_fviews) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savfview.cmd[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Viewable File Types:`\n" + "\n" + "This is a list of file types that have content information that can be\n" + "viewed through the execution of an external program. Here are a couple of\n" + "command line examples for a few file types.\n" + ; + i=uifc.list(i,0,0,50,&fview_dflt,NULL,"Viewable File Types",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savfview = *cfg.fview[i]; + free(cfg.fview[i]); + cfg.total_fviews--; + while(i<cfg.total_fviews) { + cfg.fview[i]=cfg.fview[i+1]; + i++; + } + uifc.changes=1; continue; } - if(!cfg.total_fviews) { - if((cfg.fview[0]=(fview_t *)malloc( - sizeof(fview_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); + if(msk == MSK_INS) { + if((cfg.fview=(fview_t **)realloc(cfg.fview + ,sizeof(fview_t *)*(cfg.total_fviews+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fviews+1); + cfg.total_fviews=0; + bail(1); continue; } - memset(cfg.fview[0],0,sizeof(fview_t)); - strcpy(cfg.fview[0]->ext,"ZIP"); - strcpy(cfg.fview[0]->cmd,"%@unzip -vq %s"); - } - else { - for(j=cfg.total_fviews;j>i;j--) - cfg.fview[j]=cfg.fview[j-1]; - if((cfg.fview[i]=(fview_t *)malloc( - sizeof(fview_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); - continue; + if(!cfg.total_fviews) { + if((cfg.fview[0]=(fview_t *)malloc( + sizeof(fview_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); + continue; + } + memset(cfg.fview[0],0,sizeof(fview_t)); + strcpy(cfg.fview[0]->ext,"ZIP"); + strcpy(cfg.fview[0]->cmd,"%@unzip -vq %s"); + } + else { + for(j=cfg.total_fviews;j>i;j--) + cfg.fview[j]=cfg.fview[j-1]; + if((cfg.fview[i]=(fview_t *)malloc( + sizeof(fview_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); + continue; + } + if(i>=cfg.total_fviews) + j=i-1; + else + j=i+1; + *cfg.fview[i]=*cfg.fview[j]; } - if(i>=cfg.total_fviews) - j=i-1; - else - j=i+1; - *cfg.fview[i]=*cfg.fview[j]; + cfg.total_fviews++; + uifc.changes=1; + continue; } - cfg.total_fviews++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - savfview=*cfg.fview[i]; - continue; - } - if(msk == MSK_PASTE) { - *cfg.fview[i]=savfview; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,cfg.fview[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,cfg.fview[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,cfg.fview[i]->arstr); - opt[j][0]=0; - switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fview_opt,0 - ,"Viewable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Viewable File Type Extension" - ,cfg.fview[i]->ext,sizeof(cfg.fview[i]->ext)-1,K_EDIT); - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.fview[i]->cmd,sizeof(cfg.fview[i]->cmd)-1,K_EDIT); - break; - case 2: - sprintf(str,"Viewable File Type %s" - ,cfg.fview[i]->ext); - getar(str,cfg.fview[i]->arstr); - break; - } - } - } - break; - case 9: /* Testable file types */ - while(1) { - for(i=0;i<cfg.total_ftests && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",cfg.ftest[i]->ext,cfg.ftest[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(cfg.total_ftests<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.total_ftests) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savftest.cmd[0]) - i|=WIN_PASTE; - uifc.helpbuf= - "`Testable File Types:`\n" - "\n" - "This is a list of file types that will have a command line executed to\n" - "test the file integrity upon their upload. The file types are specified\n" - "by `extension` and if one file extension is listed more than once, each\n" - "command line will be executed. The command lines must return a DOS error\n" - "code of 0 (no error) in order for the file to pass the test. This method\n" - "of file testing upon upload is also known as an upload event. This test\n" - "or event, can do more than just test the file, it can perform any\n" - "function that the sysop wishes. Such as adding comments to an archived\n" - "file, or extracting an archive and performing a virus scan. While the\n" - "external program is executing, a text string is displayed to the user.\n" - "This `working string` can be set for each file type and command line\n" - "listed.\n" - ; - i=uifc.list(i,0,0,50,&ftest_dflt,NULL,"Testable File Types",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savftest = *cfg.ftest[i]; - free(cfg.ftest[i]); - cfg.total_ftests--; - while(i<cfg.total_ftests) { - cfg.ftest[i]=cfg.ftest[i+1]; - i++; + if(msk == MSK_COPY) { + savfview=*cfg.fview[i]; + continue; } - uifc.changes=1; - continue; + if(msk == MSK_PASTE) { + *cfg.fview[i]=savfview; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + done=0; + while(!done) { + j=0; + sprintf(opt[j++],"%-22.22s%s","File Extension" + ,cfg.fview[i]->ext); + sprintf(opt[j++],"%-22.22s%-40s","Command Line" + ,cfg.fview[i]->cmd); + sprintf(opt[j++],"%-22.22s%s","Access Requirements" + ,cfg.fview[i]->arstr); + opt[j][0]=0; + switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fview_opt,0 + ,"Viewable File Type",opt)) { + case -1: + done=1; + break; + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Viewable File Type Extension" + ,cfg.fview[i]->ext,sizeof(cfg.fview[i]->ext)-1,K_EDIT); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.fview[i]->cmd,sizeof(cfg.fview[i]->cmd)-1,K_EDIT); + break; + case 2: + sprintf(str,"Viewable File Type %s" + ,cfg.fview[i]->ext); + getar(str,cfg.fview[i]->arstr); + break; + } + } } - if(msk == MSK_INS) { - if((cfg.ftest=(ftest_t **)realloc(cfg.ftest - ,sizeof(ftest_t *)*(cfg.total_ftests+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_ftests+1); - cfg.total_ftests=0; - bail(1); + break; + case 9: /* Testable file types */ + while(1) { + for(i=0;i<cfg.total_ftests && i<MAX_OPTS;i++) + sprintf(opt[i],"%-3.3s %-40s",cfg.ftest[i]->ext,cfg.ftest[i]->cmd); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if(cfg.total_ftests<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.total_ftests) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savftest.cmd[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Testable File Types:`\n" + "\n" + "This is a list of file types that will have a command line executed to\n" + "test the file integrity upon their upload. The file types are specified\n" + "by `extension` and if one file extension is listed more than once, each\n" + "command line will be executed. The command lines must return a DOS error\n" + "code of 0 (no error) in order for the file to pass the test. This method\n" + "of file testing upon upload is also known as an upload event. This test\n" + "or event, can do more than just test the file, it can perform any\n" + "function that the sysop wishes. Such as adding comments to an archived\n" + "file, or extracting an archive and performing a virus scan. While the\n" + "external program is executing, a text string is displayed to the user.\n" + "This `working string` can be set for each file type and command line\n" + "listed.\n" + ; + i=uifc.list(i,0,0,50,&ftest_dflt,NULL,"Testable File Types",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savftest = *cfg.ftest[i]; + free(cfg.ftest[i]); + cfg.total_ftests--; + while(i<cfg.total_ftests) { + cfg.ftest[i]=cfg.ftest[i+1]; + i++; + } + uifc.changes=1; continue; } - if(!cfg.total_ftests) { - if((cfg.ftest[0]=(ftest_t *)malloc( - sizeof(ftest_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); + if(msk == MSK_INS) { + if((cfg.ftest=(ftest_t **)realloc(cfg.ftest + ,sizeof(ftest_t *)*(cfg.total_ftests+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_ftests+1); + cfg.total_ftests=0; + bail(1); continue; } - memset(cfg.ftest[0],0,sizeof(ftest_t)); - strcpy(cfg.ftest[0]->ext,"ZIP"); - strcpy(cfg.ftest[0]->cmd,"%@unzip -tqq %f"); - strcpy(cfg.ftest[0]->workstr,"Testing ZIP Integrity..."); - } - else { + if(!cfg.total_ftests) { + if((cfg.ftest[0]=(ftest_t *)malloc( + sizeof(ftest_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); + continue; + } + memset(cfg.ftest[0],0,sizeof(ftest_t)); + strcpy(cfg.ftest[0]->ext,"ZIP"); + strcpy(cfg.ftest[0]->cmd,"%@unzip -tqq %f"); + strcpy(cfg.ftest[0]->workstr,"Testing ZIP Integrity..."); + } + else { - for(j=cfg.total_ftests;j>i;j--) - cfg.ftest[j]=cfg.ftest[j-1]; - if((cfg.ftest[i]=(ftest_t *)malloc( - sizeof(ftest_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); - continue; + for(j=cfg.total_ftests;j>i;j--) + cfg.ftest[j]=cfg.ftest[j-1]; + if((cfg.ftest[i]=(ftest_t *)malloc( + sizeof(ftest_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); + continue; + } + if(i>=cfg.total_ftests) + j=i-1; + else + j=i+1; + *cfg.ftest[i]=*cfg.ftest[j]; } - if(i>=cfg.total_ftests) - j=i-1; - else - j=i+1; - *cfg.ftest[i]=*cfg.ftest[j]; + cfg.total_ftests++; + uifc.changes=1; + continue; } - cfg.total_ftests++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - savftest=*cfg.ftest[i]; - continue; - } - if(msk == MSK_PASTE) { - *cfg.ftest[i]=savftest; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,cfg.ftest[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,cfg.ftest[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Working String" - ,cfg.ftest[i]->workstr); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,cfg.ftest[i]->arstr); - opt[j][0]=0; - switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&ftest_opt,0 - ,"Testable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Testable File Type Extension" - ,cfg.ftest[i]->ext,sizeof(cfg.ftest[i]->ext)-1,K_EDIT); - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.ftest[i]->cmd,sizeof(cfg.ftest[i]->cmd)-1,K_EDIT); - break; - case 2: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Working String" - ,cfg.ftest[i]->workstr,sizeof(cfg.ftest[i]->workstr)-1,K_EDIT|K_MSG); - break; - case 3: - sprintf(str,"Testable File Type %s",cfg.ftest[i]->ext); - getar(str,cfg.ftest[i]->arstr); - break; - } - } - } - break; - case 10: /* Download Events */ - while(1) { - for(i=0;i<cfg.total_dlevents && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",cfg.dlevent[i]->ext,cfg.dlevent[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(cfg.total_dlevents<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.total_dlevents) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savdlevent.cmd[0]) - i|=WIN_PASTE; - uifc.helpbuf= - "`Download Events:`\n" - "\n" - "This is a list of file types that will have a command line executed to\n" - "perform an event upon their download (e.g. trigger a download event).\n" - "The file types are specified by `extension` and if one file extension\n" - "is listed more than once, each command line will be executed. The\n" - "command lines must return a DOS error code of 0 (no error) in order\n" - "for the file to pass the test. This test or event, can do more than\n" - "just test the file, it can perform any function that the sysop wishes.\n" - "Such as adding comments to an archived file, or extracting an archive\n" - "and performing a virus scan. While the external program is executing,\n" - "a text string is displayed to the user. This `working string` can be set\n" - "for each file type and command line listed.\n" - ; - i=uifc.list(i,0,0,50,&dlevent_dflt,NULL,"Download Events",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savdlevent = *cfg.dlevent[i]; - free(cfg.dlevent[i]); - cfg.total_dlevents--; - while(i<cfg.total_dlevents) { - cfg.dlevent[i]=cfg.dlevent[i+1]; - i++; + if(msk == MSK_COPY) { + savftest=*cfg.ftest[i]; + continue; } - uifc.changes=1; - continue; + if(msk == MSK_PASTE) { + *cfg.ftest[i]=savftest; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + done=0; + while(!done) { + j=0; + sprintf(opt[j++],"%-22.22s%s","File Extension" + ,cfg.ftest[i]->ext); + sprintf(opt[j++],"%-22.22s%-40s","Command Line" + ,cfg.ftest[i]->cmd); + sprintf(opt[j++],"%-22.22s%s","Working String" + ,cfg.ftest[i]->workstr); + sprintf(opt[j++],"%-22.22s%s","Access Requirements" + ,cfg.ftest[i]->arstr); + opt[j][0]=0; + switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&ftest_opt,0 + ,"Testable File Type",opt)) { + case -1: + done=1; + break; + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Testable File Type Extension" + ,cfg.ftest[i]->ext,sizeof(cfg.ftest[i]->ext)-1,K_EDIT); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.ftest[i]->cmd,sizeof(cfg.ftest[i]->cmd)-1,K_EDIT); + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Working String" + ,cfg.ftest[i]->workstr,sizeof(cfg.ftest[i]->workstr)-1,K_EDIT|K_MSG); + break; + case 3: + sprintf(str,"Testable File Type %s",cfg.ftest[i]->ext); + getar(str,cfg.ftest[i]->arstr); + break; + } + } } - if(msk == MSK_INS) { - if((cfg.dlevent=(dlevent_t **)realloc(cfg.dlevent - ,sizeof(dlevent_t *)*(cfg.total_dlevents+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_dlevents+1); - cfg.total_dlevents=0; - bail(1); + break; + case 10: /* Download Events */ + while(1) { + for(i=0;i<cfg.total_dlevents && i<MAX_OPTS;i++) + sprintf(opt[i],"%-3.3s %-40s",cfg.dlevent[i]->ext,cfg.dlevent[i]->cmd); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if(cfg.total_dlevents<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.total_dlevents) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savdlevent.cmd[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Download Events:`\n" + "\n" + "This is a list of file types that will have a command line executed to\n" + "perform an event upon their download (e.g. trigger a download event).\n" + "The file types are specified by `extension` and if one file extension\n" + "is listed more than once, each command line will be executed. The\n" + "command lines must return a DOS error code of 0 (no error) in order\n" + "for the file to pass the test. This test or event, can do more than\n" + "just test the file, it can perform any function that the sysop wishes.\n" + "Such as adding comments to an archived file, or extracting an archive\n" + "and performing a virus scan. While the external program is executing,\n" + "a text string is displayed to the user. This `working string` can be set\n" + "for each file type and command line listed.\n" + ; + i=uifc.list(i,0,0,50,&dlevent_dflt,NULL,"Download Events",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savdlevent = *cfg.dlevent[i]; + free(cfg.dlevent[i]); + cfg.total_dlevents--; + while(i<cfg.total_dlevents) { + cfg.dlevent[i]=cfg.dlevent[i+1]; + i++; + } + uifc.changes=1; continue; } - if(!cfg.total_dlevents) { - if((cfg.dlevent[0]=(dlevent_t *)malloc( - sizeof(dlevent_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); + if(msk == MSK_INS) { + if((cfg.dlevent=(dlevent_t **)realloc(cfg.dlevent + ,sizeof(dlevent_t *)*(cfg.total_dlevents+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_dlevents+1); + cfg.total_dlevents=0; + bail(1); continue; } - memset(cfg.dlevent[0],0,sizeof(dlevent_t)); - strcpy(cfg.dlevent[0]->ext,"ZIP"); - strcpy(cfg.dlevent[0]->cmd,"%@zip -z %f < %zzipmsg.txt"); - strcpy(cfg.dlevent[0]->workstr,"Adding ZIP Comment..."); - } - else { + if(!cfg.total_dlevents) { + if((cfg.dlevent[0]=(dlevent_t *)malloc( + sizeof(dlevent_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); + continue; + } + memset(cfg.dlevent[0],0,sizeof(dlevent_t)); + strcpy(cfg.dlevent[0]->ext,"ZIP"); + strcpy(cfg.dlevent[0]->cmd,"%@zip -z %f < %zzipmsg.txt"); + strcpy(cfg.dlevent[0]->workstr,"Adding ZIP Comment..."); + } + else { - for(j=cfg.total_dlevents;j>i;j--) - cfg.dlevent[j]=cfg.dlevent[j-1]; - if((cfg.dlevent[i]=(dlevent_t *)malloc( - sizeof(dlevent_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); - continue; + for(j=cfg.total_dlevents;j>i;j--) + cfg.dlevent[j]=cfg.dlevent[j-1]; + if((cfg.dlevent[i]=(dlevent_t *)malloc( + sizeof(dlevent_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); + continue; + } + if(i>=cfg.total_dlevents) + j=i-1; + else + j=i+1; + *cfg.dlevent[i]=*cfg.dlevent[j]; } - if(i>=cfg.total_dlevents) - j=i-1; - else - j=i+1; - *cfg.dlevent[i]=*cfg.dlevent[j]; + cfg.total_dlevents++; + uifc.changes=1; + continue; } - cfg.total_dlevents++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - savdlevent=*cfg.dlevent[i]; - continue; - } - if(msk == MSK_PASTE) { - *cfg.dlevent[i]=savdlevent; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,cfg.dlevent[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,cfg.dlevent[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Working String" - ,cfg.dlevent[i]->workstr); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,cfg.dlevent[i]->arstr); - opt[j][0]=0; - switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&dlevent_opt,0 - ,"Download Event",opt)) { - case -1: - done=1; - break; - case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Download Event Extension" - ,cfg.dlevent[i]->ext,sizeof(cfg.dlevent[i]->ext)-1,K_EDIT); - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.dlevent[i]->cmd,sizeof(cfg.dlevent[i]->cmd)-1,K_EDIT); - break; - case 2: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Working String" - ,cfg.dlevent[i]->workstr,sizeof(cfg.dlevent[i]->workstr)-1,K_EDIT|K_MSG); - break; - case 3: - sprintf(str,"Download Event %s",cfg.dlevent[i]->ext); - getar(str,cfg.dlevent[i]->arstr); - break; - } - } - } - break; - case 11: /* Extractable file types */ - while(1) { - for(i=0;i<cfg.total_fextrs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s" - ,cfg.fextr[i]->ext,cfg.fextr[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(cfg.total_fextrs<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.total_fextrs) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savfextr.cmd[0]) - i|=WIN_PASTE; - uifc.helpbuf= - "`Extractable File Types:`\n" - "\n" - "This is a list of archive file types that can be extracted to the temp\n" - "directory by an external program. The file types are specified by their\n" - "extension. For each file type you must specify the command line used to\n" - "extract the file(s).\n" - ; - i=uifc.list(i,0,0,50,&fextr_dflt,NULL,"Extractable File Types",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savfextr = *cfg.fextr[i]; - free(cfg.fextr[i]); - cfg.total_fextrs--; - while(i<cfg.total_fextrs) { - cfg.fextr[i]=cfg.fextr[i+1]; - i++; + if(msk == MSK_COPY) { + savdlevent=*cfg.dlevent[i]; + continue; } - uifc.changes=1; - continue; - } - if(msk == MSK_INS) { - if((cfg.fextr=(fextr_t **)realloc(cfg.fextr - ,sizeof(fextr_t *)*(cfg.total_fextrs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fextrs+1); - cfg.total_fextrs=0; - bail(1); + if(msk == MSK_PASTE) { + *cfg.dlevent[i]=savdlevent; + uifc.changes=1; continue; } - if(!cfg.total_fextrs) { - if((cfg.fextr[0]=(fextr_t *)malloc( - sizeof(fextr_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); - continue; + if (msk != 0) + continue; + done=0; + while(!done) { + j=0; + sprintf(opt[j++],"%-22.22s%s","File Extension" + ,cfg.dlevent[i]->ext); + sprintf(opt[j++],"%-22.22s%-40s","Command Line" + ,cfg.dlevent[i]->cmd); + sprintf(opt[j++],"%-22.22s%s","Working String" + ,cfg.dlevent[i]->workstr); + sprintf(opt[j++],"%-22.22s%s","Access Requirements" + ,cfg.dlevent[i]->arstr); + opt[j][0]=0; + switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&dlevent_opt,0 + ,"Download Event",opt)) { + case -1: + done=1; + break; + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Download Event Extension" + ,cfg.dlevent[i]->ext,sizeof(cfg.dlevent[i]->ext)-1,K_EDIT); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.dlevent[i]->cmd,sizeof(cfg.dlevent[i]->cmd)-1,K_EDIT); + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Working String" + ,cfg.dlevent[i]->workstr,sizeof(cfg.dlevent[i]->workstr)-1,K_EDIT|K_MSG); + break; + case 3: + sprintf(str,"Download Event %s",cfg.dlevent[i]->ext); + getar(str,cfg.dlevent[i]->arstr); + break; + } + } + } + break; + case 11: /* Extractable file types */ + while(1) { + for(i=0;i<cfg.total_fextrs && i<MAX_OPTS;i++) + sprintf(opt[i],"%-3.3s %-40s" + ,cfg.fextr[i]->ext,cfg.fextr[i]->cmd); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if(cfg.total_fextrs<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.total_fextrs) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savfextr.cmd[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Extractable File Types:`\n" + "\n" + "This is a list of archive file types that can be extracted to the temp\n" + "directory by an external program. The file types are specified by their\n" + "extension. For each file type you must specify the command line used to\n" + "extract the file(s).\n" + ; + i=uifc.list(i,0,0,50,&fextr_dflt,NULL,"Extractable File Types",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savfextr = *cfg.fextr[i]; + free(cfg.fextr[i]); + cfg.total_fextrs--; + while(i<cfg.total_fextrs) { + cfg.fextr[i]=cfg.fextr[i+1]; + i++; } - memset(cfg.fextr[0],0,sizeof(fextr_t)); - strcpy(cfg.fextr[0]->ext,"ZIP"); - strcpy(cfg.fextr[0]->cmd,"%@unzip -Cojqq %f %s -d %g"); + uifc.changes=1; + continue; } - else { + if(msk == MSK_INS) { + if((cfg.fextr=(fextr_t **)realloc(cfg.fextr + ,sizeof(fextr_t *)*(cfg.total_fextrs+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fextrs+1); + cfg.total_fextrs=0; + bail(1); + continue; + } + if(!cfg.total_fextrs) { + if((cfg.fextr[0]=(fextr_t *)malloc( + sizeof(fextr_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); + continue; + } + memset(cfg.fextr[0],0,sizeof(fextr_t)); + strcpy(cfg.fextr[0]->ext,"ZIP"); + strcpy(cfg.fextr[0]->cmd,"%@unzip -Cojqq %f %s -d %g"); + } + else { - for(j=cfg.total_fextrs;j>i;j--) - cfg.fextr[j]=cfg.fextr[j-1]; - if((cfg.fextr[i]=(fextr_t *)malloc( - sizeof(fextr_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); - continue; + for(j=cfg.total_fextrs;j>i;j--) + cfg.fextr[j]=cfg.fextr[j-1]; + if((cfg.fextr[i]=(fextr_t *)malloc( + sizeof(fextr_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); + continue; + } + if(i>=cfg.total_fextrs) + j=i-1; + else + j=i+1; + *cfg.fextr[i]=*cfg.fextr[j]; } - if(i>=cfg.total_fextrs) - j=i-1; - else - j=i+1; - *cfg.fextr[i]=*cfg.fextr[j]; + cfg.total_fextrs++; + uifc.changes=1; + continue; } - cfg.total_fextrs++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - savfextr=*cfg.fextr[i]; - continue; - } - if(msk == MSK_PASTE) { - *cfg.fextr[i]=savfextr; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,cfg.fextr[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,cfg.fextr[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,cfg.fextr[i]->arstr); - opt[j][0]=0; - switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fextr_opt,0 - ,"Extractable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Extractable File Type Extension" - ,cfg.fextr[i]->ext,sizeof(cfg.fextr[i]->ext)-1,K_EDIT); - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.fextr[i]->cmd,sizeof(cfg.fextr[i]->cmd)-1,K_EDIT); - break; - case 2: - sprintf(str,"Extractable File Type %s" - ,cfg.fextr[i]->ext); - getar(str,cfg.fextr[i]->arstr); - break; - } - } - } - break; - case 12: /* Compressable file types */ - while(1) { - for(i=0;i<cfg.total_fcomps && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",cfg.fcomp[i]->ext,cfg.fcomp[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(cfg.total_fcomps<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.total_fcomps) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savfcomp.cmd[0]) - i|=WIN_PASTE; - uifc.helpbuf= - "`Compressable File Types:`\n" - "\n" - "This is a list of compression methods available for different file types.\n" - "These will be used for items such as creating QWK packets, temporary\n" - "files from the transfer section, and more.\n" - ; - i=uifc.list(i,0,0,50,&fcomp_dflt,NULL,"Compressable File Types",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savfcomp = *cfg.fcomp[i]; - free(cfg.fcomp[i]); - cfg.total_fcomps--; - while(i<cfg.total_fcomps) { - cfg.fcomp[i]=cfg.fcomp[i+1]; - i++; + if(msk == MSK_COPY) { + savfextr=*cfg.fextr[i]; + continue; } - uifc.changes=1; - continue; - } - if(msk == MSK_INS) { - if((cfg.fcomp=(fcomp_t **)realloc(cfg.fcomp - ,sizeof(fcomp_t *)*(cfg.total_fcomps+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fcomps+1); - cfg.total_fcomps=0; - bail(1); + if(msk == MSK_PASTE) { + *cfg.fextr[i]=savfextr; + uifc.changes=1; continue; } - if(!cfg.total_fcomps) { - if((cfg.fcomp[0]=(fcomp_t *)malloc( - sizeof(fcomp_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); - continue; + if (msk != 0) + continue; + done=0; + while(!done) { + j=0; + sprintf(opt[j++],"%-22.22s%s","File Extension" + ,cfg.fextr[i]->ext); + sprintf(opt[j++],"%-22.22s%-40s","Command Line" + ,cfg.fextr[i]->cmd); + sprintf(opt[j++],"%-22.22s%s","Access Requirements" + ,cfg.fextr[i]->arstr); + opt[j][0]=0; + switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fextr_opt,0 + ,"Extractable File Type",opt)) { + case -1: + done=1; + break; + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Extractable File Type Extension" + ,cfg.fextr[i]->ext,sizeof(cfg.fextr[i]->ext)-1,K_EDIT); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.fextr[i]->cmd,sizeof(cfg.fextr[i]->cmd)-1,K_EDIT); + break; + case 2: + sprintf(str,"Extractable File Type %s" + ,cfg.fextr[i]->ext); + getar(str,cfg.fextr[i]->arstr); + break; + } + } + } + break; + case 12: /* Compressable file types */ + while(1) { + for(i=0;i<cfg.total_fcomps && i<MAX_OPTS;i++) + sprintf(opt[i],"%-3.3s %-40s",cfg.fcomp[i]->ext,cfg.fcomp[i]->cmd); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if(cfg.total_fcomps<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.total_fcomps) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savfcomp.cmd[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Compressable File Types:`\n" + "\n" + "This is a list of compression methods available for different file types.\n" + "These will be used for items such as creating QWK packets, temporary\n" + "files from the transfer section, and more.\n" + ; + i=uifc.list(i,0,0,50,&fcomp_dflt,NULL,"Compressable File Types",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savfcomp = *cfg.fcomp[i]; + free(cfg.fcomp[i]); + cfg.total_fcomps--; + while(i<cfg.total_fcomps) { + cfg.fcomp[i]=cfg.fcomp[i+1]; + i++; } - memset(cfg.fcomp[0],0,sizeof(fcomp_t)); - strcpy(cfg.fcomp[0]->ext,"ZIP"); - strcpy(cfg.fcomp[0]->cmd,"%@zip -jD %f %s"); + uifc.changes=1; + continue; } - else { - for(j=cfg.total_fcomps;j>i;j--) - cfg.fcomp[j]=cfg.fcomp[j-1]; - if((cfg.fcomp[i]=(fcomp_t *)malloc( - sizeof(fcomp_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); + if(msk == MSK_INS) { + if((cfg.fcomp=(fcomp_t **)realloc(cfg.fcomp + ,sizeof(fcomp_t *)*(cfg.total_fcomps+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fcomps+1); + cfg.total_fcomps=0; + bail(1); continue; } - if(i>=cfg.total_fcomps) - j=i-1; - else - j=i+1; - *cfg.fcomp[i]=*cfg.fcomp[j]; + if(!cfg.total_fcomps) { + if((cfg.fcomp[0]=(fcomp_t *)malloc( + sizeof(fcomp_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); + continue; + } + memset(cfg.fcomp[0],0,sizeof(fcomp_t)); + strcpy(cfg.fcomp[0]->ext,"ZIP"); + strcpy(cfg.fcomp[0]->cmd,"%@zip -jD %f %s"); + } + else { + for(j=cfg.total_fcomps;j>i;j--) + cfg.fcomp[j]=cfg.fcomp[j-1]; + if((cfg.fcomp[i]=(fcomp_t *)malloc( + sizeof(fcomp_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); + continue; + } + if(i>=cfg.total_fcomps) + j=i-1; + else + j=i+1; + *cfg.fcomp[i]=*cfg.fcomp[j]; + } + cfg.total_fcomps++; + uifc.changes=1; + continue; } - cfg.total_fcomps++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - savfcomp=*cfg.fcomp[i]; - continue; - } - if(msk == MSK_PASTE) { - *cfg.fcomp[i]=savfcomp; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,cfg.fcomp[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,cfg.fcomp[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,cfg.fcomp[i]->arstr); - opt[j][0]=0; - switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fcomp_opt,0 - ,"Compressable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Compressable File Type Extension" - ,cfg.fcomp[i]->ext,sizeof(cfg.fcomp[i]->ext)-1,K_EDIT); - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.fcomp[i]->cmd,sizeof(cfg.fcomp[i]->cmd)-1,K_EDIT); - break; - case 2: - sprintf(str,"Compressable File Type %s" - ,cfg.fcomp[i]->ext); - getar(str,cfg.fcomp[i]->arstr); - break; - } - } - } - break; - case 13: /* Transfer protocols */ - while(1) { - for(i=0;i<cfg.total_prots && i<MAX_OPTS;i++) - sprintf(opt[i],"%c %s" - ,cfg.prot[i]->mnemonic,cfg.prot[i]->name); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(cfg.total_prots<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.total_prots) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savprot.mnemonic) - i|=WIN_PASTE; - uifc.helpbuf= - "`File Transfer Protocols:`\n" - "\n" - "This is a list of file transfer protocols that can be used to transfer\n" - "files either to or from a remote user. For each protocol, you can\n" - "specify the mnemonic (hot-key) to use to specify that protocol, the\n" - "command line to use for uploads, downloads, batch uploads, batch\n" - "downloads, bi-directional file transfers, support of DSZLOG, and (for\n" - "*nix only) if it uses socket I/O or the more common stdio.\n" - "\n" - "If the protocol doesn't support a certain method of transfer, or you\n" - "don't wish it to be available for a certain method of transfer, leave\n" - "the command line for that method blank.\n" - ; - i=uifc.list(i,0,0,50,&prot_dflt,NULL,"File Transfer Protocols",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - savprot = *cfg.prot[i]; - free(cfg.prot[i]); - cfg.total_prots--; - while(i<cfg.total_prots) { - cfg.prot[i]=cfg.prot[i+1]; - i++; + if(msk == MSK_COPY) { + savfcomp=*cfg.fcomp[i]; + continue; } - uifc.changes=1; - continue; - } - if(msk == MSK_INS) { - if((cfg.prot=(prot_t **)realloc(cfg.prot - ,sizeof(prot_t *)*(cfg.total_prots+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_prots+1); - cfg.total_prots=0; - bail(1); + if(msk == MSK_PASTE) { + *cfg.fcomp[i]=savfcomp; + uifc.changes=1; continue; } - if(!cfg.total_prots) { - if((cfg.prot[0]=(prot_t *)malloc( - sizeof(prot_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); - continue; + if (msk != 0) + continue; + done=0; + while(!done) { + j=0; + sprintf(opt[j++],"%-22.22s%s","File Extension" + ,cfg.fcomp[i]->ext); + sprintf(opt[j++],"%-22.22s%-40s","Command Line" + ,cfg.fcomp[i]->cmd); + sprintf(opt[j++],"%-22.22s%s","Access Requirements" + ,cfg.fcomp[i]->arstr); + opt[j][0]=0; + switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fcomp_opt,0 + ,"Compressable File Type",opt)) { + case -1: + done=1; + break; + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Compressable File Type Extension" + ,cfg.fcomp[i]->ext,sizeof(cfg.fcomp[i]->ext)-1,K_EDIT); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.fcomp[i]->cmd,sizeof(cfg.fcomp[i]->cmd)-1,K_EDIT); + break; + case 2: + sprintf(str,"Compressable File Type %s" + ,cfg.fcomp[i]->ext); + getar(str,cfg.fcomp[i]->arstr); + break; + } + } + } + break; + case 13: /* Transfer protocols */ + while(1) { + for(i=0;i<cfg.total_prots && i<MAX_OPTS;i++) + sprintf(opt[i],"%c %s" + ,cfg.prot[i]->mnemonic,cfg.prot[i]->name); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if(cfg.total_prots<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.total_prots) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savprot.mnemonic) + i|=WIN_PASTE; + uifc.helpbuf= + "`File Transfer Protocols:`\n" + "\n" + "This is a list of file transfer protocols that can be used to transfer\n" + "files either to or from a remote user. For each protocol, you can\n" + "specify the mnemonic (hot-key) to use to specify that protocol, the\n" + "command line to use for uploads, downloads, batch uploads, batch\n" + "downloads, bi-directional file transfers, support of DSZLOG, and (for\n" + "*nix only) if it uses socket I/O or the more common stdio.\n" + "\n" + "If the protocol doesn't support a certain method of transfer, or you\n" + "don't wish it to be available for a certain method of transfer, leave\n" + "the command line for that method blank.\n" + ; + i=uifc.list(i,0,0,50,&prot_dflt,NULL,"File Transfer Protocols",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + savprot = *cfg.prot[i]; + free(cfg.prot[i]); + cfg.total_prots--; + while(i<cfg.total_prots) { + cfg.prot[i]=cfg.prot[i+1]; + i++; } - memset(cfg.prot[0],0,sizeof(prot_t)); - cfg.prot[0]->mnemonic='?'; - } else { - for(j=cfg.total_prots;j>i;j--) - cfg.prot[j]=cfg.prot[j-1]; - if((cfg.prot[i]=(prot_t *)malloc( - sizeof(prot_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); + uifc.changes=1; + continue; + } + if(msk == MSK_INS) { + if((cfg.prot=(prot_t **)realloc(cfg.prot + ,sizeof(prot_t *)*(cfg.total_prots+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_prots+1); + cfg.total_prots=0; + bail(1); continue; } - if(i>=cfg.total_prots) - j=i-1; - else - j=i+1; - *cfg.prot[i]=*cfg.prot[j]; - } - cfg.total_prots++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - savprot=*cfg.prot[i]; - continue; - } - if(msk == MSK_PASTE) { - *cfg.prot[i]=savprot; - uifc.changes=1; - continue; - } - if (msk != 0) - continue; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-30.30s%c","Mnemonic (Command Key)" - ,cfg.prot[i]->mnemonic); - sprintf(opt[j++],"%-30.30s%-40s","Protocol Name" - ,cfg.prot[i]->name); - sprintf(opt[j++],"%-30.30s%-40s","Access Requirements" - ,cfg.prot[i]->arstr); - sprintf(opt[j++],"%-30.30s%-40s","Upload Command Line" - ,cfg.prot[i]->ulcmd); - sprintf(opt[j++],"%-30.30s%-40s","Download Command Line" - ,cfg.prot[i]->dlcmd); - sprintf(opt[j++],"%-30.30s%-40s","Batch Upload Command Line" - ,cfg.prot[i]->batulcmd); - sprintf(opt[j++],"%-30.30s%-40s","Batch Download Command Line" - ,cfg.prot[i]->batdlcmd); - sprintf(opt[j++],"%-30.30s%-40s","Bi-dir Command Line" - ,cfg.prot[i]->bicmd); - sprintf(opt[j++],"%-30.30s%s", "Native (32-bit) Executable" - ,cfg.prot[i]->misc&PROT_NATIVE ? "Yes" : "No"); - sprintf(opt[j++],"%-30.30s%s", "Supports DSZLOG" - ,cfg.prot[i]->misc&PROT_DSZLOG ? "Yes":"No"); - sprintf(opt[j++],"%-30.30s%s", "Socket I/O" - ,cfg.prot[i]->misc&PROT_SOCKET ? "Yes":"No"); - opt[j][0]=0; - switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,70,&prot_opt,0 - ,"File Transfer Protocol",opt)) { - case -1: - done=1; - break; - case 0: - str[0]=cfg.prot[i]->mnemonic; - str[1]=0; - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Mnemonic (Command Key)" - ,str,1,K_UPPER|K_EDIT); - if(str[0]) - cfg.prot[i]->mnemonic=str[0]; - break; - case 1: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Protocol Name" - ,cfg.prot[i]->name,sizeof(cfg.prot[i]->name)-1,K_EDIT); - break; - case 2: - sprintf(str,"Protocol %s",cfg.prot[i]->name); - getar(str,cfg.prot[i]->arstr); - break; - case 3: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.prot[i]->ulcmd,sizeof(cfg.prot[i]->ulcmd)-1,K_EDIT); - break; - case 4: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.prot[i]->dlcmd,sizeof(cfg.prot[i]->dlcmd)-1,K_EDIT); - break; - case 5: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.prot[i]->batulcmd,sizeof(cfg.prot[i]->batulcmd)-1,K_EDIT); - break; - case 6: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.prot[i]->batdlcmd,sizeof(cfg.prot[i]->batdlcmd)-1,K_EDIT); - break; - case 7: - uifc.input(WIN_MID|WIN_SAV,0,0 - ,"Command" - ,cfg.prot[i]->bicmd,sizeof(cfg.prot[i]->bicmd)-1,K_EDIT); - break; - case 8: - l=cfg.prot[i]->misc&PROT_NATIVE ? 0:1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 - ,"Native (32-bit) Executable",opt); - if((l==0 && !(cfg.prot[i]->misc&PROT_NATIVE)) - || (l==1 && cfg.prot[i]->misc&PROT_NATIVE)) { - cfg.prot[i]->misc^=PROT_NATIVE; - uifc.changes=1; + if(!cfg.total_prots) { + if((cfg.prot[0]=(prot_t *)malloc( + sizeof(prot_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); + continue; } - break; - case 9: - l=cfg.prot[i]->misc&PROT_DSZLOG ? 0:1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 - ,"Uses DSZLOG",opt); - if((l==0 && !(cfg.prot[i]->misc&PROT_DSZLOG)) - || (l==1 && cfg.prot[i]->misc&PROT_DSZLOG)) { - cfg.prot[i]->misc^=PROT_DSZLOG; - uifc.changes=1; + memset(cfg.prot[0],0,sizeof(prot_t)); + cfg.prot[0]->mnemonic='?'; + } else { + for(j=cfg.total_prots;j>i;j--) + cfg.prot[j]=cfg.prot[j-1]; + if((cfg.prot[i]=(prot_t *)malloc( + sizeof(prot_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); + continue; } - break; - case 10: - l=cfg.prot[i]->misc&PROT_SOCKET ? 0:1l; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 - ,"Uses Socket I/O",opt); - if((l==0 && !(cfg.prot[i]->misc&PROT_SOCKET)) - || (l==1 && cfg.prot[i]->misc&PROT_SOCKET)) { - cfg.prot[i]->misc^=PROT_SOCKET; - uifc.changes=1; - } - break; - } - } - } - break; - case 14: /* Alternate file paths */ - while(1) { - for(i=0;i<cfg.altpaths;i++) - sprintf(opt[i],"%3d: %-40s",i+1,cfg.altpath[i]); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if((int)cfg.altpaths<MAX_OPTS) - i|=WIN_INS|WIN_XTR; - if(cfg.altpaths) - i|=WIN_DEL|WIN_COPY|WIN_CUT; - if(savaltpath[0]) - i|=WIN_PASTE; - uifc.helpbuf= - "`Alternate File Paths:`\n" - "\n" - "This option allows the sysop to add and configure alternate file paths\n" - "for files stored on drives and directories other than the configured\n" - "storage path for a file directory. This command is useful for those who\n" - "have file directories where they wish to have files listed from\n" - "multiple CD-ROMs or hard disks.\n" - ; - i=uifc.list(i,0,0,50,&altpath_dflt,NULL,"Alternate File Paths",opt); - if(i==-1) - break; - int msk = i & MSK_ON; - i &= MSK_OFF; - if(msk == MSK_DEL || msk == MSK_CUT) { - if(msk == MSK_CUT) - SAFECOPY(savaltpath, cfg.altpath[i]); - free(cfg.altpath[i]); - cfg.altpaths--; - while(i<cfg.altpaths) { - cfg.altpath[i]=cfg.altpath[i+1]; - i++; + if(i>=cfg.total_prots) + j=i-1; + else + j=i+1; + *cfg.prot[i]=*cfg.prot[j]; + } + cfg.total_prots++; + uifc.changes=1; + continue; } - uifc.changes=1; - continue; - } - if(msk == MSK_INS) { - if((cfg.altpath=(char **)realloc(cfg.altpath - ,sizeof(char *)*(cfg.altpaths+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,cfg.altpaths+1); - cfg.altpaths=0; - bail(1); - continue; + if(msk == MSK_COPY) { + savprot=*cfg.prot[i]; + continue; } - if(!cfg.altpaths) { - if((cfg.altpath[0]=(char *)malloc(LEN_DIR+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); - continue; + if(msk == MSK_PASTE) { + *cfg.prot[i]=savprot; + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + done=0; + while(!done) { + j=0; + sprintf(opt[j++],"%-30.30s%c","Mnemonic (Command Key)" + ,cfg.prot[i]->mnemonic); + sprintf(opt[j++],"%-30.30s%-40s","Protocol Name" + ,cfg.prot[i]->name); + sprintf(opt[j++],"%-30.30s%-40s","Access Requirements" + ,cfg.prot[i]->arstr); + sprintf(opt[j++],"%-30.30s%-40s","Upload Command Line" + ,cfg.prot[i]->ulcmd); + sprintf(opt[j++],"%-30.30s%-40s","Download Command Line" + ,cfg.prot[i]->dlcmd); + sprintf(opt[j++],"%-30.30s%-40s","Batch Upload Command Line" + ,cfg.prot[i]->batulcmd); + sprintf(opt[j++],"%-30.30s%-40s","Batch Download Command Line" + ,cfg.prot[i]->batdlcmd); + sprintf(opt[j++],"%-30.30s%-40s","Bi-dir Command Line" + ,cfg.prot[i]->bicmd); + sprintf(opt[j++],"%-30.30s%s", "Native (32-bit) Executable" + ,cfg.prot[i]->misc&PROT_NATIVE ? "Yes" : "No"); + sprintf(opt[j++],"%-30.30s%s", "Supports DSZLOG" + ,cfg.prot[i]->misc&PROT_DSZLOG ? "Yes":"No"); + sprintf(opt[j++],"%-30.30s%s", "Socket I/O" + ,cfg.prot[i]->misc&PROT_SOCKET ? "Yes":"No"); + opt[j][0]=0; + switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,70,&prot_opt,0 + ,"File Transfer Protocol",opt)) { + case -1: + done=1; + break; + case 0: + str[0]=cfg.prot[i]->mnemonic; + str[1]=0; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Mnemonic (Command Key)" + ,str,1,K_UPPER|K_EDIT); + if(str[0]) + cfg.prot[i]->mnemonic=str[0]; + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Protocol Name" + ,cfg.prot[i]->name,sizeof(cfg.prot[i]->name)-1,K_EDIT); + break; + case 2: + sprintf(str,"Protocol %s",cfg.prot[i]->name); + getar(str,cfg.prot[i]->arstr); + break; + case 3: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.prot[i]->ulcmd,sizeof(cfg.prot[i]->ulcmd)-1,K_EDIT); + break; + case 4: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.prot[i]->dlcmd,sizeof(cfg.prot[i]->dlcmd)-1,K_EDIT); + break; + case 5: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.prot[i]->batulcmd,sizeof(cfg.prot[i]->batulcmd)-1,K_EDIT); + break; + case 6: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.prot[i]->batdlcmd,sizeof(cfg.prot[i]->batdlcmd)-1,K_EDIT); + break; + case 7: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Command" + ,cfg.prot[i]->bicmd,sizeof(cfg.prot[i]->bicmd)-1,K_EDIT); + break; + case 8: + l=cfg.prot[i]->misc&PROT_NATIVE ? 0:1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 + ,"Native (32-bit) Executable",opt); + if((l==0 && !(cfg.prot[i]->misc&PROT_NATIVE)) + || (l==1 && cfg.prot[i]->misc&PROT_NATIVE)) { + cfg.prot[i]->misc^=PROT_NATIVE; + uifc.changes=1; + } + break; + case 9: + l=cfg.prot[i]->misc&PROT_DSZLOG ? 0:1; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 + ,"Uses DSZLOG",opt); + if((l==0 && !(cfg.prot[i]->misc&PROT_DSZLOG)) + || (l==1 && cfg.prot[i]->misc&PROT_DSZLOG)) { + cfg.prot[i]->misc^=PROT_DSZLOG; + uifc.changes=1; + } + break; + case 10: + l=cfg.prot[i]->misc&PROT_SOCKET ? 0:1l; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0 + ,"Uses Socket I/O",opt); + if((l==0 && !(cfg.prot[i]->misc&PROT_SOCKET)) + || (l==1 && cfg.prot[i]->misc&PROT_SOCKET)) { + cfg.prot[i]->misc^=PROT_SOCKET; + uifc.changes=1; + } + break; + } + } + } + break; + case 14: /* Alternate file paths */ + while(1) { + for(i=0;i<cfg.altpaths;i++) + sprintf(opt[i],"%3d: %-40s",i+1,cfg.altpath[i]); + opt[i][0]=0; + i=WIN_ACT|WIN_SAV; /* save cause size can change */ + if((int)cfg.altpaths<MAX_OPTS) + i|=WIN_INS|WIN_XTR; + if(cfg.altpaths) + i|=WIN_DEL|WIN_COPY|WIN_CUT; + if(savaltpath[0]) + i|=WIN_PASTE; + uifc.helpbuf= + "`Alternate File Paths:`\n" + "\n" + "This option allows the sysop to add and configure alternate file paths\n" + "for files stored on drives and directories other than the configured\n" + "storage path for a file directory. This command is useful for those who\n" + "have file directories where they wish to have files listed from\n" + "multiple CD-ROMs or hard disks.\n" + ; + i=uifc.list(i,0,0,50,&altpath_dflt,NULL,"Alternate File Paths",opt); + if(i==-1) + break; + int msk = i & MSK_ON; + i &= MSK_OFF; + if(msk == MSK_DEL || msk == MSK_CUT) { + if(msk == MSK_CUT) + SAFECOPY(savaltpath, cfg.altpath[i]); + free(cfg.altpath[i]); + cfg.altpaths--; + while(i<cfg.altpaths) { + cfg.altpath[i]=cfg.altpath[i+1]; + i++; } - memset(cfg.altpath[0],0,LEN_DIR+1); + uifc.changes=1; + continue; } - else { - for(j=cfg.altpaths;j>i;j--) - cfg.altpath[j]=cfg.altpath[j-1]; - if((cfg.altpath[i]=(char *)malloc(LEN_DIR+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); + if(msk == MSK_INS) { + if((cfg.altpath=(char **)realloc(cfg.altpath + ,sizeof(char *)*(cfg.altpaths+1)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,cfg.altpaths+1); + cfg.altpaths=0; + bail(1); continue; } - if(i>=cfg.altpaths) - j=i-1; - else - j=i+1; - memcpy(cfg.altpath[i],cfg.altpath[j],LEN_DIR+1); + if(!cfg.altpaths) { + if((cfg.altpath[0]=(char *)malloc(LEN_DIR+1))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); + continue; + } + memset(cfg.altpath[0],0,LEN_DIR+1); + } + else { + for(j=cfg.altpaths;j>i;j--) + cfg.altpath[j]=cfg.altpath[j-1]; + if((cfg.altpath[i]=(char *)malloc(LEN_DIR+1))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); + continue; + } + if(i>=cfg.altpaths) + j=i-1; + else + j=i+1; + memcpy(cfg.altpath[i],cfg.altpath[j],LEN_DIR+1); + } + cfg.altpaths++; + uifc.changes=1; + continue; } - cfg.altpaths++; - uifc.changes=1; - continue; - } - if(msk == MSK_COPY) { - SAFECOPY(savaltpath,cfg.altpath[i]); - continue; - } - if(msk == MSK_PASTE) { - memcpy(cfg.altpath[i],savaltpath,LEN_DIR+1); - uifc.changes=1; - continue; + if(msk == MSK_COPY) { + SAFECOPY(savaltpath,cfg.altpath[i]); + continue; + } + if(msk == MSK_PASTE) { + memcpy(cfg.altpath[i],savaltpath,LEN_DIR+1); + uifc.changes=1; + continue; + } + if (msk != 0) + continue; + sprintf(str,"Path %d",i+1); + uifc.input(WIN_MID|WIN_SAV,0,0,str,cfg.altpath[i],LEN_DIR,K_EDIT); } - if (msk != 0) - continue; - sprintf(str,"Path %d",i+1); - uifc.input(WIN_MID|WIN_SAV,0,0,str,cfg.altpath[i],LEN_DIR,K_EDIT); - } - break; + break; } } } -