Skip to content
Snippets Groups Projects
Commit fd4bbce4 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

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.
parent 690bb56e
Branches
Tags
No related merge requests found
Pipeline #7135 passed
...@@ -487,9 +487,9 @@ bool sbbs_t::logon() ...@@ -487,9 +487,9 @@ bool sbbs_t::logon()
errormsg(WHERE, ERR_WRITE, path, strlen(str)); errormsg(WHERE, ERR_WRITE, path, strlen(str));
} }
if(cfg.sys_logon[0]) { /* execute system logon event */ 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); lprintf(LOG_DEBUG, "executing logon event: %s", cfg.sys_logon.cmd);
external(cmdstr(cfg.sys_logon,nulstr,nulstr,NULL),EX_STDOUT); /* EX_SH */ external(cmdstr(cfg.sys_logon.cmd,nulstr,nulstr,NULL), EX_STDOUT | cfg.sys_logon.misc); /* EX_SH */
} }
if(sys_status&SS_QWKLOGON) if(sys_status&SS_QWKLOGON)
......
...@@ -74,9 +74,9 @@ void sbbs_t::logout(bool logged_in) ...@@ -74,9 +74,9 @@ void sbbs_t::logout(bool logged_in)
} }
if(!online) { /* NOT re-login */ if(!online) { /* NOT re-login */
if(cfg.sys_logout[0]) { /* execute system logout event */ 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); lprintf(LOG_DEBUG, "executing logout event: %s", cfg.sys_logout.cmd);
external(cmdstr(cfg.sys_logout,nulstr,nulstr,NULL),EX_OUTL|EX_OFFLINE); external(cmdstr(cfg.sys_logout.cmd,nulstr,nulstr,NULL), EX_OUTL | EX_OFFLINE | cfg.sys_logout.misc);
} }
} }
......
...@@ -3092,7 +3092,7 @@ void event_thread(void* arg) ...@@ -3092,7 +3092,7 @@ void event_thread(void* arg)
sbbs->getnodedat(i,&node,1); sbbs->getnodedat(i,&node,1);
node.status=NODE_EVENT_RUNNING; node.status=NODE_EVENT_RUNNING;
sbbs->putnodedat(i,&node); 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; sbbs->cfg.node_num=i;
SAFECOPY(sbbs->cfg.node_dir, sbbs->cfg.node_path[i-1]); SAFECOPY(sbbs->cfg.node_dir, sbbs->cfg.node_path[i-1]);
...@@ -3100,8 +3100,8 @@ void event_thread(void* arg) ...@@ -3100,8 +3100,8 @@ void event_thread(void* arg)
sbbs->online=ON_LOCAL; sbbs->online=ON_LOCAL;
sbbs->console|=CON_L_ECHO; sbbs->console|=CON_L_ECHO;
sbbs->logentry("!:","Run node daily event"); sbbs->logentry("!:","Run node daily event");
const char* cmd = sbbs->cmdstr(sbbs->cfg.node_daily,nulstr,nulstr,NULL); const char* cmd = sbbs->cmdstr(sbbs->cfg.node_daily.cmd,nulstr,nulstr,NULL);
int result = sbbs->external(cmd, EX_OFFLINE); 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->lprintf(result ? LOG_ERR : LOG_INFO, "Node daily event: '%s' returned %d", cmd, result);
sbbs->console&=~CON_L_ECHO; sbbs->console&=~CON_L_ECHO;
sbbs->online=false; sbbs->online=false;
...@@ -4834,19 +4834,19 @@ void sbbs_t::daily_maint(void) ...@@ -4834,19 +4834,19 @@ void sbbs_t::daily_maint(void)
smb_close(&smb); 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"); 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; online = ON_LOCAL;
int result = external(cmd, EX_OFFLINE); int result = external(cmd, EX_OFFLINE | cfg.sys_daily.misc);
online = false; online = false;
lprintf(result ? LOG_ERR : LOG_INFO, "Daily event: '%s' returned %d", cmd, result); 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"); 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; online = ON_LOCAL;
int result = external(cmd, EX_OFFLINE); int result = external(cmd, EX_OFFLINE | cfg.sys_monthly.misc);
online = false; online = false;
lprintf(result ? LOG_ERR : LOG_INFO, "Monthly event: '%s' returned %d", cmd, result); lprintf(result ? LOG_ERR : LOG_INFO, "Monthly event: '%s' returned %d", cmd, result);
} }
......
...@@ -171,6 +171,7 @@ void sort_subs(int grpnum); ...@@ -171,6 +171,7 @@ void sort_subs(int grpnum);
void sort_dirs(int libnum); void sort_dirs(int libnum);
int subs_in_group(int grpnum); int subs_in_group(int grpnum);
char random_code_char(void); char random_code_char(void);
void fevent_cfg(const char* name, fevent_t* event);
const char* io_method(uint32_t mode); const char* io_method(uint32_t mode);
void choose_io_method(uint32_t* misc); void choose_io_method(uint32_t* misc);
bool load_main_cfg(scfg_t*, char*, size_t); bool load_main_cfg(scfg_t*, char*, size_t);
......
...@@ -197,7 +197,7 @@ void node_cfg() ...@@ -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","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","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","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","Node Directory",cfg.node_path[cfg.node_num-1]);
snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Text Directory",cfg.text_dir); snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Text Directory",cfg.text_dir);
opt[i][0]=0; opt[i][0]=0;
...@@ -265,8 +265,7 @@ void node_cfg() ...@@ -265,8 +265,7 @@ void node_cfg()
SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_PREFIX_HELP
SCFG_CMDLINE_SPEC_HELP SCFG_CMDLINE_SPEC_HELP
; ;
uifc.input(WIN_MID|WIN_SAV,0,10,"Daily Event" fevent_cfg("Daily Event", &cfg.node_daily);
,cfg.node_daily,sizeof(cfg.node_daily)-1,K_EDIT);
break; break;
case __COUNTER__: case __COUNTER__:
uifc.helpbuf = node_path_help; uifc.helpbuf = node_path_help;
......
...@@ -319,6 +319,36 @@ void xprogs_cfg() ...@@ -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() void fevents_cfg()
{ {
static int event_dflt; static int event_dflt;
...@@ -326,10 +356,10 @@ void fevents_cfg() ...@@ -326,10 +356,10 @@ void fevents_cfg()
while(1) { while(1) {
i=0; i=0;
snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Logon Event",cfg.sys_logon); snprintf(opt[i++],MAX_OPLN,"%-12s%s","Logon", (cfg.sys_logon.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_logon.cmd);
snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Logout Event",cfg.sys_logout); snprintf(opt[i++],MAX_OPLN,"%-12s%s","Logout", (cfg.sys_logout.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_logout.cmd);
snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Daily Event",cfg.sys_daily); snprintf(opt[i++],MAX_OPLN,"%-12s%s","Daily", (cfg.sys_daily.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_daily.cmd);
snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Monthly Event",cfg.sys_monthly); snprintf(opt[i++],MAX_OPLN,"%-12s%s","Monthly", (cfg.sys_monthly.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_monthly.cmd);
opt[i][0]=0; opt[i][0]=0;
uifc.helpbuf= uifc.helpbuf=
"`External Events:`\n" "`External Events:`\n"
...@@ -337,7 +367,7 @@ void fevents_cfg() ...@@ -337,7 +367,7 @@ void fevents_cfg()
"From this menu, you can configure the logon and logout events, and the\n" "From this menu, you can configure the logon and logout events, and the\n"
"system daily and monthly (off-line) events.\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)) { ,"Fixed Events",opt)) {
case -1: case -1:
return; return;
...@@ -355,8 +385,7 @@ void fevents_cfg() ...@@ -355,8 +385,7 @@ void fevents_cfg()
SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_PREFIX_HELP
SCFG_CMDLINE_SPEC_HELP SCFG_CMDLINE_SPEC_HELP
; ;
uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Event" fevent_cfg("Logon Event", &cfg.sys_logon);
,cfg.sys_logon,sizeof(cfg.sys_logon)-1,K_EDIT);
break; break;
case 1: case 1:
uifc.helpbuf= uifc.helpbuf=
...@@ -371,8 +400,7 @@ void fevents_cfg() ...@@ -371,8 +400,7 @@ void fevents_cfg()
SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_PREFIX_HELP
SCFG_CMDLINE_SPEC_HELP SCFG_CMDLINE_SPEC_HELP
; ;
uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Event" fevent_cfg("Logout Event", &cfg.sys_logout);
,cfg.sys_logout,sizeof(cfg.sys_logout)-1,K_EDIT);
break; break;
case 2: case 2:
uifc.helpbuf= uifc.helpbuf=
...@@ -383,9 +411,7 @@ void fevents_cfg() ...@@ -383,9 +411,7 @@ void fevents_cfg()
SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_PREFIX_HELP
SCFG_CMDLINE_SPEC_HELP SCFG_CMDLINE_SPEC_HELP
; ;
uifc.input(WIN_MID|WIN_SAV,0,0,"Daily Event" fevent_cfg("Daily Event", &cfg.sys_daily);
,cfg.sys_daily,sizeof(cfg.sys_daily)-1,K_EDIT);
break; break;
case 3: case 3:
uifc.helpbuf= uifc.helpbuf=
...@@ -395,9 +421,7 @@ void fevents_cfg() ...@@ -395,9 +421,7 @@ void fevents_cfg()
SCFG_CMDLINE_PREFIX_HELP SCFG_CMDLINE_PREFIX_HELP
SCFG_CMDLINE_SPEC_HELP SCFG_CMDLINE_SPEC_HELP
; ;
uifc.input(WIN_MID|WIN_SAV,0,0,"Monthly Event" fevent_cfg("Monthly Event", &cfg.sys_monthly);
,cfg.sys_monthly,sizeof(cfg.sys_monthly)-1,K_EDIT);
break; break;
} }
} }
......
...@@ -311,6 +311,11 @@ typedef struct { /* Generic Timed Event */ ...@@ -311,6 +311,11 @@ typedef struct { /* Generic Timed Event */
} event_t; } event_t;
typedef struct { // Fixed event
char cmd[LEN_CMD + 1];
uint32_t misc; // Settings flags
} fevent_t;
typedef struct { /* QWK Network Hub */ typedef struct { /* QWK Network Hub */
char id[LEN_QWKID+1], /* System ID of Hub */ char id[LEN_QWKID+1], /* System ID of Hub */
call[LEN_CMD+1], /* Call-out command line to execute */ call[LEN_CMD+1], /* Call-out command line to execute */
...@@ -465,10 +470,10 @@ typedef struct ...@@ -465,10 +470,10 @@ typedef struct
enum date_fmt sys_date_fmt; enum date_fmt sys_date_fmt;
char sys_date_sep; char sys_date_sep;
bool sys_date_verbal; bool sys_date_verbal;
char sys_monthly[LEN_CMD+1]; /* Monthly event */ fevent_t sys_monthly; /* Monthly event */
char sys_daily[LEN_CMD+1]; /* Daily event */ fevent_t sys_daily; /* Daily event */
char sys_logon[LEN_CMD+1]; /* Logon event */ fevent_t sys_logon; /* Logon event */
char sys_logout[LEN_CMD+1]; /* Logoff event */ fevent_t sys_logout; /* Logout event */
uint8_t min_pwlen; uint8_t min_pwlen;
uint16_t sys_pwdays; /* Max days between password change */ uint16_t sys_pwdays; /* Max days between password change */
uint16_t sys_deldays; /* Days to keep deleted users */ uint16_t sys_deldays; /* Days to keep deleted users */
...@@ -488,7 +493,7 @@ typedef struct ...@@ -488,7 +493,7 @@ typedef struct
int32_t xtrn_misc; /* External Programs Misc Settings */ int32_t xtrn_misc; /* External Programs Misc Settings */
uint16_t filename_maxlen; /* Maximum filename length */ 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 */ uint32_t node_misc; /* Misc bits for node setup */
bool spinning_pause_prompt; bool spinning_pause_prompt;
uint16_t valuser; /* User validation mail goes to */ uint16_t valuser; /* User validation mail goes to */
......
...@@ -55,7 +55,8 @@ bool read_node_cfg(scfg_t* cfg, char* error, size_t maxerrlen) ...@@ -55,7 +55,8 @@ bool read_node_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
fclose(fp); fclose(fp);
SAFECOPY(cfg->node_phone, iniGetString(ini, ROOT_SECTION, "phone", "", value)); 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->text_dir, iniGetString(ini, ROOT_SECTION, "text_dir", "../text/", value));
SAFECOPY(cfg->temp_dir, iniGetString(ini, ROOT_SECTION, "temp_dir", "temp", value)); SAFECOPY(cfg->temp_dir, iniGetString(ini, ROOT_SECTION, "temp_dir", "temp", value));
SAFECOPY(cfg->node_arstr, iniGetString(ini, ROOT_SECTION, "ars", "", 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) ...@@ -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); cfg->errlevel = (uchar)iniGetUInteger(ini, ROOT_SECTION, "errlevel", LOG_CRIT);
// fixed events // fixed events
SAFECOPY(cfg->sys_logon, iniGetString(ini, "logon_event", "cmd", "", value)); SAFECOPY(cfg->sys_logon.cmd, iniGetString(ini, "logon_event", "cmd", "", value));
SAFECOPY(cfg->sys_logout, iniGetString(ini, "logout_event", "cmd", "", value)); cfg->sys_logon.misc = iniGetUInt32(ini, "logon_event", "settings", 0);
SAFECOPY(cfg->sys_daily, iniGetString(ini, "daily_event", "cmd", "", value)); SAFECOPY(cfg->sys_logout.cmd, iniGetString(ini, "logout_event", "cmd", "", value));
SAFECOPY(cfg->sys_monthly, iniGetString(ini, "monthly_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); named_str_list_t** sections = iniParseSections(ini);
......
...@@ -80,7 +80,8 @@ bool write_node_cfg(scfg_t* cfg) ...@@ -80,7 +80,8 @@ bool write_node_cfg(scfg_t* cfg)
str_list_t ini = strListInit(); str_list_t ini = strListInit();
iniSetString(&ini, ROOT_SECTION, "phone", cfg->node_phone, NULL); 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, "text_dir", cfg->text_dir, NULL);
iniSetString(&ini, ROOT_SECTION, "temp_dir", cfg->temp_dir, NULL); iniSetString(&ini, ROOT_SECTION, "temp_dir", cfg->temp_dir, NULL);
iniSetString(&ini, ROOT_SECTION, "ars", cfg->node_arstr, NULL); iniSetString(&ini, ROOT_SECTION, "ars", cfg->node_arstr, NULL);
...@@ -201,10 +202,14 @@ bool write_main_cfg(scfg_t* cfg) ...@@ -201,10 +202,14 @@ bool write_main_cfg(scfg_t* cfg)
iniSetString(&ini, name, "gender_options", cfg->new_genders, &ini_style); iniSetString(&ini, name, "gender_options", cfg->new_genders, &ini_style);
} }
iniSetString(&ini, "logon_event", "cmd", cfg->sys_logon, &ini_style); iniSetString(&ini, "logon_event", "cmd", cfg->sys_logon.cmd, &ini_style);
iniSetString(&ini, "logout_event", "cmd", cfg->sys_logout, &ini_style); iniSetHexInt(&ini, "logon_event", "settings", cfg->sys_logon.misc, &ini_style);
iniSetString(&ini, "daily_event", "cmd", cfg->sys_daily, &ini_style); iniSetString(&ini, "logout_event", "cmd", cfg->sys_logout.cmd, &ini_style);
iniSetString(&ini, "monthly_event", "cmd", cfg->sys_monthly, &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"; const char* name = "expired";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment