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

Replace (and auto-upgrade) ctrl/time.dab with time.ini

This will allow us to change scfg_t.event[].last to a time_t value (from
time32_t) whenever we abandon Borland C/C++ in the future.

Now it's trival for sysops to view/edit when their timed events 'last run'
values. And there's no more endianness concerns. Bad .dab files, bad, go away.

After I wrote this change, I found the original conversion code in v4upgrade.c
which is almost exactly the same (except I was going to write to different
filename). Finally actually implemented this. Next up: qnet.dab
parent 3a673458
No related branches found
No related tags found
1 merge request!455Update branch with changes from master
...@@ -43,6 +43,13 @@ ...@@ -43,6 +43,13 @@
#define TELNET_SERVER "Synchronet Terminal Server" #define TELNET_SERVER "Synchronet Terminal Server"
static const char* server_abbrev = "term"; static const char* server_abbrev = "term";
static const char* eventIniSection = "Events";
static ini_style_t eventIniStyle = {
/* key_len: */LEN_CODE,
/* key_prefix: */nullptr,
/* section_separator: */""
};
#define TIMEOUT_THREAD_WAIT 60 // Seconds (was 15) #define TIMEOUT_THREAD_WAIT 60 // Seconds (was 15)
#define IO_THREAD_BUF_SIZE 20000 // Bytes #define IO_THREAD_BUF_SIZE 20000 // Bytes
#define TIMEOUT_MUTEX_FILE 12*60*60 #define TIMEOUT_MUTEX_FILE 12*60*60
...@@ -2793,7 +2800,7 @@ void event_thread(void* arg) ...@@ -2793,7 +2800,7 @@ void event_thread(void* arg)
time_t start; time_t start;
time_t lastsemchk=0; time_t lastsemchk=0;
time_t lastnodechk=0; time_t lastnodechk=0;
time32_t lastprepack=0; time_t lastprepack=0;
node_t node; node_t node;
glob_t g; glob_t g;
sbbs_t* sbbs = (sbbs_t*) arg; sbbs_t* sbbs = (sbbs_t*) arg;
...@@ -2815,30 +2822,51 @@ void event_thread(void* arg) ...@@ -2815,30 +2822,51 @@ void event_thread(void* arg)
} }
#endif #endif
// Read TIME.DAB // Read event "last ran" times from ctrl/time.ini
char ini_file[MAX_PATH+1];
SAFEPRINTF(ini_file,"%stime.ini",sbbs->cfg.ctrl_dir);
FILE* fp = iniOpenFile(ini_file, /* for modify: */false);
if (fp != nullptr) {
for (i = 0; i < sbbs->cfg.total_events; ++i)
sbbs->cfg.event[i]->last = (time32_t)iniReadDateTime(fp, eventIniSection, sbbs->cfg.event[i]->code, 0);
lastprepack = iniReadDateTime(fp, ROOT_SECTION, "QWK_prepack", 0);
iniCloseFile(fp);
} else {
// Read time.dab (legacy), and auto-upgrade to time.ini
SAFEPRINTF(str,"%stime.dab",sbbs->cfg.ctrl_dir); SAFEPRINTF(str,"%stime.dab",sbbs->cfg.ctrl_dir);
if((file=sbbs->nopen(str,O_RDWR|O_CREAT))==-1) if((file=sbbs->nopen(str,O_RDONLY)) != -1) {
sbbs->errormsg(WHERE,ERR_OPEN,str,0); time32_t t32;
else {
for(i=0;i<sbbs->cfg.total_events;i++) { for(i=0;i<sbbs->cfg.total_events;i++) {
sbbs->cfg.event[i]->last=0; sbbs->cfg.event[i]->last=0;
if(filelength(file)<(int)(sizeof(time32_t)*(i+1))) {
sbbs->lprintf(LOG_WARNING,"Initializing last run time for event: %s"
,sbbs->cfg.event[i]->code);
if(write(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last)) != sizeof sbbs->cfg.event[i]->last)
sbbs->errormsg(WHERE, ERR_WRITE, str, 4);
} else {
if(read(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last))!=sizeof(sbbs->cfg.event[i]->last)) if(read(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last))!=sizeof(sbbs->cfg.event[i]->last))
sbbs->errormsg(WHERE,ERR_READ,str,sizeof(time32_t)); sbbs->errormsg(WHERE,ERR_READ,str,sizeof(time32_t));
} }
if(read(file, &t32, sizeof t32) != sizeof t32) /* expected to fail first time */
t32 = 0;
lastprepack = t32;
close(file);
}
fp = iniOpenFile(ini_file, /* for modify: */true);
if (fp == nullptr)
sbbs->errormsg(WHERE, ERR_CREATE, ini_file, 0);
else {
str_list_t ini = strListInit();
if(ini != NULL) {
if(lastprepack != 0)
iniSetDateTime(&ini, ROOT_SECTION, "QWK_prepack", /* include time */true, lastprepack, /* style: */nullptr);
for (i = 0; i < sbbs->cfg.total_events; ++i)
iniSetDateTime(&ini, eventIniSection, sbbs->cfg.event[i]->code, /* include time */true, sbbs->cfg.event[i]->last, &eventIniStyle);
iniWriteFile(fp, ini);
iniCloseFile(fp);
iniFreeStringList(ini);
}
}
}
for (i = 0; i < sbbs->cfg.total_events; ++i) {
/* Event always runs after initialization? */ /* Event always runs after initialization? */
if(sbbs->cfg.event[i]->misc&EVENT_INIT) if(sbbs->cfg.event[i]->misc&EVENT_INIT)
sbbs->cfg.event[i]->last=-1; sbbs->cfg.event[i]->last=-1;
} }
if(read(file,&lastprepack,sizeof(lastprepack)) != sizeof lastprepack) /* expected to fail first time */
lastprepack = 0;
close(file);
}
// Read QNET.DAB // Read QNET.DAB
SAFEPRINTF(str,"%sqnet.dab",sbbs->cfg.ctrl_dir); SAFEPRINTF(str,"%sqnet.dab",sbbs->cfg.ctrl_dir);
...@@ -3024,16 +3052,19 @@ void event_thread(void* arg) ...@@ -3024,16 +3052,19 @@ void event_thread(void* arg)
} }
} }
closeuserdat(userfile); closeuserdat(userfile);
lastprepack=(time32_t)now; lastprepack=now;
SAFEPRINTF(str,"%stime.dab",sbbs->cfg.ctrl_dir); SAFEPRINTF(str,"%stime.ini",sbbs->cfg.ctrl_dir);
if((file=sbbs->nopen(str,O_WRONLY))==-1) { if((fp = iniOpenFile(str, /* for modify: */true ))== NULL) {
sbbs->errormsg(WHERE,ERR_OPEN,str,O_WRONLY); sbbs->errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
break; break;
} }
lseek(file,(int)sbbs->cfg.total_events*4L,SEEK_SET); str_list_t ini = iniReadFile(fp);
if(write(file,&lastprepack,sizeof(lastprepack)) != sizeof lastprepack) if(ini != NULL) {
sbbs->errormsg(WHERE, ERR_WRITE, str, sizeof lastprepack); iniSetDateTime(&ini, ROOT_SECTION, "QWK_prepack", /* include time: */true, lastprepack, /* style: */nullptr);
close(file); iniWriteFile(fp, ini);
iniFreeStringList(ini);
}
iniCloseFile(fp);
remove(semfile); remove(semfile);
} }
...@@ -3289,16 +3320,14 @@ void event_thread(void* arg) ...@@ -3289,16 +3320,14 @@ void event_thread(void* arg)
} }
lastnodechk=now; lastnodechk=now;
SAFEPRINTF(str,"%stime.dab",sbbs->cfg.ctrl_dir); SAFEPRINTF(str,"%stime.ini",sbbs->cfg.ctrl_dir);
if((file=sbbs->nopen(str,O_RDONLY))==-1) { if((fp = iniOpenFile(str, /* for modify: */false)) == NULL) {
sbbs->errormsg(WHERE,ERR_OPEN,str,O_RDONLY); sbbs->errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
sbbs->cfg.event[i]->last = (time32_t)now; sbbs->cfg.event[i]->last = (time32_t)now;
continue; continue;
} }
lseek(file,(int)i*4L,SEEK_SET); sbbs->cfg.event[i]->last = (time32_t)iniReadDateTime(fp, eventIniSection, sbbs->cfg.event[i]->code, 0);
if(read(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last)) != sizeof sbbs->cfg.event[i]->last) iniCloseFile(fp);
sbbs->errormsg(WHERE, ERR_READ, str, 4);
close(file);
if(now-sbbs->cfg.event[i]->last<(60*60)) /* event is done */ if(now-sbbs->cfg.event[i]->last<(60*60)) /* event is done */
break; break;
if(now-start>(90*60)) { if(now-start>(90*60)) {
...@@ -3431,15 +3460,18 @@ void event_thread(void* arg) ...@@ -3431,15 +3460,18 @@ void event_thread(void* arg)
sbbs->console&=~CON_L_ECHO; sbbs->console&=~CON_L_ECHO;
sbbs->online=false; sbbs->online=false;
sbbs->cfg.event[i]->last=time32(NULL); sbbs->cfg.event[i]->last=time32(NULL);
SAFEPRINTF(str,"%stime.dab",sbbs->cfg.ctrl_dir); SAFEPRINTF(str,"%stime.ini",sbbs->cfg.ctrl_dir);
if((file=sbbs->nopen(str,O_WRONLY))==-1) { if((fp = iniOpenFile(str, /* for modify: */true)) == NULL) {
sbbs->errormsg(WHERE,ERR_OPEN,str,O_WRONLY); sbbs->errormsg(WHERE,ERR_OPEN,str,O_WRONLY);
break; break;
} }
lseek(file,(int)i*4L,SEEK_SET); str_list_t ini = iniReadFile(fp);
if(write(file,&sbbs->cfg.event[i]->last,sizeof(sbbs->cfg.event[i]->last)) != sizeof sbbs->cfg.event[i]->last) if(ini != NULL) {
sbbs->errormsg(WHERE, ERR_WRITE, str, 4); iniSetDateTime(&ini, eventIniSection, sbbs->cfg.event[i]->code, /* include time */true, sbbs->cfg.event[i]->last, &eventIniStyle);
close(file); iniWriteFile(fp, ini);
iniFreeStringList(ini);
}
iniCloseFile(fp);
if(sbbs->cfg.event[i]->node != NODE_ANY if(sbbs->cfg.event[i]->node != NODE_ANY
&& sbbs->cfg.event[i]->misc&EVENT_EXCL) { /* exclusive event */ && sbbs->cfg.event[i]->misc&EVENT_EXCL) { /* exclusive event */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment