--- lbbs/src/common.c 2005/05/07 12:08:28 1.7 +++ lbbs/src/common.c 2025/06/01 03:07:42 1.26 @@ -1,33 +1,49 @@ /*************************************************************************** - common.c - description - ------------------- - begin : Mon Oct 18 2004 - copyright : (C) 2004 by Leaflet - email : leaflet@leafok.com + common.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. * * * ***************************************************************************/ +#define _POSIX_C_SOURCE 200112L + +#include "common.h" +#include "log.h" #include "menu.h" +#include #include #include -#include -//Version information +// Version information char app_version[256] = "LBBS-devel version 1.0"; -//Global declaration for enviroment -char app_home_dir[256]; -char app_temp_dir[256]; +// File loader +const char *data_files_load_startup[] = { + DATA_WELCOME, + DATA_REGISTER, + DATA_GOODBYE, + DATA_LICENSE, + DATA_COPYRIGHT, + DATA_LOGIN_ERROR, + DATA_ACTIVE_BOARD, + DATA_READ_HELP, + VAR_BBS_TOP}; +int data_files_load_startup_count = 9; // Count of data_files_load_startup[] + +const char *data_files_load_timeval[] = { + VAR_BBS_TOP}; +int data_files_load_timeval_count = 1; // Count of data_files_load_timeval[] -//Global declaration for sockets +// Global declaration for sockets int socket_server; int socket_client; char hostaddr_server[50]; @@ -35,99 +51,88 @@ char hostaddr_client[50]; int port_server; int port_client; -//Global declaration for database -char DB_host[256]; -char DB_username[50]; -char DB_password[50]; -char DB_database[50]; - -//Global declaration for system -int SYS_exit; -int SYS_child_process_count; - -//Common function -const char * -str_space (char *string, int length) -{ - int i; - for (i = 0; i < length; i++) - { - string[i] = ' '; - } - string[length] = '\0'; - return string; -} +// Global declaration for system +volatile int SYS_server_exit = 0; +volatile int SYS_child_process_count = 0; +volatile int SYS_child_exit = 0; +volatile int SYS_conf_reload = 0; +volatile int SYS_data_file_reload = 0; +volatile int SYS_section_list_reload = 0; -const char * -get_time_str (char *string, size_t length) +static const char *weekday[] = { + "天", "一", "二", "三", "四", "五", "六"}; + +// Common function +const char *get_time_str(char *s, size_t len) { - char week[10], buffer[256]; - time_t curtime; - struct tm *loctime; - - curtime = time (NULL); - loctime = localtime (&curtime); - - strftime (buffer, 256, "%Y年%m月%d日%H:%M:%S ", loctime); - - switch (loctime->tm_wday) - { - case 0: - strcpy (week, "星期天"); - break; - case 1: - strcpy (week, "星期一"); - break; - case 2: - strcpy (week, "星期二"); - break; - case 3: - strcpy (week, "星期三"); - break; - case 4: - strcpy (week, "星期四"); - break; - case 5: - strcpy (week, "星期五"); - break; - case 6: - strcpy (week, "星期六"); - break; - } - strcat (buffer, week); + time_t curtime; + struct tm local_tm; + + time(&curtime); + localtime_r(&curtime, &local_tm); + size_t j = strftime(s, len, "%b %d %H:%M 星期", &local_tm); - strncpy (string, buffer, length); + if (j == 0 || j + strlen(weekday[local_tm.tm_wday]) + 1 > len) + { + return NULL; + } - return string; + strncat(s, weekday[local_tm.tm_wday], len - 1 - j); + + return s; } -void -reload_bbs_menu (int i) +void sig_hup_handler(int i) { - if (reload_menu (&bbs_menu) < 0) - log_error ("Reload menu failed\n"); - else - log_std ("Reload menu successfully\n"); + SYS_conf_reload = 1; + SYS_data_file_reload = 1; + SYS_section_list_reload = 1; +} +void sig_term_handler(int i) +{ + SYS_server_exit = 1; } -void -system_exit (int i) +void sig_chld_handler(int i) { - SYS_exit = 1; - log_std ("Get SIG_BBS_EXIT signal successfully\n"); + SYS_child_exit = 1; } -void -child_exit (int i) +const char *ip_mask(char *s, int level, char mask) { - int pid; - - pid = wait (0); - - if (pid > 0) - { - SYS_child_process_count --; - log_std ("Child process (%d) exited\n", pid); - } + char *p = s; + + if (level <= 0) + { + return s; + } + if (level > 4) + { + level = 4; + } + + for (int i = 0; i < 4 - level; i++) + { + p = strchr(p, '.'); + if (p == NULL) + { + return s; + } + p++; + } + + for (int i = 0; i < level; i++) + { + *p = mask; + p++; + if (i < level - 1) + { + *p = '.'; + p++; + } + } + *p = '\0'; + + return s; }