--- lbbs/src/net_server.c 2025/05/13 07:30:53 1.30 +++ lbbs/src/net_server.c 2025/05/15 06:24:11 1.34 @@ -35,6 +35,7 @@ #include #include #include +#include int net_server(const char *hostaddr, in_port_t port) { @@ -45,6 +46,8 @@ int net_server(const char *hostaddr, in_ struct epoll_event ev, events[MAX_EVENTS]; int nfds, epollfd; siginfo_t siginfo; + int sd_notify_stopping = 0; + MENU_SET *p_bbs_menu_new; socket_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); @@ -112,8 +115,19 @@ int net_server(const char *hostaddr, in_ flags = fcntl(socket_server, F_GETFL, 0); fcntl(socket_server, F_SETFL, flags | O_NONBLOCK); + // Startup complete + sd_notifyf(0, "READY=1\n" + "STATUS=Listening at %s:%d\n" + "MAINPID=%d", + hostaddr_server, port_server, getpid()); + while (!SYS_server_exit || SYS_child_process_count > 0) { + if (SYS_server_exit && !sd_notify_stopping) + { + sd_notify(0, "STOPPING=1"); + sd_notify_stopping = 1; + } while ((SYS_child_exit || SYS_server_exit) && SYS_child_process_count > 0) { SYS_child_exit = 0; @@ -145,18 +159,36 @@ int net_server(const char *hostaddr, in_ { log_error("Send SIGTERM signal failed (%d)\n", errno); } + + sd_notifyf(0, "STATUS=Waiting for %d child process to exit", SYS_child_process_count); } if (SYS_menu_reload && !SYS_server_exit) { SYS_menu_reload = 0; - if (reload_menu(&bbs_menu) < 0) + p_bbs_menu_new = calloc(1, sizeof(MENU_SET)); + if (p_bbs_menu_new == NULL) + { + log_error("OOM: calloc(MENU_SET)\n"); + } + else if (load_menu(p_bbs_menu_new, CONF_MENU) < 0) { + unload_menu(p_bbs_menu_new); + free(p_bbs_menu_new); + log_error("Reload menu failed\n"); } else { + unload_menu_shm(p_bbs_menu_new); + + unload_menu(p_bbs_menu); + free(p_bbs_menu); + + p_bbs_menu = p_bbs_menu_new; + p_bbs_menu_new = NULL; + log_std("Reload menu successfully\n"); } }