/[LeafOK_CVS]/lbbs/src/bbs_main.c
ViewVC logotype

Annotation of /lbbs/src/bbs_main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.76 - (hide annotations)
Wed Jul 2 04:17:33 2025 UTC (8 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.75: +7 -7 lines
Content type: text/x-csrc
Support UTF8 instead of GBK

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.31 bbs_main.c - description
3     -------------------
4 sysadm 1.36 Copyright : (C) 2004-2025 by Leaflet
5     Email : leaflet@leafok.com
6 sysadm 1.1 ***************************************************************************/
7    
8     /***************************************************************************
9     * *
10     * This program is free software; you can redistribute it and/or modify *
11     * it under the terms of the GNU General Public License as published by *
12 sysadm 1.36 * the Free Software Foundation; either version 3 of the License, or *
13 sysadm 1.1 * (at your option) any later version. *
14     * *
15     ***************************************************************************/
16    
17 sysadm 1.73 #include "article_view_log.h"
18     #include "bbs.h"
19     #include "bbs_cmd.h"
20 sysadm 1.32 #include "bbs_main.h"
21 sysadm 1.1 #include "common.h"
22 sysadm 1.35 #include "database.h"
23 sysadm 1.73 #include "editor.h"
24     #include "io.h"
25 sysadm 1.32 #include "log.h"
26 sysadm 1.73 #include "login.h"
27     #include "menu.h"
28 sysadm 1.32 #include "screen.h"
29 sysadm 1.55 #include "section_list.h"
30     #include "trie_dict.h"
31 sysadm 1.73 #include "user_priv.h"
32 sysadm 1.74 #include <errno.h>
33     #include <signal.h>
34 sysadm 1.73 #include <stdlib.h>
35     #include <string.h>
36     #include <time.h>
37 sysadm 1.32 #include <unistd.h>
38 sysadm 1.16
39 sysadm 1.31 int bbs_info()
40 sysadm 1.5 {
41 sysadm 1.76 prints("欢迎光临 \033[1;33m%s \033[32m[%s] \033[37m( %s )\r\n",
42 sysadm 1.72 BBS_name, BBS_server, APP_INFO);
43 sysadm 1.16
44 sysadm 1.43 return iflush();
45     }
46    
47 sysadm 1.65 int bbs_welcome(void)
48 sysadm 1.43 {
49     char sql[SQL_BUFFER_LEN];
50    
51     u_int32_t u_online = 0;
52     u_int32_t u_anonymous = 0;
53     u_int32_t u_total = 0;
54     u_int32_t u_login_count = 0;
55    
56 sysadm 1.65 MYSQL *db;
57 sysadm 1.43 MYSQL_RES *rs;
58     MYSQL_ROW row;
59    
60 sysadm 1.65 db = db_open();
61     if (db == NULL)
62     {
63     return -1;
64     }
65    
66 sysadm 1.43 snprintf(sql, sizeof(sql),
67     "SELECT COUNT(*) AS cc FROM "
68     "(SELECT DISTINCT SID FROM user_online "
69     "WHERE last_tm >= SUBDATE(NOW(), INTERVAL %d SECOND)) AS t1",
70     BBS_user_off_line);
71     if (mysql_query(db, sql) != 0)
72     {
73 sysadm 1.54 log_error("Query user_online error: %s\n", mysql_error(db));
74 sysadm 1.65 mysql_close(db);
75 sysadm 1.43 return -2;
76     }
77     if ((rs = mysql_store_result(db)) == NULL)
78     {
79     log_error("Get user_online data failed\n");
80 sysadm 1.65 mysql_close(db);
81 sysadm 1.43 return -2;
82     }
83     if ((row = mysql_fetch_row(rs)))
84     {
85     u_online = (u_int32_t)atoi(row[0]);
86     }
87     mysql_free_result(rs);
88    
89     snprintf(sql, sizeof(sql),
90     "SELECT COUNT(*) AS cc FROM "
91     "(SELECT DISTINCT SID FROM user_online "
92     "WHERE UID = 0 AND last_tm >= SUBDATE(NOW(), INTERVAL %d SECOND)) AS t1",
93     BBS_user_off_line);
94     if (mysql_query(db, sql) != 0)
95     {
96 sysadm 1.54 log_error("Query user_online error: %s\n", mysql_error(db));
97 sysadm 1.65 mysql_close(db);
98 sysadm 1.43 return -2;
99     }
100     if ((rs = mysql_store_result(db)) == NULL)
101     {
102     log_error("Get user_online data failed\n");
103 sysadm 1.65 mysql_close(db);
104 sysadm 1.43 return -2;
105     }
106     if ((row = mysql_fetch_row(rs)))
107     {
108     u_anonymous = (u_int32_t)atoi(row[0]);
109     }
110     mysql_free_result(rs);
111    
112     snprintf(sql, sizeof(sql), "SELECT COUNT(UID) AS cc FROM user_list WHERE enable");
113     if (mysql_query(db, sql) != 0)
114     {
115 sysadm 1.54 log_error("Query user_list error: %s\n", mysql_error(db));
116 sysadm 1.65 mysql_close(db);
117 sysadm 1.43 return -2;
118     }
119     if ((rs = mysql_store_result(db)) == NULL)
120     {
121     log_error("Get user_list data failed\n");
122 sysadm 1.65 mysql_close(db);
123 sysadm 1.43 return -2;
124     }
125     if ((row = mysql_fetch_row(rs)))
126     {
127     u_total = (u_int32_t)atoi(row[0]);
128     }
129     mysql_free_result(rs);
130    
131     snprintf(sql, sizeof(sql), "SELECT ID FROM user_login_log ORDER BY ID LIMIT 1");
132     if (mysql_query(db, sql) != 0)
133     {
134 sysadm 1.54 log_error("Query user_login_log error: %s\n", mysql_error(db));
135 sysadm 1.65 mysql_close(db);
136 sysadm 1.43 return -2;
137     }
138     if ((rs = mysql_store_result(db)) == NULL)
139     {
140     log_error("Get user_login_log data failed\n");
141 sysadm 1.65 mysql_close(db);
142 sysadm 1.43 return -2;
143     }
144     if ((row = mysql_fetch_row(rs)))
145     {
146     u_login_count = (u_int32_t)atoi(row[0]);
147     }
148     mysql_free_result(rs);
149    
150 sysadm 1.65 mysql_close(db);
151    
152 sysadm 1.43 // Count current user before login
153     u_online++;
154     u_anonymous++;
155    
156     // Display logo
157 sysadm 1.68 display_file(DATA_WELCOME, 2);
158 sysadm 1.43
159     // Display welcome message
160 sysadm 1.76 prints("\r\033[1;35m欢迎光临\033[33m 【 %s 】 \033[35mBBS\r\n"
161     "\033[32m目前上站人数 [\033[36m%d/%d\033[32m] "
162     "匿名游客[\033[36m%d\033[32m] "
163     "注册用户数[\033[36m%d/%d\033[32m]\r\n"
164     "从 [\033[36m%s\033[32m] 起,累计访问人次:[\033[36m%d\033[32m]\033[m\r\n",
165 sysadm 1.43 BBS_name, u_online, BBS_max_client, u_anonymous, u_total,
166 sysadm 1.66 BBS_max_user, BBS_start_dt, u_login_count);
167 sysadm 1.5
168 sysadm 1.64 iflush();
169    
170 sysadm 1.31 return 0;
171 sysadm 1.5 }
172    
173 sysadm 1.65 int bbs_logout(void)
174 sysadm 1.5 {
175 sysadm 1.65 MYSQL *db;
176    
177     db = db_open();
178     if (db == NULL)
179     {
180     return -1;
181     }
182    
183 sysadm 1.43 if (user_online_del(db) < 0)
184     {
185 sysadm 1.65 return -2;
186 sysadm 1.43 }
187    
188 sysadm 1.65 mysql_close(db);
189    
190 sysadm 1.68 display_file(DATA_GOODBYE, 1);
191 sysadm 1.43
192 sysadm 1.62 log_common("User logout\n");
193 sysadm 1.7
194 sysadm 1.31 return 0;
195 sysadm 1.7 }
196    
197 sysadm 1.31 int bbs_center()
198 sysadm 1.7 {
199 sysadm 1.39 int ch;
200 sysadm 1.31 time_t t_last_action;
201 sysadm 1.16
202 sysadm 1.70 BBS_last_access_tm = t_last_action = time(NULL);
203 sysadm 1.16
204 sysadm 1.31 clearscr();
205 sysadm 1.12
206 sysadm 1.58 show_top("", BBS_name, "");
207 sysadm 1.31 show_active_board();
208     show_bottom("");
209 sysadm 1.75 display_menu(&bbs_menu);
210 sysadm 1.50 iflush();
211 sysadm 1.16
212 sysadm 1.37 while (!SYS_server_exit)
213 sysadm 1.25 {
214 sysadm 1.44 ch = igetch(100);
215 sysadm 1.16
216 sysadm 1.75 if (bbs_menu.choose_step == 0 && time(NULL) - t_last_action >= 10)
217 sysadm 1.31 {
218 sysadm 1.70 t_last_action = time(NULL);
219 sysadm 1.52
220 sysadm 1.31 show_active_board();
221     show_bottom("");
222 sysadm 1.75 display_menu_cursor(&bbs_menu, 1);
223 sysadm 1.50 iflush();
224 sysadm 1.31 }
225    
226 sysadm 1.71 if (user_online_update("MENU") < 0)
227     {
228     log_error("user_online_update(MENU) error\n");
229     }
230    
231 sysadm 1.31 switch (ch)
232     {
233 sysadm 1.42 case KEY_NULL: // broken pipe
234     return 0;
235 sysadm 1.31 case KEY_TIMEOUT:
236 sysadm 1.70 if (time(NULL) - BBS_last_access_tm >= MAX_DELAY_TIME)
237 sysadm 1.31 {
238 sysadm 1.38 return 0;
239 sysadm 1.31 }
240 sysadm 1.39 continue;
241 sysadm 1.44 case CR:
242     igetch_reset();
243 sysadm 1.31 default:
244 sysadm 1.75 switch (menu_control(&bbs_menu, ch))
245 sysadm 1.31 {
246     case EXITBBS:
247 sysadm 1.74 case EXITMENU:
248 sysadm 1.31 return 0;
249     case REDRAW:
250 sysadm 1.70 t_last_action = time(NULL);
251 sysadm 1.39 clearscr();
252 sysadm 1.58 show_top("", BBS_name, "");
253 sysadm 1.39 show_active_board();
254     show_bottom("");
255 sysadm 1.75 display_menu(&bbs_menu);
256 sysadm 1.31 break;
257     case NOREDRAW:
258     case UNKNOWN_CMD:
259     default:
260     break;
261     }
262 sysadm 1.50 iflush();
263 sysadm 1.31 }
264 sysadm 1.50
265 sysadm 1.70 BBS_last_access_tm = time(NULL);
266 sysadm 1.16 }
267 sysadm 1.7
268 sysadm 1.31 return 0;
269 sysadm 1.15 }
270 sysadm 1.32
271     int bbs_main()
272     {
273 sysadm 1.74 struct sigaction act = {0};
274    
275     // Set signal handler
276     act.sa_handler = SIG_IGN;
277     if (sigaction(SIGHUP, &act, NULL) == -1)
278     {
279     log_error("set signal action of SIGHUP error: %d\n", errno);
280     goto cleanup;
281     }
282     act.sa_handler = SIG_DFL;
283     if (sigaction(SIGCHLD, &act, NULL) == -1)
284     {
285     log_error("set signal action of SIGCHLD error: %d\n", errno);
286     goto cleanup;
287     }
288    
289 sysadm 1.55 // Set data pools in shared memory readonly
290     if (set_trie_dict_shm_readonly() < 0)
291     {
292     goto cleanup;
293     }
294     if (set_article_block_shm_readonly() < 0)
295     {
296     goto cleanup;
297     }
298     if (set_section_list_shm_readonly() < 0)
299     {
300     goto cleanup;
301     }
302    
303     // Load menu in shared memory
304 sysadm 1.75 if (set_menu_shm_readonly(&bbs_menu) < 0)
305 sysadm 1.55 {
306     goto cleanup;
307     }
308 sysadm 1.32
309     set_input_echo(0);
310    
311 sysadm 1.43 // System info
312     if (bbs_info() < 0)
313     {
314 sysadm 1.55 goto cleanup;
315 sysadm 1.43 }
316    
317 sysadm 1.32 // Welcome
318 sysadm 1.65 if (bbs_welcome() < 0)
319 sysadm 1.43 {
320 sysadm 1.55 goto cleanup;
321 sysadm 1.43 }
322 sysadm 1.32
323 sysadm 1.43 // User login
324 sysadm 1.64 if (SSH_v2)
325     {
326 sysadm 1.76 prints("\033[1m%s 欢迎使用ssh方式访问 \033[1;33m按任意键继续...\033[m", BBS_username);
327 sysadm 1.64 iflush();
328     igetch_t(MAX_DELAY_TIME);
329     }
330 sysadm 1.65 else if (bbs_login() < 0)
331 sysadm 1.43 {
332 sysadm 1.55 goto cleanup;
333 sysadm 1.43 }
334 sysadm 1.64
335 sysadm 1.67 // Load article view log
336     if (article_view_log_load(BBS_priv.uid, &BBS_article_view_log, 0) < 0)
337     {
338     log_error("article_view_log_load() error\n");
339     goto cleanup;
340     }
341 sysadm 1.65
342 sysadm 1.69 // Init editor memory pool
343     if (editor_memory_pool_init() < 0)
344     {
345     log_error("editor_memory_pool_init() error\n");
346     goto cleanup;
347     }
348    
349 sysadm 1.32 clearscr();
350    
351     // BBS Top 10
352 sysadm 1.68 display_file(VAR_BBS_TOP, 1);
353 sysadm 1.32
354 sysadm 1.55 // Main
355     bbs_center();
356    
357     // Logout
358 sysadm 1.65 bbs_logout();
359 sysadm 1.55
360 sysadm 1.67 // Save incremental article view log
361     if (article_view_log_save_inc(&BBS_article_view_log) < 0)
362     {
363     log_error("article_view_log_save_inc() error\n");
364     }
365    
366 sysadm 1.55 cleanup:
367 sysadm 1.69 // Cleanup editor memory pool
368     editor_memory_pool_cleanup();
369 sysadm 1.71
370 sysadm 1.67 // Unload article view log
371     article_view_log_unload(&BBS_article_view_log);
372    
373 sysadm 1.55 // Detach menu in shared memory
374 sysadm 1.75 detach_menu_shm(&bbs_menu);
375 sysadm 1.46
376 sysadm 1.55 // Detach data pools shm
377     detach_section_list_shm();
378     detach_article_block_shm();
379     detach_trie_dict_shm();
380 sysadm 1.35
381 sysadm 1.32 return 0;
382     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1