From b910e02bb17ea3254f308eba604d6c33375971ea Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Wed, 20 Oct 2004 23:09:10 +0000 Subject: [PATCH] Added recycle callback function to all server startup structures. This callback is used by sbbscon to re-load the relevent portion of the startup .ini file when a server is recycled, allowing dynamic changes to sbbs.ini. --- src/sbbs3/ftpsrvr.c | 2 ++ src/sbbs3/ftpsrvr.h | 1 + src/sbbs3/mailsrvr.c | 2 ++ src/sbbs3/mailsrvr.h | 1 + src/sbbs3/main.cpp | 2 ++ src/sbbs3/sbbscon.c | 48 ++++++++++++++++++++++++++++++++++++-------- src/sbbs3/services.c | 2 ++ src/sbbs3/services.h | 1 + src/sbbs3/startup.h | 1 + src/sbbs3/websrvr.c | 2 ++ src/sbbs3/websrvr.h | 1 + 11 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 22e1685866..5d5db0e784 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -4832,6 +4832,8 @@ void DLLCALL ftp_server(void* arg) if(!terminate_server) { lprintf(LOG_INFO,"Recycling server..."); mswait(2000); + if(startup->recycle!=NULL) + startup->recycle(startup->cbdata); } } while(!terminate_server); diff --git a/src/sbbs3/ftpsrvr.h b/src/sbbs3/ftpsrvr.h index 2ec9640cd5..2c7471970d 100644 --- a/src/sbbs3/ftpsrvr.h +++ b/src/sbbs3/ftpsrvr.h @@ -60,6 +60,7 @@ typedef struct { int (*lputs)(void*, int, char*); void (*status)(void*, char*); void (*started)(void*); + void (*recycle)(void*); void (*terminated)(void*, int code); void (*clients)(void*, int active); void (*thread_up)(void*, BOOL up, BOOL setuid); diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index b18c78f75e..3cdb391524 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -4333,6 +4333,8 @@ void DLLCALL mail_server(void* arg) if(!terminate_server) { lprintf(LOG_INFO,"Recycling server..."); mswait(2000); + if(startup->recycle!=NULL) + startup->recycle(startup->cbdata); } } while(!terminate_server); diff --git a/src/sbbs3/mailsrvr.h b/src/sbbs3/mailsrvr.h index 0d1ae33f61..4885dcbbe2 100644 --- a/src/sbbs3/mailsrvr.h +++ b/src/sbbs3/mailsrvr.h @@ -67,6 +67,7 @@ typedef struct { int (*lputs)(void*, int, char*); void (*status)(void*, char*); void (*started)(void*); + void (*recycle)(void*); void (*terminated)(void*, int code); void (*clients)(void*, int active); void (*thread_up)(void*, BOOL up, BOOL setuid); diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index a0c881083b..521c63eb45 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -4582,6 +4582,8 @@ void DLLCALL bbs_thread(void* arg) if(!terminate_server) { lprintf(LOG_INFO,"Recycling server..."); mswait(2000); + if(startup->recycle!=NULL) + startup->recycle(startup->cbdata); } } while(!terminate_server); diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c index 4246711f64..ae4d2c6f3c 100644 --- a/src/sbbs3/sbbscon.c +++ b/src/sbbs3/sbbscon.c @@ -754,7 +754,8 @@ static void terminate(void) } } -static void read_startup_ini(void) +static void read_startup_ini(bbs_startup_t* bbs, ftp_startup_t* ftp, web_startup_t* web + ,mail_startup_t* mail, services_startup_t* services) { char str[MAX_PATH+1]; FILE* fp=NULL; @@ -775,11 +776,11 @@ static void read_startup_ini(void) /* We call this function to set defaults, even if there's no .ini file */ sbbs_read_ini(fp, NULL, /* global_startup */ - &run_bbs, &bbs_startup, - &run_ftp, &ftp_startup, - &run_web, &web_startup, - &run_mail, &mail_startup, - &run_services, &services_startup); + &run_bbs, bbs, + &run_ftp, ftp, + &run_web, web, + &run_mail, mail, + &run_services, services); /* read/default any sbbscon-specific .ini keys here */ #if defined(__unix__) @@ -797,6 +798,28 @@ static void read_startup_ini(void) fclose(fp); } +/* Server recycle callback (read relevant startup .ini file section) */ +void recycle(void* cbdata) +{ + bbs_startup_t* bbs=NULL; + ftp_startup_t* ftp=NULL; + web_startup_t* web=NULL; + mail_startup_t* mail=NULL; + services_startup_t* services=NULL; + + if(cbdata==&bbs_startup) + bbs=cbdata; + else if(cbdata==&ftp_startup) + ftp=cbdata; + else if(cbdata==&web_startup) + web=cbdata; + else if(cbdata==&mail_startup) + mail=cbdata; + else if(cbdata==&services_startup) + services=cbdata; + + read_startup_ini(bbs,ftp,web,mail,services); +} #if defined(_WIN32) BOOL WINAPI ControlHandler(DWORD CtrlType) @@ -971,10 +994,11 @@ int main(int argc, char** argv) /* Initialize BBS startup structure */ memset(&bbs_startup,0,sizeof(bbs_startup)); bbs_startup.size=sizeof(bbs_startup); - + bbs_startup.cbdata=&bbs_startup; bbs_startup.lputs=bbs_lputs; bbs_startup.event_lputs=event_lputs; bbs_startup.started=bbs_started; + bbs_startup.recycle=recycle; bbs_startup.terminated=bbs_terminated; bbs_startup.thread_up=thread_up; bbs_startup.socket_open=socket_open; @@ -992,8 +1016,10 @@ int main(int argc, char** argv) /* Initialize FTP startup structure */ memset(&ftp_startup,0,sizeof(ftp_startup)); ftp_startup.size=sizeof(ftp_startup); + ftp_startup.cbdata=&ftp_startup; ftp_startup.lputs=ftp_lputs; ftp_startup.started=ftp_started; + ftp_startup.recycle=recycle; ftp_startup.terminated=ftp_terminated; ftp_startup.thread_up=thread_up; ftp_startup.socket_open=socket_open; @@ -1008,8 +1034,10 @@ int main(int argc, char** argv) /* Initialize Web Server startup structure */ memset(&web_startup,0,sizeof(web_startup)); web_startup.size=sizeof(web_startup); + web_startup.cbdata=&web_startup; web_startup.lputs=web_lputs; web_startup.started=web_started; + web_startup.recycle=recycle; web_startup.terminated=web_terminated; web_startup.thread_up=thread_up; web_startup.socket_open=socket_open; @@ -1022,8 +1050,10 @@ int main(int argc, char** argv) /* Initialize Mail Server startup structure */ memset(&mail_startup,0,sizeof(mail_startup)); mail_startup.size=sizeof(mail_startup); + mail_startup.cbdata=&mail_startup; mail_startup.lputs=mail_lputs; mail_startup.started=mail_started; + mail_startup.recycle=recycle; mail_startup.terminated=mail_terminated; mail_startup.thread_up=thread_up; mail_startup.socket_open=socket_open; @@ -1062,8 +1092,10 @@ int main(int argc, char** argv) /* Initialize Services startup structure */ memset(&services_startup,0,sizeof(services_startup)); services_startup.size=sizeof(services_startup); + services_startup.cbdata=&services_startup; services_startup.lputs=services_lputs; services_startup.started=services_started; + services_startup.recycle=recycle; services_startup.terminated=services_terminated; services_startup.thread_up=thread_up; services_startup.socket_open=socket_open; @@ -1089,7 +1121,7 @@ int main(int argc, char** argv) } } - read_startup_ini(); + read_startup_ini(&bbs_startup, &ftp_startup, &web_startup, &mail_startup, &services_startup); #if SBBS_MAGIC_FILENAMES /* This stuff is just broken */ diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c index 93b863de73..eeea76e4d3 100644 --- a/src/sbbs3/services.c +++ b/src/sbbs3/services.c @@ -2161,6 +2161,8 @@ void DLLCALL services_thread(void* arg) if(!terminated) { lprintf(LOG_INFO,"Recycling server..."); mswait(2000); + if(startup->recycle!=NULL) + startup->recycle(startup->cbdata); } } while(!terminated); diff --git a/src/sbbs3/services.h b/src/sbbs3/services.h index 86e43f3189..47e5309433 100644 --- a/src/sbbs3/services.h +++ b/src/sbbs3/services.h @@ -63,6 +63,7 @@ typedef struct { int (*lputs)(void*, int, char*); /* Log - put string */ void (*status)(void*, char*); void (*started)(void*); + void (*recycle)(void*); void (*terminated)(void*, int code); void (*clients)(void*, int active); void (*thread_up)(void*, BOOL up, BOOL setuid); diff --git a/src/sbbs3/startup.h b/src/sbbs3/startup.h index 1cdfead3b2..053e94000b 100644 --- a/src/sbbs3/startup.h +++ b/src/sbbs3/startup.h @@ -97,6 +97,7 @@ typedef struct { int (*event_lputs)(int, char*); /* Event log - put string */ void (*status)(void*, char*); void (*started)(void*); + void (*recycle)(void*); void (*terminated)(void*, int code); void (*clients)(void*, int active); void (*thread_up)(void*, BOOL up, BOOL setuid); diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index c1eabb5f2a..9d91a16f7c 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -3183,6 +3183,8 @@ void DLLCALL web_server(void* arg) if(!terminate_server) { lprintf(LOG_INFO,"Recycling server..."); mswait(2000); + if(startup->recycle!=NULL) + startup->recycle(startup->cbdata); } } while(!terminate_server); diff --git a/src/sbbs3/websrvr.h b/src/sbbs3/websrvr.h index 9b16c0ec69..f40f410999 100644 --- a/src/sbbs3/websrvr.h +++ b/src/sbbs3/websrvr.h @@ -60,6 +60,7 @@ typedef struct { int (*lputs)(void*, int, char*); void (*status)(void*, char*); void (*started)(void*); + void (*recycle)(void*); void (*terminated)(void*, int code); void (*clients)(void*, int active); void (*thread_up)(void*, BOOL up, BOOL setuid); -- GitLab