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

Annotation of /lbbs/src/init.c

Parent Directory Parent Directory | Revision Log Revision Log


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

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.11 init.c - description
3     -------------------
4 sysadm 1.18 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.18 * 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.4 #include "bbs.h"
18 sysadm 1.1 #include "common.h"
19 sysadm 1.28 #include "database.h"
20     #include "init.h"
21     #include "io.h"
22 sysadm 1.13 #include "log.h"
23 sysadm 1.28 #include <signal.h>
24     #include <stdlib.h>
25 sysadm 1.13 #include <string.h>
26 sysadm 1.25 #include <unistd.h>
27 sysadm 1.6 #include <sys/param.h>
28 sysadm 1.28 #include <sys/stat.h>
29 sysadm 1.6 #include <sys/types.h>
30 sysadm 1.1
31 sysadm 1.22 #define CONF_DELIM_WITH_SPACE " \t\r\n"
32    
33 sysadm 1.19 int init_daemon(void)
34 sysadm 1.1 {
35 sysadm 1.11 int pid;
36 sysadm 1.1
37 sysadm 1.15 pid = fork();
38    
39 sysadm 1.20 if (pid > 0) // Parent process
40 sysadm 1.15 {
41 sysadm 1.20 _exit(0);
42     }
43     else if (pid < 0) // error
44     {
45     _exit(pid);
46 sysadm 1.15 }
47 sysadm 1.1
48 sysadm 1.15 // Child process
49 sysadm 1.11 setsid();
50 sysadm 1.1
51 sysadm 1.15 pid = fork();
52    
53 sysadm 1.20 if (pid > 0) // Parent process
54     {
55     _exit(0);
56     }
57     else if (pid < 0) // error
58 sysadm 1.15 {
59 sysadm 1.20 _exit(pid);
60 sysadm 1.15 }
61 sysadm 1.1
62 sysadm 1.15 // Child process
63     umask(022);
64 sysadm 1.1
65 sysadm 1.19 return 0;
66 sysadm 1.1 }
67 sysadm 1.4
68 sysadm 1.11 int load_conf(const char *conf_file)
69 sysadm 1.4 {
70 sysadm 1.22 char buffer[LINE_BUFFER_LEN];
71     char *saveptr = NULL;
72     char *p, *q, *r;
73     char *y, *m, *d;
74     FILE *fin;
75 sysadm 1.4
76 sysadm 1.11 // Load configuration
77     if ((fin = fopen(conf_file, "r")) == NULL)
78     {
79     log_error("Open %s failed", conf_file);
80     return -1;
81     }
82    
83 sysadm 1.22 while (fgets(buffer, sizeof(buffer), fin) != NULL)
84 sysadm 1.11 {
85 sysadm 1.22 p = strtok_r(buffer, CONF_DELIM_WITH_SPACE, &saveptr);
86     if (p == NULL) // Blank line
87     {
88     continue;
89     }
90    
91     if (*p == '#' || *p == '\r' || *p == '\n') // Comment or blank line
92     {
93     continue;
94     }
95    
96     q = strtok_r(NULL, CONF_DELIM_WITH_SPACE, &saveptr);
97     if (q == NULL) // Empty value
98     {
99     log_error("Skip empty value of config item: %s\n", p);
100     continue;
101     }
102    
103     // Check syntax
104     r = strtok_r(NULL, CONF_DELIM_WITH_SPACE, &saveptr);
105     if (r != NULL && r[0] != '#')
106 sysadm 1.11 {
107 sysadm 1.22 log_error("Skip config line with extra value %s = %s %s\n", p, q, r);
108 sysadm 1.11 continue;
109     }
110 sysadm 1.22
111     if (strcasecmp(p, "bbs_id") == 0)
112     {
113     strncpy(BBS_id, q, sizeof(BBS_id) - 1);
114     BBS_id[sizeof(BBS_id) - 1] = '\0';
115     }
116     else if (strcasecmp(p, "bbs_name") == 0)
117     {
118     strncpy(BBS_name, q, sizeof(BBS_name) - 1);
119     BBS_name[sizeof(BBS_name) - 1] = '\0';
120     }
121     else if (strcasecmp(p, "bbs_server") == 0)
122 sysadm 1.11 {
123 sysadm 1.22 strncpy(BBS_server, q, sizeof(BBS_server) - 1);
124     BBS_server[sizeof(BBS_server) - 1] = '\0';
125 sysadm 1.11 }
126 sysadm 1.22 else if (strcasecmp(p, "bbs_address") == 0)
127 sysadm 1.11 {
128 sysadm 1.22 strncpy(BBS_address, q, sizeof(BBS_address) - 1);
129     BBS_address[sizeof(BBS_address) - 1] = '\0';
130 sysadm 1.11 }
131 sysadm 1.22 else if (strcasecmp(p, "bbs_port") == 0)
132 sysadm 1.11 {
133 sysadm 1.24 BBS_port[0] = (in_port_t)atoi(q);
134 sysadm 1.11 }
135 sysadm 1.24 else if (strcasecmp(p, "bbs_ssh_port") == 0)
136 sysadm 1.11 {
137 sysadm 1.24 BBS_port[1] = (in_port_t)atoi(q);
138 sysadm 1.11 }
139 sysadm 1.22 else if (strcasecmp(p, "bbs_max_client") == 0)
140 sysadm 1.11 {
141 sysadm 1.22 BBS_max_client = atoi(q);
142     if (BBS_max_client <= 0 || BBS_max_client > MAX_CLIENT_LIMIT)
143     {
144     log_error("Ignore config bbs_max_client with incorrect value %d\n", BBS_max_client);
145     BBS_max_client = MAX_CLIENT_LIMIT;
146     }
147 sysadm 1.11 }
148 sysadm 1.22 else if (strcasecmp(p, "bbs_max_client_per_ip") == 0)
149 sysadm 1.11 {
150 sysadm 1.22 BBS_max_client_per_ip = atoi(q);
151     if (BBS_max_client_per_ip <= 0 || BBS_max_client_per_ip > MAX_CLIENT_PER_IP_LIMIT)
152 sysadm 1.21 {
153 sysadm 1.22 log_error("Ignore config bbs_max_client with incorrect value %d\n", BBS_max_client_per_ip);
154     BBS_max_client_per_ip = MAX_CLIENT_PER_IP_LIMIT;
155 sysadm 1.21 }
156     }
157 sysadm 1.22 else if (strcasecmp(p, "bbs_max_user") == 0)
158 sysadm 1.21 {
159 sysadm 1.22 BBS_max_user = atoi(q);
160     if (BBS_max_user <= 0 || BBS_max_user > BBS_MAX_USER_LIMIT)
161     {
162     log_error("Ignore config bbs_max_client with incorrect value %d\n", BBS_max_user);
163     BBS_max_user = BBS_MAX_USER_LIMIT;
164     }
165 sysadm 1.11 }
166 sysadm 1.22 else if (strcasecmp(p, "bbs_start_dt") == 0)
167 sysadm 1.11 {
168 sysadm 1.22 y = strtok_r(q, "-", &saveptr);
169     m = strtok_r(NULL, "-", &saveptr);
170     d = strtok_r(NULL, "-", &saveptr);
171    
172     if (y == NULL || m == NULL || d == NULL)
173     {
174     log_error("Ignore config bbs_start_dt with incorrect value\n");
175     continue;
176     }
177 sysadm 1.29 snprintf(BBS_start_dt, sizeof(BBS_start_dt), "%4s年%2s月%2s日", y, m, d);
178 sysadm 1.11 }
179 sysadm 1.22 else if (strcasecmp(p, "db_host") == 0)
180 sysadm 1.11 {
181 sysadm 1.22 strncpy(DB_host, q, sizeof(DB_host) - 1);
182     DB_host[sizeof(DB_host) - 1] = '\0';
183 sysadm 1.11 }
184 sysadm 1.22 else if (strcasecmp(p, "db_username") == 0)
185 sysadm 1.11 {
186 sysadm 1.22 strncpy(DB_username, q, sizeof(DB_username) - 1);
187     DB_username[sizeof(DB_username) - 1] = '\0';
188 sysadm 1.11 }
189 sysadm 1.22 else if (strcasecmp(p, "db_password") == 0)
190 sysadm 1.11 {
191 sysadm 1.22 strncpy(DB_password, q, sizeof(DB_password) - 1);
192     DB_password[sizeof(DB_password) - 1] = '\0';
193 sysadm 1.11 }
194 sysadm 1.22 else if (strcasecmp(p, "db_database") == 0)
195 sysadm 1.11 {
196 sysadm 1.22 strncpy(DB_database, q, sizeof(DB_database) - 1);
197     DB_database[sizeof(DB_database) - 1] = '\0';
198 sysadm 1.11 }
199 sysadm 1.22 else if (strcasecmp(p, "db_timezone") == 0)
200 sysadm 1.11 {
201 sysadm 1.22 strncpy(DB_timezone, q, sizeof(DB_timezone) - 1);
202     DB_timezone[sizeof(DB_timezone) - 1] = '\0';
203 sysadm 1.11 }
204 sysadm 1.22 else
205 sysadm 1.12 {
206 sysadm 1.22 log_error("Unknown config %s = %s\n", p, q);
207 sysadm 1.12 }
208 sysadm 1.5 }
209 sysadm 1.4
210 sysadm 1.11 fclose(fin);
211 sysadm 1.9
212 sysadm 1.11 return 0;
213 sysadm 1.4 }

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