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

Annotation of /lbbs/src/init.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.31 - (hide annotations)
Tue Oct 21 06:24:51 2025 UTC (4 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.30: +1 -10 lines
Content type: text/x-csrc
Add user_list with data loader

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 sysadm 1.30 int v;
75 sysadm 1.22 FILE *fin;
76 sysadm 1.4
77 sysadm 1.11 // Load configuration
78     if ((fin = fopen(conf_file, "r")) == NULL)
79     {
80     log_error("Open %s failed", conf_file);
81     return -1;
82     }
83    
84 sysadm 1.22 while (fgets(buffer, sizeof(buffer), fin) != NULL)
85 sysadm 1.11 {
86 sysadm 1.22 p = strtok_r(buffer, CONF_DELIM_WITH_SPACE, &saveptr);
87     if (p == NULL) // Blank line
88     {
89     continue;
90     }
91    
92     if (*p == '#' || *p == '\r' || *p == '\n') // Comment or blank line
93     {
94     continue;
95     }
96    
97     q = strtok_r(NULL, CONF_DELIM_WITH_SPACE, &saveptr);
98     if (q == NULL) // Empty value
99     {
100     log_error("Skip empty value of config item: %s\n", p);
101     continue;
102     }
103    
104     // Check syntax
105     r = strtok_r(NULL, CONF_DELIM_WITH_SPACE, &saveptr);
106     if (r != NULL && r[0] != '#')
107 sysadm 1.11 {
108 sysadm 1.22 log_error("Skip config line with extra value %s = %s %s\n", p, q, r);
109 sysadm 1.11 continue;
110     }
111 sysadm 1.22
112     if (strcasecmp(p, "bbs_id") == 0)
113     {
114     strncpy(BBS_id, q, sizeof(BBS_id) - 1);
115     BBS_id[sizeof(BBS_id) - 1] = '\0';
116     }
117     else if (strcasecmp(p, "bbs_name") == 0)
118     {
119     strncpy(BBS_name, q, sizeof(BBS_name) - 1);
120     BBS_name[sizeof(BBS_name) - 1] = '\0';
121     }
122     else if (strcasecmp(p, "bbs_server") == 0)
123 sysadm 1.11 {
124 sysadm 1.22 strncpy(BBS_server, q, sizeof(BBS_server) - 1);
125     BBS_server[sizeof(BBS_server) - 1] = '\0';
126 sysadm 1.11 }
127 sysadm 1.22 else if (strcasecmp(p, "bbs_address") == 0)
128 sysadm 1.11 {
129 sysadm 1.22 strncpy(BBS_address, q, sizeof(BBS_address) - 1);
130     BBS_address[sizeof(BBS_address) - 1] = '\0';
131 sysadm 1.11 }
132 sysadm 1.22 else if (strcasecmp(p, "bbs_port") == 0)
133 sysadm 1.11 {
134 sysadm 1.24 BBS_port[0] = (in_port_t)atoi(q);
135 sysadm 1.11 }
136 sysadm 1.24 else if (strcasecmp(p, "bbs_ssh_port") == 0)
137 sysadm 1.11 {
138 sysadm 1.24 BBS_port[1] = (in_port_t)atoi(q);
139 sysadm 1.11 }
140 sysadm 1.22 else if (strcasecmp(p, "bbs_max_client") == 0)
141 sysadm 1.11 {
142 sysadm 1.22 BBS_max_client = atoi(q);
143     if (BBS_max_client <= 0 || BBS_max_client > MAX_CLIENT_LIMIT)
144     {
145     log_error("Ignore config bbs_max_client with incorrect value %d\n", BBS_max_client);
146     BBS_max_client = MAX_CLIENT_LIMIT;
147     }
148 sysadm 1.11 }
149 sysadm 1.22 else if (strcasecmp(p, "bbs_max_client_per_ip") == 0)
150 sysadm 1.11 {
151 sysadm 1.22 BBS_max_client_per_ip = atoi(q);
152     if (BBS_max_client_per_ip <= 0 || BBS_max_client_per_ip > MAX_CLIENT_PER_IP_LIMIT)
153 sysadm 1.21 {
154 sysadm 1.22 log_error("Ignore config bbs_max_client with incorrect value %d\n", BBS_max_client_per_ip);
155     BBS_max_client_per_ip = MAX_CLIENT_PER_IP_LIMIT;
156 sysadm 1.21 }
157     }
158 sysadm 1.22 else if (strcasecmp(p, "bbs_start_dt") == 0)
159 sysadm 1.11 {
160 sysadm 1.22 y = strtok_r(q, "-", &saveptr);
161     m = strtok_r(NULL, "-", &saveptr);
162     d = strtok_r(NULL, "-", &saveptr);
163    
164     if (y == NULL || m == NULL || d == NULL)
165     {
166     log_error("Ignore config bbs_start_dt with incorrect value\n");
167     continue;
168     }
169 sysadm 1.29 snprintf(BBS_start_dt, sizeof(BBS_start_dt), "%4s年%2s月%2s日", y, m, d);
170 sysadm 1.11 }
171 sysadm 1.30 else if (strcasecmp(p, "bbs_sys_id") == 0)
172     {
173     v = atoi(q);
174 sysadm 1.31 if (v <= 0)
175 sysadm 1.30 {
176     log_error("Ignore config bbs_sys_id with incorrect value %d\n", v);
177     continue;
178     }
179     BBS_sys_id = v;
180     }
181 sysadm 1.22 else if (strcasecmp(p, "db_host") == 0)
182 sysadm 1.11 {
183 sysadm 1.22 strncpy(DB_host, q, sizeof(DB_host) - 1);
184     DB_host[sizeof(DB_host) - 1] = '\0';
185 sysadm 1.11 }
186 sysadm 1.22 else if (strcasecmp(p, "db_username") == 0)
187 sysadm 1.11 {
188 sysadm 1.22 strncpy(DB_username, q, sizeof(DB_username) - 1);
189     DB_username[sizeof(DB_username) - 1] = '\0';
190 sysadm 1.11 }
191 sysadm 1.22 else if (strcasecmp(p, "db_password") == 0)
192 sysadm 1.11 {
193 sysadm 1.22 strncpy(DB_password, q, sizeof(DB_password) - 1);
194     DB_password[sizeof(DB_password) - 1] = '\0';
195 sysadm 1.11 }
196 sysadm 1.22 else if (strcasecmp(p, "db_database") == 0)
197 sysadm 1.11 {
198 sysadm 1.22 strncpy(DB_database, q, sizeof(DB_database) - 1);
199     DB_database[sizeof(DB_database) - 1] = '\0';
200 sysadm 1.11 }
201 sysadm 1.22 else if (strcasecmp(p, "db_timezone") == 0)
202 sysadm 1.11 {
203 sysadm 1.22 strncpy(DB_timezone, q, sizeof(DB_timezone) - 1);
204     DB_timezone[sizeof(DB_timezone) - 1] = '\0';
205 sysadm 1.11 }
206 sysadm 1.22 else
207 sysadm 1.12 {
208 sysadm 1.22 log_error("Unknown config %s = %s\n", p, q);
209 sysadm 1.12 }
210 sysadm 1.5 }
211 sysadm 1.4
212 sysadm 1.11 fclose(fin);
213 sysadm 1.9
214 sysadm 1.11 return 0;
215 sysadm 1.4 }

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