1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
/*
* $Id: config.c 8246 2010-01-17 23:12:55Z ajc $
*
* Read and write the citadel.config file
*
* Copyright (c) 1987-2009 by the citadel.org team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdep.h"
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "config.h"
#include "ctdl_module.h"
struct config config;
/*
* get_config() is called during the initialization of any program which
* directly accesses Citadel data files. It verifies the system's integrity
* and reads citadel.config into memory.
*/
void get_config(void) {
FILE *cfp;
struct stat st;
int rv;
if (chdir(ctdl_bbsbase_dir) != 0) {
fprintf(stderr,
"This program could not be started.\n"
"Unable to change directory to %s\n"
"Error: %s\n",
ctdl_bbsbase_dir,
strerror(errno));
exit(CTDLEXIT_HOME);
}
cfp = fopen(file_citadel_config, "rb");
if (cfp == NULL) {
fprintf(stderr, "This program could not be started.\n"
"Unable to open %s\n"
"Error: %s\n",
file_citadel_config,
strerror(errno));
exit(CTDLEXIT_CONFIG);
}
memset(&config, 0, sizeof(struct config));
rv = fread((char *) &config, sizeof(struct config), 1, cfp);
if (rv != 1)
{
fprintf(stderr,
"Warning: The config file %s has unexpected size. \n",
file_citadel_config);
}
if (fstat(fileno(cfp), &st)) {
perror(file_citadel_config);
exit(CTDLEXIT_CONFIG);
}
#ifndef __CYGWIN__
if (st.st_uid != CTDLUID) {
fprintf(stderr, "%s must be owned by uid="F_UID_T" but "F_UID_T" owns it!\n",
file_citadel_config, CTDLUID, st.st_uid);
exit(CTDLEXIT_CONFIG);
}
int desired_mode = (S_IFREG | S_IRUSR | S_IWUSR) ;
if (st.st_mode != desired_mode) {
fprintf(stderr, "%s must be set to permissions mode %03o but they are %03o\n",
file_citadel_config, (desired_mode & 0xFFF), (st.st_mode & 0xFFF));
exit(CTDLEXIT_CONFIG);
}
#endif
fclose(cfp);
/* Ensure that we are linked to the correct version of libcitadel */
if (libcitadel_version_number() < LIBCITADEL_VERSION_NUMBER) {
fprintf(stderr, " You are running libcitadel version %d.%02d\n",
(libcitadel_version_number() / 100), (libcitadel_version_number() % 100));
fprintf(stderr, "citserver was compiled against version %d.%02d\n",
(LIBCITADEL_VERSION_NUMBER / 100), (LIBCITADEL_VERSION_NUMBER % 100));
exit(CTDLEXIT_LIBCITADEL);
}
/* Only allow LDAP auth mode if we actually have LDAP support */
#ifndef HAVE_LDAP
if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
fprintf(stderr, "Your system is configured for LDAP authentication,\n"
"but you are running a server built without OpenLDAP support.\n");
exit(CTDL_EXIT_UNSUP_AUTH);
}
#endif
/* Check to see whether 'setup' must first be run to update data file formats */
if (config.c_setup_level < REV_MIN) {
fprintf(stderr, "Your data files are out of date. Run setup to update them.\n");
fprintf(stderr, " This program requires level %d.%02d\n",
(REV_LEVEL / 100), (REV_LEVEL % 100));
fprintf(stderr, " Data files are currently at %d.%02d\n",
(config.c_setup_level / 100),
(config.c_setup_level % 100));
exit(CTDLEXIT_OOD);
}
/* Default maximum message length is 10 megabytes. This is site
* configurable. Also check to make sure the limit has not been
* set below 8192 bytes.
*/
if (config.c_maxmsglen <= 0)
config.c_maxmsglen = 10485760;
if (config.c_maxmsglen < 8192)
config.c_maxmsglen = 8192;
/* Default lower and upper limits on number of worker threads */
if (config.c_min_workers < 3) /* no less than 3 */
config.c_min_workers = 5;
if (config.c_max_workers == 0) /* default maximum */
config.c_max_workers = 256;
if (config.c_max_workers < config.c_min_workers) /* max >= min */
config.c_max_workers = config.c_min_workers;
/* Networking more than once every five minutes just isn't sane */
if (config.c_net_freq == 0L)
config.c_net_freq = 3600L; /* once per hour default */
if (config.c_net_freq < 300L)
config.c_net_freq = 300L;
/* Same goes for POP3 */
if (config.c_pop3_fetch == 0L)
config.c_pop3_fetch = 3600L; /* once per hour default */
if (config.c_pop3_fetch < 300L)
config.c_pop3_fetch = 300L;
if (config.c_pop3_fastest == 0L)
config.c_pop3_fastest = 3600L; /* once per hour default */
if (config.c_pop3_fastest < 300L)
config.c_pop3_fastest = 300L;
/* "create new user" only works with native authentication mode */
if (config.c_auth_mode != AUTHMODE_NATIVE) {
config.c_disable_newu = 1;
}
}
/*
* Occasionally, we will need to write the config file, because some operations
* change site-wide parameters.
*/
void put_config(void)
{
FILE *cfp;
int rv;
if ((cfp = fopen(file_citadel_config, "rb+")) == NULL)
perror(file_citadel_config);
else {
rv = fwrite((char *) &config, sizeof(struct config), 1, cfp);
fclose(cfp);
}
}
|