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

Annotation of /lbbs/src/login.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.61 - (hide annotations)
Wed Oct 22 05:50:13 2025 UTC (4 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.60: +2 -2 lines
Content type: text/x-csrc
Refine handling of Guest

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.11 login.c - description
3     -------------------
4 sysadm 1.20 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.20 * 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     #include "bbs.h"
18     #include "common.h"
19 sysadm 1.48 #include "database.h"
20     #include "io.h"
21 sysadm 1.50 #include "ip_mask.h"
22 sysadm 1.14 #include "log.h"
23 sysadm 1.48 #include "login.h"
24 sysadm 1.14 #include "screen.h"
25 sysadm 1.48 #include "user_priv.h"
26     #include <ctype.h>
27 sysadm 1.34 #include <errno.h>
28 sysadm 1.48 #include <stdlib.h>
29 sysadm 1.14 #include <string.h>
30 sysadm 1.3 #include <regex.h>
31 sysadm 1.14 #include <unistd.h>
32 sysadm 1.36 #include <mysql/mysql.h>
33 sysadm 1.56 #include <sys/param.h>
34 sysadm 1.1
35 sysadm 1.41 int bbs_login(void)
36 sysadm 1.1 {
37 sysadm 1.15 char username[BBS_username_max_len + 1];
38     char password[BBS_password_max_len + 1];
39 sysadm 1.37 int i = 0;
40 sysadm 1.16 int ok = 0;
41 sysadm 1.2
42 sysadm 1.37 for (; !SYS_server_exit && !ok && i < BBS_login_retry_times; i++)
43 sysadm 1.11 {
44 sysadm 1.49 prints("\033[1;33m请输入帐号\033[m(试用请输入`\033[1;36mguest\033[m', "
45     "注册请输入`\033[1;31mnew\033[m'): ");
46 sysadm 1.11 iflush();
47    
48 sysadm 1.24 if (str_input(username, sizeof(username), DOECHO) < 0)
49     {
50     continue;
51     }
52 sysadm 1.11
53     if (strcmp(username, "guest") == 0)
54     {
55 sysadm 1.41 load_guest_info();
56 sysadm 1.14
57 sysadm 1.11 return 0;
58     }
59    
60     if (strcmp(username, "new") == 0)
61     {
62 sysadm 1.42 display_file(DATA_REGISTER, 1);
63 sysadm 1.30
64 sysadm 1.51 return -1;
65 sysadm 1.11 }
66    
67 sysadm 1.17 if (username[0] != '\0')
68 sysadm 1.11 {
69 sysadm 1.49 prints("\033[1;37m请输入密码\033[m: ");
70 sysadm 1.11 iflush();
71    
72 sysadm 1.24 if (str_input(password, sizeof(password), NOECHO) < 0)
73     {
74     continue;
75     }
76 sysadm 1.11
77 sysadm 1.41 ok = (check_user(username, password) == 0);
78 sysadm 1.31 iflush();
79 sysadm 1.11 }
80 sysadm 1.24 }
81    
82     if (!ok)
83     {
84 sysadm 1.42 display_file(DATA_LOGIN_ERROR, 1);
85 sysadm 1.24 return -1;
86 sysadm 1.11 }
87 sysadm 1.2
88 sysadm 1.38 log_common("User \"%s\"(%ld) login from %s:%d\n",
89 sysadm 1.39 BBS_username, BBS_priv.uid, hostaddr_client, port_client);
90 sysadm 1.28
91 sysadm 1.11 return 0;
92     }
93 sysadm 1.2
94 sysadm 1.41 int check_user(const char *username, const char *password)
95 sysadm 1.11 {
96 sysadm 1.44 MYSQL *db = NULL;
97     MYSQL_RES *rs = NULL;
98 sysadm 1.11 MYSQL_ROW row;
99 sysadm 1.15 char sql[SQL_BUFFER_LEN];
100 sysadm 1.44 int ret = 0;
101 sysadm 1.40 int BBS_uid = 0;
102 sysadm 1.22 char client_addr[IP_ADDR_LEN];
103 sysadm 1.27 int i;
104     int ok = 1;
105 sysadm 1.34 char user_tz_env[BBS_user_tz_max_len + 2];
106 sysadm 1.11
107 sysadm 1.41 db = db_open();
108     if (db == NULL)
109     {
110 sysadm 1.44 ret = -1;
111     goto cleanup;
112 sysadm 1.41 }
113    
114 sysadm 1.11 // Verify format
115 sysadm 1.27 for (i = 0; ok && username[i] != '\0'; i++)
116     {
117     if (!(isalpha(username[i]) || (i > 0 && isdigit(username[i]))))
118     {
119     ok = 0;
120     }
121     }
122     if (ok && (i < 3 || i > 12))
123     {
124     ok = 0;
125     }
126     for (i = 0; ok && password[i] != '\0'; i++)
127     {
128     if (!isalnum(password[i]))
129     {
130     ok = 0;
131     }
132     }
133     if (ok && (i < 5 || i > 12))
134     {
135     ok = 0;
136     }
137    
138     if (!ok)
139 sysadm 1.5 {
140 sysadm 1.49 prints("\033[1;31m用户名或密码格式错误...\033[m\r\n");
141 sysadm 1.44 ret = 1;
142     goto cleanup;
143 sysadm 1.5 }
144    
145 sysadm 1.13 // Begin transaction
146     if (mysql_query(db, "SET autocommit=0") != 0)
147     {
148 sysadm 1.33 log_error("SET autocommit=0 error: %s\n", mysql_error(db));
149 sysadm 1.44 ret = -1;
150     goto cleanup;
151 sysadm 1.13 }
152    
153     if (mysql_query(db, "BEGIN") != 0)
154     {
155 sysadm 1.33 log_error("Begin transaction error: %s\n", mysql_error(db));
156 sysadm 1.44 ret = -1;
157     goto cleanup;
158 sysadm 1.13 }
159    
160 sysadm 1.22 // Failed login attempts from the same source (subnet /24) during certain time period
161     strncpy(client_addr, hostaddr_client, sizeof(client_addr) - 1);
162     client_addr[sizeof(client_addr) - 1] = '\0';
163    
164     snprintf(sql, sizeof(sql),
165     "SELECT COUNT(*) AS err_count FROM user_err_login_log "
166 sysadm 1.44 "WHERE login_dt >= SUBDATE(NOW(), INTERVAL %d MINUTE) "
167 sysadm 1.22 "AND login_ip LIKE '%s'",
168 sysadm 1.44 BBS_login_failures_count_interval,
169 sysadm 1.22 ip_mask(client_addr, 1, '%'));
170     if (mysql_query(db, sql) != 0)
171     {
172 sysadm 1.33 log_error("Query user_list error: %s\n", mysql_error(db));
173 sysadm 1.44 ret = -1;
174     goto cleanup;
175 sysadm 1.22 }
176     if ((rs = mysql_store_result(db)) == NULL)
177     {
178     log_error("Get user_list data failed\n");
179 sysadm 1.44 ret = -1;
180     goto cleanup;
181 sysadm 1.22 }
182     if ((row = mysql_fetch_row(rs)))
183     {
184 sysadm 1.52 if (atoi(row[0]) >= BBS_allowed_login_failures_within_interval)
185 sysadm 1.22 {
186 sysadm 1.52 prints("\033[1;31m来源存在多次失败登陆尝试,请稍后再试,或使用Web方式访问\033[m\r\n");
187 sysadm 1.44 ret = 1;
188     goto cleanup;
189 sysadm 1.22 }
190     }
191     mysql_free_result(rs);
192 sysadm 1.44 rs = NULL;
193 sysadm 1.22
194 sysadm 1.52 // Failed login attempts against the current username since last successful login
195 sysadm 1.22 snprintf(sql, sizeof(sql),
196     "SELECT COUNT(*) AS err_count FROM user_err_login_log "
197 sysadm 1.52 "LEFT JOIN user_list ON user_err_login_log.username = user_list.username "
198     "LEFT JOIN user_pubinfo ON user_list.UID = user_pubinfo.UID "
199     "WHERE user_err_login_log.username = '%s' "
200     "AND (user_err_login_log.login_dt >= user_pubinfo.last_login_dt "
201     "OR user_pubinfo.last_login_dt IS NULL)",
202 sysadm 1.22 username);
203     if (mysql_query(db, sql) != 0)
204     {
205 sysadm 1.33 log_error("Query user_list error: %s\n", mysql_error(db));
206 sysadm 1.44 ret = -1;
207     goto cleanup;
208 sysadm 1.22 }
209     if ((rs = mysql_store_result(db)) == NULL)
210     {
211     log_error("Get user_list data failed\n");
212 sysadm 1.44 ret = -1;
213     goto cleanup;
214 sysadm 1.22 }
215     if ((row = mysql_fetch_row(rs)))
216     {
217 sysadm 1.53 if (atoi(row[0]) >= BBS_allowed_login_failures_per_account)
218 sysadm 1.22 {
219 sysadm 1.52 prints("\033[1;31m账户存在多次失败登陆尝试,请使用Web方式登录解锁\033[m\r\n");
220 sysadm 1.44 ret = 1;
221     goto cleanup;
222 sysadm 1.22 }
223     }
224     mysql_free_result(rs);
225 sysadm 1.44 rs = NULL;
226 sysadm 1.22
227 sysadm 1.18 snprintf(sql, sizeof(sql),
228 sysadm 1.22 "SELECT UID, username, p_login FROM user_list "
229     "WHERE username = '%s' AND password = SHA2('%s', 256) AND enable",
230     username, password);
231 sysadm 1.11 if (mysql_query(db, sql) != 0)
232     {
233 sysadm 1.33 log_error("Query user_list error: %s\n", mysql_error(db));
234 sysadm 1.44 ret = -1;
235     goto cleanup;
236 sysadm 1.11 }
237     if ((rs = mysql_store_result(db)) == NULL)
238 sysadm 1.2 {
239 sysadm 1.11 log_error("Get user_list data failed\n");
240 sysadm 1.44 ret = -1;
241     goto cleanup;
242 sysadm 1.11 }
243 sysadm 1.15 if ((row = mysql_fetch_row(rs)))
244 sysadm 1.11 {
245 sysadm 1.40 BBS_uid = atoi(row[0]);
246 sysadm 1.17 strncpy(BBS_username, row[1], sizeof(BBS_username) - 1);
247     BBS_username[sizeof(BBS_username) - 1] = '\0';
248 sysadm 1.13 int p_login = atoi(row[2]);
249    
250     mysql_free_result(rs);
251 sysadm 1.44 rs = NULL;
252 sysadm 1.13
253     // Add user login log
254 sysadm 1.18 snprintf(sql, sizeof(sql),
255 sysadm 1.22 "INSERT INTO user_login_log(UID, login_dt, login_ip) "
256 sysadm 1.40 "VALUES(%d, NOW(), '%s')",
257 sysadm 1.22 BBS_uid, hostaddr_client);
258 sysadm 1.13 if (mysql_query(db, sql) != 0)
259     {
260 sysadm 1.33 log_error("Insert into user_login_log error: %s\n", mysql_error(db));
261 sysadm 1.44 ret = -1;
262     goto cleanup;
263 sysadm 1.13 }
264    
265     // Commit transaction
266     if (mysql_query(db, "COMMIT") != 0)
267     {
268 sysadm 1.33 log_error("Commit transaction error: %s\n", mysql_error(db));
269 sysadm 1.44 ret = -1;
270     goto cleanup;
271 sysadm 1.13 }
272    
273     if (p_login == 0)
274 sysadm 1.11 {
275 sysadm 1.49 prints("\033[1;31m您目前无权登陆...\033[m\r\n");
276 sysadm 1.44 ret = 1;
277     goto cleanup;
278 sysadm 1.11 }
279     }
280     else
281     {
282     mysql_free_result(rs);
283 sysadm 1.44 rs = NULL;
284 sysadm 1.2
285 sysadm 1.18 snprintf(sql, sizeof(sql),
286 sysadm 1.22 "INSERT INTO user_err_login_log(username, password, login_dt, login_ip) "
287     "VALUES('%s', '%s', NOW(), '%s')",
288     username, password, hostaddr_client);
289 sysadm 1.11 if (mysql_query(db, sql) != 0)
290     {
291 sysadm 1.33 log_error("Insert into user_err_login_log error: %s\n", mysql_error(db));
292 sysadm 1.44 ret = -1;
293     goto cleanup;
294 sysadm 1.11 }
295    
296 sysadm 1.13 // Commit transaction
297     if (mysql_query(db, "COMMIT") != 0)
298     {
299 sysadm 1.33 log_error("Commit transaction error: %s\n", mysql_error(db));
300 sysadm 1.44 ret = -1;
301     goto cleanup;
302 sysadm 1.13 }
303    
304 sysadm 1.49 prints("\033[1;31m错误的用户名或密码...\033[m\r\n");
305 sysadm 1.44 ret = 1;
306     goto cleanup;
307 sysadm 1.11 }
308 sysadm 1.13
309     // Set AUTOCOMMIT = 1
310     if (mysql_query(db, "SET autocommit=1") != 0)
311     {
312 sysadm 1.33 log_error("SET autocommit=1 error: %s\n", mysql_error(db));
313 sysadm 1.44 ret = -1;
314     goto cleanup;
315 sysadm 1.13 }
316 sysadm 1.2
317 sysadm 1.11 ret = load_user_info(db, BBS_uid);
318    
319     switch (ret)
320 sysadm 1.2 {
321 sysadm 1.11 case 0: // Login successfully
322     break;
323     case -1: // Load data error
324 sysadm 1.49 prints("\033[1;31m读取用户数据错误...\033[m\r\n");
325 sysadm 1.44 ret = -1;
326     goto cleanup;
327 sysadm 1.11 case -2: // Unused
328 sysadm 1.49 prints("\033[1;31m请通过Web登录更新用户许可协议...\033[m\r\n");
329 sysadm 1.44 ret = 1;
330     goto cleanup;
331 sysadm 1.11 case -3: // Dead
332 sysadm 1.49 prints("\033[1;31m很遗憾,您已经永远离开了我们的世界!\033[m\r\n");
333 sysadm 1.44 ret = 1;
334     goto cleanup;
335 sysadm 1.11 default:
336 sysadm 1.44 ret = -2;
337     goto cleanup;
338 sysadm 1.2 }
339    
340 sysadm 1.18 snprintf(sql, sizeof(sql),
341 sysadm 1.22 "UPDATE user_pubinfo SET visit_count = visit_count + 1, "
342 sysadm 1.40 "last_login_dt = NOW() WHERE UID = %d",
343 sysadm 1.22 BBS_uid);
344 sysadm 1.13 if (mysql_query(db, sql) != 0)
345     {
346 sysadm 1.33 log_error("Update user_pubinfo error: %s\n", mysql_error(db));
347 sysadm 1.44 ret = -1;
348     goto cleanup;
349 sysadm 1.13 }
350    
351 sysadm 1.15 if (user_online_add(db) != 0)
352     {
353 sysadm 1.44 ret = -1;
354     goto cleanup;
355 sysadm 1.15 }
356    
357 sysadm 1.45 BBS_last_access_tm = BBS_login_tm = time(NULL);
358 sysadm 1.13
359 sysadm 1.34 // Set user tz to process env
360     if (BBS_user_tz[0] != '\0')
361     {
362     user_tz_env[0] = ':';
363     strncpy(user_tz_env + 1, BBS_user_tz, sizeof(user_tz_env) - 2);
364     user_tz_env[sizeof(user_tz_env) - 1] = '\0';
365    
366     if (setenv("TZ", user_tz_env, 1) == -1)
367     {
368     log_error("setenv(TZ = %s) error %d\n", user_tz_env, errno);
369     return -3;
370     }
371    
372     tzset();
373     }
374    
375 sysadm 1.44 cleanup:
376     mysql_free_result(rs);
377 sysadm 1.41 mysql_close(db);
378    
379 sysadm 1.44 return ret;
380 sysadm 1.1 }
381 sysadm 1.2
382 sysadm 1.40 int load_user_info(MYSQL *db, int BBS_uid)
383 sysadm 1.3 {
384 sysadm 1.44 MYSQL_RES *rs = NULL;
385 sysadm 1.11 MYSQL_ROW row;
386 sysadm 1.15 char sql[SQL_BUFFER_LEN];
387 sysadm 1.11 int life;
388     time_t last_login_dt;
389 sysadm 1.44 int ret = 0;
390 sysadm 1.11
391 sysadm 1.18 snprintf(sql, sizeof(sql),
392 sysadm 1.43 "SELECT life, UNIX_TIMESTAMP(last_login_dt), user_timezone, exp, nickname "
393 sysadm 1.40 "FROM user_pubinfo WHERE UID = %d",
394 sysadm 1.22 BBS_uid);
395 sysadm 1.11 if (mysql_query(db, sql) != 0)
396     {
397 sysadm 1.33 log_error("Query user_pubinfo error: %s\n", mysql_error(db));
398 sysadm 1.44 ret = -1;
399     goto cleanup;
400 sysadm 1.11 }
401     if ((rs = mysql_store_result(db)) == NULL)
402     {
403     log_error("Get user_pubinfo data failed\n");
404 sysadm 1.44 ret = -1;
405     goto cleanup;
406 sysadm 1.11 }
407 sysadm 1.15 if ((row = mysql_fetch_row(rs)))
408 sysadm 1.11 {
409     life = atoi(row[0]);
410     last_login_dt = (time_t)atol(row[1]);
411 sysadm 1.34
412     strncpy(BBS_user_tz, row[2], sizeof(BBS_user_tz) - 1);
413     BBS_user_tz[sizeof(BBS_user_tz) - 1] = '\0';
414 sysadm 1.43
415     BBS_user_exp = atoi(row[3]);
416    
417     strncpy(BBS_nickname, row[4], sizeof(BBS_nickname));
418     BBS_nickname[sizeof(BBS_nickname) - 1] = '\0';
419 sysadm 1.11 }
420     else
421     {
422 sysadm 1.44 ret = -1; // Data not found
423     goto cleanup;
424 sysadm 1.11 }
425     mysql_free_result(rs);
426 sysadm 1.44 rs = NULL;
427 sysadm 1.3
428 sysadm 1.13 if (life != 333 && life != 365 && life != 666 && life != 999 && // Not immortal
429 sysadm 1.45 time(NULL) - last_login_dt > 60 * 60 * 24 * life)
430 sysadm 1.11 {
431 sysadm 1.44 ret = -3; // Dead
432     goto cleanup;
433 sysadm 1.11 }
434 sysadm 1.5
435 sysadm 1.15 if (load_priv(db, &BBS_priv, BBS_uid) != 0)
436     {
437 sysadm 1.44 ret = -1;
438     goto cleanup;
439 sysadm 1.15 }
440 sysadm 1.11
441 sysadm 1.44 cleanup:
442     mysql_free_result(rs);
443    
444     return ret;
445 sysadm 1.2 }
446 sysadm 1.5
447 sysadm 1.41 int load_guest_info(void)
448 sysadm 1.5 {
449 sysadm 1.44 MYSQL *db = NULL;
450     int ret = 0;
451 sysadm 1.41
452     db = db_open();
453     if (db == NULL)
454     {
455 sysadm 1.44 ret = -1;
456     goto cleanup;
457 sysadm 1.41 }
458    
459 sysadm 1.17 strncpy(BBS_username, "guest", sizeof(BBS_username) - 1);
460     BBS_username[sizeof(BBS_username) - 1] = '\0';
461 sysadm 1.5
462 sysadm 1.43 BBS_user_exp = 0;
463    
464     strncpy(BBS_nickname, "Guest", sizeof(BBS_nickname));
465     BBS_nickname[sizeof(BBS_nickname) - 1] = '\0';
466    
467 sysadm 1.15 if (load_priv(db, &BBS_priv, 0) != 0)
468     {
469 sysadm 1.44 ret = -1;
470     goto cleanup;
471 sysadm 1.15 }
472 sysadm 1.6
473 sysadm 1.15 if (user_online_add(db) != 0)
474     {
475 sysadm 1.44 ret = -1;
476     goto cleanup;
477 sysadm 1.15 }
478 sysadm 1.5
479 sysadm 1.45 BBS_last_access_tm = BBS_login_tm = time(NULL);
480 sysadm 1.5
481 sysadm 1.44 cleanup:
482 sysadm 1.41 mysql_close(db);
483 sysadm 1.44
484     return ret;
485 sysadm 1.5 }
486 sysadm 1.15
487     int user_online_add(MYSQL *db)
488     {
489     char sql[SQL_BUFFER_LEN];
490    
491 sysadm 1.60 snprintf(sql, sizeof(sql),
492     "INSERT INTO visit_log(dt, IP) VALUES(NOW(), '%s')",
493     hostaddr_client);
494     if (mysql_query(db, sql) != 0)
495     {
496     log_error("Add visit log error: %s\n", mysql_error(db));
497     return -1;
498     }
499    
500 sysadm 1.15 if (user_online_del(db) != 0)
501     {
502 sysadm 1.60 return -2;
503 sysadm 1.15 }
504    
505 sysadm 1.18 snprintf(sql, sizeof(sql),
506 sysadm 1.61 "INSERT INTO user_online(SID, UID, ip, current_action, login_tm, last_tm) "
507     "VALUES('Telnet_Process_%d', %d, '%s', 'LOGIN', NOW(), NOW())",
508 sysadm 1.22 getpid(), BBS_priv.uid, hostaddr_client);
509 sysadm 1.15 if (mysql_query(db, sql) != 0)
510     {
511 sysadm 1.33 log_error("Add user_online error: %s\n", mysql_error(db));
512 sysadm 1.60 return -3;
513 sysadm 1.15 }
514    
515     return 0;
516     }
517    
518     int user_online_del(MYSQL *db)
519     {
520     char sql[SQL_BUFFER_LEN];
521    
522 sysadm 1.57 snprintf(sql, sizeof(sql),
523     "DELETE FROM user_online WHERE SID = 'Telnet_Process_%d'",
524     getpid());
525     if (mysql_query(db, sql) != 0)
526     {
527     log_error("Delete user_online error: %s\n", mysql_error(db));
528     return -1;
529     }
530    
531     return 0;
532     }
533    
534     int user_online_exp(MYSQL *db)
535     {
536     char sql[SQL_BUFFER_LEN];
537    
538 sysadm 1.56 // +1 exp for every 5 minutes online since last logout
539     // but at most 24 hours worth of exp can be gained in Telnet session
540     snprintf(sql, sizeof(sql),
541 sysadm 1.60 "UPDATE user_pubinfo SET exp = exp + FLOOR(LEAST(TIMESTAMPDIFF("
542     "SECOND, GREATEST(last_login_dt, IF(last_logout_dt IS NULL, last_login_dt, last_logout_dt)), NOW()"
543     ") / 60 / 5, 12 * 24)), last_logout_dt = NOW() "
544     "WHERE UID = %d",
545     BBS_priv.uid);
546 sysadm 1.56 if (mysql_query(db, sql) != 0)
547     {
548     log_error("Update user_pubinfo error: %s\n", mysql_error(db));
549     return -1;
550     }
551 sysadm 1.15
552     return 0;
553     }
554 sysadm 1.47
555     int user_online_update(const char *action)
556     {
557     MYSQL *db = NULL;
558     char sql[SQL_BUFFER_LEN];
559    
560 sysadm 1.55 if ((action == NULL || strcmp(BBS_current_action, action) == 0) &&
561 sysadm 1.54 time(NULL) - BBS_current_action_tm < BBS_current_action_refresh_interval) // No change
562 sysadm 1.47 {
563     return 0;
564     }
565    
566 sysadm 1.55 if (action != NULL)
567     {
568     strncpy(BBS_current_action, action, sizeof(BBS_current_action) - 1);
569     BBS_current_action[sizeof(BBS_current_action) - 1] = '\0';
570     }
571    
572 sysadm 1.54 BBS_current_action_tm = time(NULL);
573 sysadm 1.47
574     db = db_open();
575     if (db == NULL)
576     {
577     log_error("db_open() error: %s\n", mysql_error(db));
578     return -1;
579     }
580    
581     snprintf(sql, sizeof(sql),
582     "UPDATE user_online SET current_action = '%s', last_tm=NOW() "
583     "WHERE SID = 'Telnet_Process_%d'",
584     BBS_current_action, getpid());
585     if (mysql_query(db, sql) != 0)
586     {
587     log_error("Update user_online error: %s\n", mysql_error(db));
588     return -2;
589     }
590    
591     mysql_close(db);
592    
593     return 1;
594     }

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