From fd4bbce4f703b738b35f33ee694074bd5b068d0c Mon Sep 17 00:00:00 2001 From: "Rob Swindell (on Windows 11)" <rob@synchro.net> Date: Wed, 13 Nov 2024 00:32:12 -0800 Subject: [PATCH] Add a 'misc' field for System/Fixed Events allow disabling and "Native" Configured in SCFG->External Programs->Fixed Events and the Node Daily Events configured in SCFG->Nodes, now can be disabled (without just clearing the command-line) and toggle-on "Native", so the program doesn't have to be added to the dreaded "Native Program List" in order to *not* be treated as a 16-bit DOS program (the default). Eventually I'll allow multiple of each time of system fixed event, but this is an improvement for now at least. --- src/sbbs3/logon.cpp | 6 ++--- src/sbbs3/logout.cpp | 6 ++--- src/sbbs3/main.cpp | 18 ++++++------- src/sbbs3/scfg/scfg.h | 1 + src/sbbs3/scfg/scfgnode.c | 5 ++-- src/sbbs3/scfg/scfgxtrn.c | 54 ++++++++++++++++++++++++++++----------- src/sbbs3/scfgdefs.h | 15 +++++++---- src/sbbs3/scfglib1.c | 15 +++++++---- src/sbbs3/scfgsave.c | 15 +++++++---- 9 files changed, 87 insertions(+), 48 deletions(-) diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp index 9dafc9668e..2f64c0f635 100644 --- a/src/sbbs3/logon.cpp +++ b/src/sbbs3/logon.cpp @@ -487,9 +487,9 @@ bool sbbs_t::logon() errormsg(WHERE, ERR_WRITE, path, strlen(str)); } - if(cfg.sys_logon[0]) { /* execute system logon event */ - lprintf(LOG_DEBUG, "executing logon event: %s", cfg.sys_logon); - external(cmdstr(cfg.sys_logon,nulstr,nulstr,NULL),EX_STDOUT); /* EX_SH */ + if(cfg.sys_logon.cmd[0] && !(cfg.sys_logon.misc & EVENT_DISABLED)) { /* execute system logon event */ + lprintf(LOG_DEBUG, "executing logon event: %s", cfg.sys_logon.cmd); + external(cmdstr(cfg.sys_logon.cmd,nulstr,nulstr,NULL), EX_STDOUT | cfg.sys_logon.misc); /* EX_SH */ } if(sys_status&SS_QWKLOGON) diff --git a/src/sbbs3/logout.cpp b/src/sbbs3/logout.cpp index 8eb75ef990..11e997b018 100644 --- a/src/sbbs3/logout.cpp +++ b/src/sbbs3/logout.cpp @@ -74,9 +74,9 @@ void sbbs_t::logout(bool logged_in) } if(!online) { /* NOT re-login */ - if(cfg.sys_logout[0]) { /* execute system logout event */ - lprintf(LOG_DEBUG, "executing logout event: %s", cfg.sys_logout); - external(cmdstr(cfg.sys_logout,nulstr,nulstr,NULL),EX_OUTL|EX_OFFLINE); + if(cfg.sys_logout.cmd[0] && !(cfg.sys_logout.misc & EVENT_DISABLED)) { /* execute system logout event */ + lprintf(LOG_DEBUG, "executing logout event: %s", cfg.sys_logout.cmd); + external(cmdstr(cfg.sys_logout.cmd,nulstr,nulstr,NULL), EX_OUTL | EX_OFFLINE | cfg.sys_logout.misc); } } diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index d4d2f7d9ff..24eb7e0cb8 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -3092,7 +3092,7 @@ void event_thread(void* arg) sbbs->getnodedat(i,&node,1); node.status=NODE_EVENT_RUNNING; sbbs->putnodedat(i,&node); - if(sbbs->cfg.node_daily[0]) { + if(sbbs->cfg.node_daily.cmd[0] && !(sbbs->cfg.node_daily.misc & EVENT_DISABLED)) { sbbs->cfg.node_num=i; SAFECOPY(sbbs->cfg.node_dir, sbbs->cfg.node_path[i-1]); @@ -3100,8 +3100,8 @@ void event_thread(void* arg) sbbs->online=ON_LOCAL; sbbs->console|=CON_L_ECHO; sbbs->logentry("!:","Run node daily event"); - const char* cmd = sbbs->cmdstr(sbbs->cfg.node_daily,nulstr,nulstr,NULL); - int result = sbbs->external(cmd, EX_OFFLINE); + const char* cmd = sbbs->cmdstr(sbbs->cfg.node_daily.cmd,nulstr,nulstr,NULL); + int result = sbbs->external(cmd, EX_OFFLINE | sbbs->cfg.node_daily.misc); sbbs->lprintf(result ? LOG_ERR : LOG_INFO, "Node daily event: '%s' returned %d", cmd, result); sbbs->console&=~CON_L_ECHO; sbbs->online=false; @@ -4834,19 +4834,19 @@ void sbbs_t::daily_maint(void) smb_close(&smb); } - if(cfg.sys_daily[0]) { + if(cfg.sys_daily.cmd[0] && !(cfg.sys_daily.misc & EVENT_DISABLED)) { lputs(LOG_INFO, "DAILY: Running system event"); - const char* cmd = cmdstr(cfg.sys_daily,nulstr,nulstr,NULL); + const char* cmd = cmdstr(cfg.sys_daily.cmd,nulstr,nulstr,NULL); online = ON_LOCAL; - int result = external(cmd, EX_OFFLINE); + int result = external(cmd, EX_OFFLINE | cfg.sys_daily.misc); online = false; lprintf(result ? LOG_ERR : LOG_INFO, "Daily event: '%s' returned %d", cmd, result); } - if((sys_status & SS_NEW_MONTH) && cfg.sys_monthly[0]) { + if((sys_status & SS_NEW_MONTH) && cfg.sys_monthly.cmd[0] && !(cfg.sys_monthly.misc & EVENT_DISABLED)) { lputs(LOG_INFO, "DAILY: Running monthly event"); - const char* cmd = cmdstr(cfg.sys_monthly,nulstr,nulstr,NULL); + const char* cmd = cmdstr(cfg.sys_monthly.cmd,nulstr,nulstr,NULL); online = ON_LOCAL; - int result = external(cmd, EX_OFFLINE); + int result = external(cmd, EX_OFFLINE | cfg.sys_monthly.misc); online = false; lprintf(result ? LOG_ERR : LOG_INFO, "Monthly event: '%s' returned %d", cmd, result); } diff --git a/src/sbbs3/scfg/scfg.h b/src/sbbs3/scfg/scfg.h index bf45bcffd6..73d7089e9d 100644 --- a/src/sbbs3/scfg/scfg.h +++ b/src/sbbs3/scfg/scfg.h @@ -171,6 +171,7 @@ void sort_subs(int grpnum); void sort_dirs(int libnum); int subs_in_group(int grpnum); char random_code_char(void); +void fevent_cfg(const char* name, fevent_t* event); const char* io_method(uint32_t mode); void choose_io_method(uint32_t* misc); bool load_main_cfg(scfg_t*, char*, size_t); diff --git a/src/sbbs3/scfg/scfgnode.c b/src/sbbs3/scfg/scfgnode.c index b731abedd7..5d09bcaec8 100644 --- a/src/sbbs3/scfg/scfgnode.c +++ b/src/sbbs3/scfg/scfgnode.c @@ -197,7 +197,7 @@ void node_cfg() snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Phone Number",cfg.node_phone); snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Login Requirements",cfg.node_arstr); snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Keep Node File Open",cfg.node_misc&NM_CLOSENODEDAB ? "No":"Yes"); - snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Daily Event",cfg.node_daily); + snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Daily Event", (cfg.node_daily.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.node_daily.cmd); snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Node Directory",cfg.node_path[cfg.node_num-1]); snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Text Directory",cfg.text_dir); opt[i][0]=0; @@ -265,8 +265,7 @@ void node_cfg() SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_SPEC_HELP ; - uifc.input(WIN_MID|WIN_SAV,0,10,"Daily Event" - ,cfg.node_daily,sizeof(cfg.node_daily)-1,K_EDIT); + fevent_cfg("Daily Event", &cfg.node_daily); break; case __COUNTER__: uifc.helpbuf = node_path_help; diff --git a/src/sbbs3/scfg/scfgxtrn.c b/src/sbbs3/scfg/scfgxtrn.c index 198a3a2817..0503a92613 100644 --- a/src/sbbs3/scfg/scfgxtrn.c +++ b/src/sbbs3/scfg/scfgxtrn.c @@ -319,6 +319,36 @@ void xprogs_cfg() } } +void fevent_cfg(const char* name, fevent_t* event) +{ + static int dflt; + int i; + + while(1) { + i=0; + snprintf(opt[i++],MAX_OPLN,"%-15s%s","Enabled", (event->misc & EVENT_DISABLED) ? "No" : "Yes"); + snprintf(opt[i++],MAX_OPLN,"%-15s%s","Native", (event->misc & XTRN_NATIVE) ? "Yes" : "No"); + snprintf(opt[i++],MAX_OPLN,"%-15s%s","Command Line", event->cmd); + opt[i][0]=0; + switch(uifc.list(WIN_ACT|WIN_SAV|WIN_RHT,0,0,0,&dflt,0,name,opt)) { + case -1: + return; + case 0: + event->misc ^= EVENT_DISABLED; + uifc.changes = TRUE; + break; + case 1: + event->misc ^= XTRN_NATIVE; + uifc.changes = TRUE; + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0,"Command" + ,event->cmd, sizeof event->cmd - 1,K_EDIT); + break; + } + } +} + void fevents_cfg() { static int event_dflt; @@ -326,10 +356,10 @@ void fevents_cfg() while(1) { i=0; - snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Logon Event",cfg.sys_logon); - snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Logout Event",cfg.sys_logout); - snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Daily Event",cfg.sys_daily); - snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Monthly Event",cfg.sys_monthly); + snprintf(opt[i++],MAX_OPLN,"%-12s%s","Logon", (cfg.sys_logon.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_logon.cmd); + snprintf(opt[i++],MAX_OPLN,"%-12s%s","Logout", (cfg.sys_logout.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_logout.cmd); + snprintf(opt[i++],MAX_OPLN,"%-12s%s","Daily", (cfg.sys_daily.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_daily.cmd); + snprintf(opt[i++],MAX_OPLN,"%-12s%s","Monthly", (cfg.sys_monthly.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_monthly.cmd); opt[i][0]=0; uifc.helpbuf= "`External Events:`\n" @@ -337,7 +367,7 @@ void fevents_cfg() "From this menu, you can configure the logon and logout events, and the\n" "system daily and monthly (off-line) events.\n" ; - switch(uifc.list(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&event_dflt,0 + switch(uifc.list(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,0,&event_dflt,0 ,"Fixed Events",opt)) { case -1: return; @@ -355,8 +385,7 @@ void fevents_cfg() SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_SPEC_HELP ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Event" - ,cfg.sys_logon,sizeof(cfg.sys_logon)-1,K_EDIT); + fevent_cfg("Logon Event", &cfg.sys_logon); break; case 1: uifc.helpbuf= @@ -371,8 +400,7 @@ void fevents_cfg() SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_SPEC_HELP ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Event" - ,cfg.sys_logout,sizeof(cfg.sys_logout)-1,K_EDIT); + fevent_cfg("Logout Event", &cfg.sys_logout); break; case 2: uifc.helpbuf= @@ -383,9 +411,7 @@ void fevents_cfg() SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_SPEC_HELP ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Daily Event" - ,cfg.sys_daily,sizeof(cfg.sys_daily)-1,K_EDIT); - + fevent_cfg("Daily Event", &cfg.sys_daily); break; case 3: uifc.helpbuf= @@ -395,9 +421,7 @@ void fevents_cfg() SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_SPEC_HELP ; - uifc.input(WIN_MID|WIN_SAV,0,0,"Monthly Event" - ,cfg.sys_monthly,sizeof(cfg.sys_monthly)-1,K_EDIT); - + fevent_cfg("Monthly Event", &cfg.sys_monthly); break; } } diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h index 2c757e5ed2..a603f4a28c 100644 --- a/src/sbbs3/scfgdefs.h +++ b/src/sbbs3/scfgdefs.h @@ -311,6 +311,11 @@ typedef struct { /* Generic Timed Event */ } event_t; +typedef struct { // Fixed event + char cmd[LEN_CMD + 1]; + uint32_t misc; // Settings flags +} fevent_t; + typedef struct { /* QWK Network Hub */ char id[LEN_QWKID+1], /* System ID of Hub */ call[LEN_CMD+1], /* Call-out command line to execute */ @@ -465,10 +470,10 @@ typedef struct enum date_fmt sys_date_fmt; char sys_date_sep; bool sys_date_verbal; - char sys_monthly[LEN_CMD+1]; /* Monthly event */ - char sys_daily[LEN_CMD+1]; /* Daily event */ - char sys_logon[LEN_CMD+1]; /* Logon event */ - char sys_logout[LEN_CMD+1]; /* Logoff event */ + fevent_t sys_monthly; /* Monthly event */ + fevent_t sys_daily; /* Daily event */ + fevent_t sys_logon; /* Logon event */ + fevent_t sys_logout; /* Logout event */ uint8_t min_pwlen; uint16_t sys_pwdays; /* Max days between password change */ uint16_t sys_deldays; /* Days to keep deleted users */ @@ -488,7 +493,7 @@ typedef struct int32_t xtrn_misc; /* External Programs Misc Settings */ uint16_t filename_maxlen; /* Maximum filename length */ - char node_daily[LEN_CMD+1]; /* Name of node's daily event */ + fevent_t node_daily; /* Node's daily event */ uint32_t node_misc; /* Misc bits for node setup */ bool spinning_pause_prompt; uint16_t valuser; /* User validation mail goes to */ diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c index 03453d7763..fc704fbbf3 100644 --- a/src/sbbs3/scfglib1.c +++ b/src/sbbs3/scfglib1.c @@ -55,7 +55,8 @@ bool read_node_cfg(scfg_t* cfg, char* error, size_t maxerrlen) fclose(fp); SAFECOPY(cfg->node_phone, iniGetString(ini, ROOT_SECTION, "phone", "", value)); - SAFECOPY(cfg->node_daily, iniGetString(ini, ROOT_SECTION, "daily", "", value)); + SAFECOPY(cfg->node_daily.cmd, iniGetString(ini, ROOT_SECTION, "daily", "", value)); + cfg->node_daily.misc = iniGetUInteger(ini, ROOT_SECTION, "daily_settings", 0); SAFECOPY(cfg->text_dir, iniGetString(ini, ROOT_SECTION, "text_dir", "../text/", value)); SAFECOPY(cfg->temp_dir, iniGetString(ini, ROOT_SECTION, "temp_dir", "temp", value)); SAFECOPY(cfg->node_arstr, iniGetString(ini, ROOT_SECTION, "ars", "", value)); @@ -136,10 +137,14 @@ bool read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen) cfg->errlevel = (uchar)iniGetUInteger(ini, ROOT_SECTION, "errlevel", LOG_CRIT); // fixed events - SAFECOPY(cfg->sys_logon, iniGetString(ini, "logon_event", "cmd", "", value)); - SAFECOPY(cfg->sys_logout, iniGetString(ini, "logout_event", "cmd", "", value)); - SAFECOPY(cfg->sys_daily, iniGetString(ini, "daily_event", "cmd", "", value)); - SAFECOPY(cfg->sys_monthly, iniGetString(ini, "monthly_event", "cmd", "", value)); + SAFECOPY(cfg->sys_logon.cmd, iniGetString(ini, "logon_event", "cmd", "", value)); + cfg->sys_logon.misc = iniGetUInt32(ini, "logon_event", "settings", 0); + SAFECOPY(cfg->sys_logout.cmd, iniGetString(ini, "logout_event", "cmd", "", value)); + cfg->sys_logout.misc = iniGetUInt32(ini, "logout_event", "settings", 0); + SAFECOPY(cfg->sys_daily.cmd, iniGetString(ini, "daily_event", "cmd", "", value)); + cfg->sys_daily.misc = iniGetUInt32(ini, "daily_event", "settings", 0); + SAFECOPY(cfg->sys_monthly.cmd, iniGetString(ini, "monthly_event", "cmd", "", value)); + cfg->sys_monthly.misc = iniGetUInt32(ini, "monthly_event", "settings", 0); named_str_list_t** sections = iniParseSections(ini); diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c index 963545354d..64cd44c329 100644 --- a/src/sbbs3/scfgsave.c +++ b/src/sbbs3/scfgsave.c @@ -80,7 +80,8 @@ bool write_node_cfg(scfg_t* cfg) str_list_t ini = strListInit(); iniSetString(&ini, ROOT_SECTION, "phone", cfg->node_phone, NULL); - iniSetString(&ini, ROOT_SECTION, "daily", cfg->node_daily, NULL); + iniSetString(&ini, ROOT_SECTION, "daily", cfg->node_daily.cmd, NULL); + iniSetHexInt(&ini, ROOT_SECTION, "daily_settings", cfg->node_daily.misc, NULL); iniSetString(&ini, ROOT_SECTION, "text_dir", cfg->text_dir, NULL); iniSetString(&ini, ROOT_SECTION, "temp_dir", cfg->temp_dir, NULL); iniSetString(&ini, ROOT_SECTION, "ars", cfg->node_arstr, NULL); @@ -201,10 +202,14 @@ bool write_main_cfg(scfg_t* cfg) iniSetString(&ini, name, "gender_options", cfg->new_genders, &ini_style); } - iniSetString(&ini, "logon_event", "cmd", cfg->sys_logon, &ini_style); - iniSetString(&ini, "logout_event", "cmd", cfg->sys_logout, &ini_style); - iniSetString(&ini, "daily_event", "cmd", cfg->sys_daily, &ini_style); - iniSetString(&ini, "monthly_event", "cmd", cfg->sys_monthly, &ini_style); + iniSetString(&ini, "logon_event", "cmd", cfg->sys_logon.cmd, &ini_style); + iniSetHexInt(&ini, "logon_event", "settings", cfg->sys_logon.misc, &ini_style); + iniSetString(&ini, "logout_event", "cmd", cfg->sys_logout.cmd, &ini_style); + iniSetHexInt(&ini, "logout_event", "settings", cfg->sys_logout.misc, &ini_style); + iniSetString(&ini, "daily_event", "cmd", cfg->sys_daily.cmd, &ini_style); + iniSetHexInt(&ini, "daily_event", "settings", cfg->sys_daily.misc, &ini_style); + iniSetString(&ini, "monthly_event", "cmd", cfg->sys_monthly.cmd, &ini_style); + iniSetHexInt(&ini, "monthly_event", "settings", cfg->sys_monthly.misc, &ini_style); { const char* name = "expired"; -- GitLab