--- lbbs/src/menu_proc.c 2005/05/07 09:28:12 1.3 +++ lbbs/src/menu_proc.c 2025/05/11 01:54:00 1.14 @@ -1,16 +1,15 @@ /*************************************************************************** - menu_proc.c - description - ------------------- - begin : Fri May 6 2005 - copyright : (C) 2005 by Leaflet - email : leaflet@leafok.com + menu_proc.c - description + ------------------- + Copyright : (C) 2004-2025 by Leaflet + Email : leaflet@leafok.com ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * + * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ @@ -18,86 +17,128 @@ #include "bbs.h" #include "bbs_cmd.h" #include "common.h" +#include "log.h" #include "io.h" +#include "screen.h" +#include "menu.h" #include -#include +#include +#include #include +#include +#include +#include -int -exec_mbem(const char *str) +int exec_mbem(const char *str) { - void *hdll; - int (*func) (); - char *c,*s; - char buf[1024]; - - strcpy(buf, str); - s = strstr(buf, "@mod:"); - if (s) { - c = strstr(s + 5, "#"); - if (c) { - *c = 0; - c++; - } - - hdll = dlopen (s + 5, RTLD_LAZY); - - if (hdll) { - char *error; - - if ((func = dlsym (hdll, c ? c : "mod_main")) != NULL) - func (); - else if ((error = dlerror ()) != NULL) { - clearscr (); - prints ("%s\r\n", error); - press_any_key (); - } - dlclose (hdll); - } else { - clearscr (); - prints ("加载库文件 [%s] 失败!!\r\n", s + 5); - prints ("失败原因:%s\r\n", dlerror()); - press_any_key (); - } - } - - return REDRAW; -} - -int -exitbbs (const char *s) + void *hdll; + int (*func)(); + char *c, *s; + char buf[FILE_PATH_LEN]; + + strncpy(buf, str, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; + + s = strstr(buf, "@mod:"); + if (s) + { + c = strstr(s + 5, "#"); + if (c) + { + *c = 0; + c++; + } + + hdll = dlopen(s + 5, RTLD_LAZY); + + if (hdll) + { + char *error; + + if ((func = dlsym(hdll, c ? c : "mod_main")) != NULL) + func(); + else if ((error = dlerror()) != NULL) + { + clearscr(); + prints("%s\r\n", error); + press_any_key(); + } + dlclose(hdll); + } + else + { + clearscr(); + prints("加载库文件 [%s] 失败!!\r\n", s + 5); + prints("失败原因:%s\r\n", dlerror()); + press_any_key(); + } + } + + return REDRAW; +} + +int exitbbs(const char *s) { - return EXITBBS; + return EXITBBS; } -int -license (const char *s) +int license(const char *s) { - char temp[256]; - - strcpy (temp, app_home_dir); - strcat (temp, "data/license.txt"); - display_file_ex (temp, 0, 1); + display_file_ex(DATA_LICENSE, 1, 1); - return REDRAW; + return REDRAW; } -int -copyright (const char *s) +int copyright(const char *s) { - char temp[256]; + display_file_ex(DATA_COPYRIGHT, 1, 1); + + return REDRAW; +} + +int reloadbbsmenu(const char *s) +{ + MENU_SET new_menu; + + clearscr(); + + if (load_menu(&new_menu, CONF_MENU) < 0) + { + log_error("Reload menu failed\n"); + + unload_menu(&new_menu); + + prints("菜单配置校验失败\r\n"); + } + else + { + unload_menu(&new_menu); + + if (kill(getppid(), SIGHUP) < 0) + { + log_error("Send SIGHUP signal failed (%d)\n", errno); - strcpy (temp, app_home_dir); - strcat (temp, "data/copyright.txt"); - display_file_ex (temp, 0, 1); + prints("发送指令失败\r\n"); + } + else + { + prints("已发送指令\r\n"); + } + } - return REDRAW; + press_any_key(); + + return REDRAW; } -int -notify_reload_menu (const char *s) +int shutdownbbs(const char *s) { - kill (0, SIG_RELOAD_MENU); + log_std("Notify main process to exit\n"); + + if (kill(getppid(), SIGTERM) < 0) + { + log_error("Send SIGTERM signal failed (%d)\n", errno); + } - return REDRAW; + return REDRAW; }