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

Annotation of /lbbs/src/init.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.36 - (hide annotations)
Fri Dec 19 06:16:27 2025 UTC (2 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.35: +7 -7 lines
Content type: text/x-csrc
Append \n to the end of logging message by log_...()
Remove ending \n from each logging message

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

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