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

Diff of /lbbs/src/init.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.14 by sysadm, Fri May 2 03:32:19 2025 UTC Revision 1.30 by sysadm, Fri Oct 10 01:55:06 2025 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2                                                    init.c  -  description                                                    init.c  -  description
3                                                           -------------------                                                           -------------------
4          begin                : Mon Oct 18 2004          Copyright            : (C) 2004-2025 by Leaflet
5          copyright            : (C) 2004 by Leaflet          Email                : leaflet@leafok.com
         email                : leaflet@leafok.com  
6   ***************************************************************************/   ***************************************************************************/
7    
8  /***************************************************************************  /***************************************************************************
9   *                                                                         *   *                                                                         *
10   *   This program is free software; you can redistribute it and/or modify  *   *   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  *   *   it under the terms of the GNU General Public License as published by  *
12   *   the Free Software Foundation; either version 2 of the License, or     *   *   the Free Software Foundation; either version 3 of the License, or     *
13   *   (at your option) any later version.                                   *   *   (at your option) any later version.                                   *
14   *                                                                         *   *                                                                         *
15   ***************************************************************************/   ***************************************************************************/
16    
 #include "init.h"  
 #include "database.h"  
17  #include "bbs.h"  #include "bbs.h"
18  #include "common.h"  #include "common.h"
19  #include "log.h"  #include "database.h"
20    #include "init.h"
21  #include "io.h"  #include "io.h"
22  #include <string.h>  #include "log.h"
 #include <stdlib.h>  
23  #include <signal.h>  #include <signal.h>
24    #include <stdlib.h>
25    #include <string.h>
26    #include <unistd.h>
27  #include <sys/param.h>  #include <sys/param.h>
 #include <sys/types.h>  
28  #include <sys/stat.h>  #include <sys/stat.h>
29  #include <unistd.h>  #include <sys/types.h>
30    
31    #define CONF_DELIM_WITH_SPACE " \t\r\n"
32    
33  void init_daemon(void)  int init_daemon(void)
34  {  {
35          int pid;          int pid;
         int i;  
36    
37          if (pid = fork())          pid = fork();
38                  exit(0);  
39          else if (pid < 0)          if (pid > 0) // Parent process
40                  exit(1);          {
41                    _exit(0);
42            }
43            else if (pid < 0) // error
44            {
45                    _exit(pid);
46            }
47    
48            // Child process
49          setsid();          setsid();
50    
51          if (pid = fork())          pid = fork();
52                  exit(0);  
53          else if (pid < 0)          if (pid > 0) // Parent process
54                  exit(1);          {
55                    _exit(0);
56            }
57            else if (pid < 0) // error
58            {
59                    _exit(pid);
60            }
61    
62          umask(0);          // Child process
63            umask(022);
64    
65          return;          return 0;
66  }  }
67    
68  int load_conf(const char *conf_file)  int load_conf(const char *conf_file)
69  {  {
70          char temp[256];          char buffer[LINE_BUFFER_LEN];
71            char *saveptr = NULL;
72          // Load configuration          char *p, *q, *r;
73          char c_name[256];          char *y, *m, *d;
74            int v;
75          FILE *fin;          FILE *fin;
76    
77            // Load configuration
78          if ((fin = fopen(conf_file, "r")) == NULL)          if ((fin = fopen(conf_file, "r")) == NULL)
79          {          {
80                  log_error("Open %s failed", conf_file);                  log_error("Open %s failed", conf_file);
81                  return -1;                  return -1;
82          }          }
83    
84          while (fscanf(fin, "%s", c_name) != EOF)          while (fgets(buffer, sizeof(buffer), fin) != NULL)
85          {          {
86                  if (c_name[0] == '#')                  p = strtok_r(buffer, CONF_DELIM_WITH_SPACE, &saveptr);
87                    if (p == NULL) // Blank line
88                  {                  {
                         fgets(temp, 256, fin);  
89                          continue;                          continue;
90                  }                  }
91                  fscanf(fin, "%*c");  
92                  if (strcmp(c_name, "bbs_id") == 0)                  if (*p == '#' || *p == '\r' || *p == '\n') // Comment or blank line
93                  {                  {
94                          fscanf(fin, "%s", BBS_id);                          continue;
95                  }                  }
96                  if (strcmp(c_name, "bbs_name") == 0)  
97                    q = strtok_r(NULL, CONF_DELIM_WITH_SPACE, &saveptr);
98                    if (q == NULL) // Empty value
99                  {                  {
100                          fscanf(fin, "%s", BBS_name);                          log_error("Skip empty value of config item: %s\n", p);
101                            continue;
102                  }                  }
103                  if (strcmp(c_name, "bbs_server") == 0)  
104                    // Check syntax
105                    r = strtok_r(NULL, CONF_DELIM_WITH_SPACE, &saveptr);
106                    if (r != NULL && r[0] != '#')
107                    {
108                            log_error("Skip config line with extra value %s = %s %s\n", p, q, r);
109                            continue;
110                    }
111    
112                    if (strcasecmp(p, "bbs_id") == 0)
113                  {                  {
114                          fscanf(fin, "%s", BBS_server);                          strncpy(BBS_id, q, sizeof(BBS_id) - 1);
115                            BBS_id[sizeof(BBS_id) - 1] = '\0';
116                  }                  }
117                  if (strcmp(c_name, "bbs_address") == 0)                  else if (strcasecmp(p, "bbs_name") == 0)
118                  {                  {
119                          fscanf(fin, "%s", BBS_address);                          strncpy(BBS_name, q, sizeof(BBS_name) - 1);
120                            BBS_name[sizeof(BBS_name) - 1] = '\0';
121                  }                  }
122                  if (strcmp(c_name, "bbs_port") == 0)                  else if (strcasecmp(p, "bbs_server") == 0)
123                  {                  {
124                          fscanf(fin, "%ud", &BBS_port);                          strncpy(BBS_server, q, sizeof(BBS_server) - 1);
125                            BBS_server[sizeof(BBS_server) - 1] = '\0';
126                  }                  }
127                  if (strcmp(c_name, "bbs_max_client") == 0)                  else if (strcasecmp(p, "bbs_address") == 0)
128                  {                  {
129                          fscanf(fin, "%d", &BBS_max_client);                          strncpy(BBS_address, q, sizeof(BBS_address) - 1);
130                            BBS_address[sizeof(BBS_address) - 1] = '\0';
131                    }
132                    else if (strcasecmp(p, "bbs_port") == 0)
133                    {
134                            BBS_port[0] = (in_port_t)atoi(q);
135                    }
136                    else if (strcasecmp(p, "bbs_ssh_port") == 0)
137                    {
138                            BBS_port[1] = (in_port_t)atoi(q);
139                    }
140                    else if (strcasecmp(p, "bbs_max_client") == 0)
141                    {
142                            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                    }
149                    else if (strcasecmp(p, "bbs_max_client_per_ip") == 0)
150                    {
151                            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                            {
154                                    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                            }
157                    }
158                    else if (strcasecmp(p, "bbs_max_user") == 0)
159                    {
160                            BBS_max_user = atoi(q);
161                            if (BBS_max_user <= 0 || BBS_max_user > BBS_MAX_USER_LIMIT)
162                            {
163                                    log_error("Ignore config bbs_max_client with incorrect value %d\n", BBS_max_user);
164                                    BBS_max_user = BBS_MAX_USER_LIMIT;
165                            }
166                    }
167                    else if (strcasecmp(p, "bbs_start_dt") == 0)
168                    {
169                            y = strtok_r(q, "-", &saveptr);
170                            m = strtok_r(NULL, "-", &saveptr);
171                            d = strtok_r(NULL, "-", &saveptr);
172    
173                            if (y == NULL || m == NULL || d == NULL)
174                            {
175                                    log_error("Ignore config bbs_start_dt with incorrect value\n");
176                                    continue;
177                            }
178                            snprintf(BBS_start_dt, sizeof(BBS_start_dt), "%4så¹´%2s月%2sæ—¥", y, m, d);
179                  }                  }
180                  if (strcmp(c_name, "bbs_max_user") == 0)                  else if (strcasecmp(p, "bbs_sys_id") == 0)
181                  {                  {
182                          fscanf(fin, "%d", &BBS_max_user);                          v = atoi(q);
183                            if (v <= 0 || v > BBS_MAX_USER_LIMIT)
184                            {
185                                    log_error("Ignore config bbs_sys_id with incorrect value %d\n", v);
186                                    continue;
187                            }
188                            BBS_sys_id = v;
189                  }                  }
190                  if (strcmp(c_name, "bbs_start_dt") == 0)                  else if (strcasecmp(p, "db_host") == 0)
191                  {                  {
192                          int y = 0, m = 0, d = 0;                          strncpy(DB_host, q, sizeof(DB_host) - 1);
193                          fscanf(fin, "%d-%d-%d", &y, &m, &d);                          DB_host[sizeof(DB_host) - 1] = '\0';
                         sprintf(BBS_start_dt, "%4dÄê%2dÔÂ%2dÈÕ", y, m, d);  
194                  }                  }
195                  if (strcmp(c_name, "db_host") == 0)                  else if (strcasecmp(p, "db_username") == 0)
196                  {                  {
197                          fscanf(fin, "%s", DB_host);                          strncpy(DB_username, q, sizeof(DB_username) - 1);
198                            DB_username[sizeof(DB_username) - 1] = '\0';
199                  }                  }
200                  if (strcmp(c_name, "db_username") == 0)                  else if (strcasecmp(p, "db_password") == 0)
201                  {                  {
202                          fscanf(fin, "%s", DB_username);                          strncpy(DB_password, q, sizeof(DB_password) - 1);
203                            DB_password[sizeof(DB_password) - 1] = '\0';
204                  }                  }
205                  if (strcmp(c_name, "db_password") == 0)                  else if (strcasecmp(p, "db_database") == 0)
206                  {                  {
207                          fscanf(fin, "%s", DB_password);                          strncpy(DB_database, q, sizeof(DB_database) - 1);
208                            DB_database[sizeof(DB_database) - 1] = '\0';
209                  }                  }
210                  if (strcmp(c_name, "db_database") == 0)                  else if (strcasecmp(p, "db_timezone") == 0)
211                  {                  {
212                          fscanf(fin, "%s", DB_database);                          strncpy(DB_timezone, q, sizeof(DB_timezone) - 1);
213                            DB_timezone[sizeof(DB_timezone) - 1] = '\0';
214                  }                  }
215                  if (strcmp(c_name, "db_timezone") == 0)                  else
216                  {                  {
217                          fscanf(fin, "%s", DB_timezone);                          log_error("Unknown config %s = %s\n", p, q);
218                  }                  }
219          }          }
220    


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

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