/*
* Main source module for the Citadel server
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2014 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
syslog(LOG_DEBUG, "master_startup() started\n");
time(&server_startup_time);
+ get_config();
+ validate_config();
syslog(LOG_INFO, "Checking directory access");
- if ((pw = getpwuid(ctdluid)) == NULL) {
+ if ((pw = getpwuid(CTDLUID)) == NULL) {
gid = getgid();
} else {
gid = pw->pw_gid;
}
syslog(LOG_INFO, "Opening databases");
open_databases();
-
- /* Load site-specific configuration */
- syslog(LOG_INFO, "Loading citadel.config");
- initialize_config_system();
- validate_config();
-
- syslog(LOG_INFO, "Acquiring control record");
- get_control();
-
- /* Check floor reference counts */
check_ref_counts();
syslog(LOG_INFO, "Creating base rooms (if necessary)\n");
- CtdlCreateRoom(CtdlGetConfigStr("c_baseroom"), 0, "", 0, 1, 0, VIEW_BBS);
- CtdlCreateRoom(AIDEROOM, 3, "", 0, 1, 0, VIEW_BBS);
- CtdlCreateRoom(SYSCONFIGROOM, 3, "", 0, 1, 0, VIEW_BBS);
- CtdlCreateRoom(CtdlGetConfigStr("c_twitroom"), 0, "", 0, 1, 0, VIEW_BBS);
+ CtdlCreateRoom(config.c_baseroom, 0, "", 0, 1, 0, VIEW_BBS);
+ CtdlCreateRoom(AIDEROOM, 3, "", 0, 1, 0, VIEW_BBS);
+ CtdlCreateRoom(SYSCONFIGROOM, 3, "", 0, 1, 0, VIEW_BBS);
+ CtdlCreateRoom(config.c_twitroom, 0, "", 0, 1, 0, VIEW_BBS);
/* The "Local System Configuration" room doesn't need to be visible */
if (CtdlGetRoomLock(&qrbuf, SYSCONFIGROOM) == 0) {
srand(seed);
srandom(seed);
+ put_config();
+
syslog(LOG_DEBUG, "master_startup() finished\n");
}
/* Do system-dependent stuff */
sysdep_master_cleanup();
-
- /* Close the configuration system */
- shutdown_config_system();
/* Close databases */
syslog(LOG_INFO, "Closing databases\n");
safestrncpy(public_clientspos, LOCALHOSTSTR, sizeof public_clients);
public_clientspos += sizeof(LOCALHOSTSTR) - 1;
- if (hostname_to_dotted_quad(addrbuf, CtdlGetConfigStr("c_fqdn")) == 0) {
+ if (hostname_to_dotted_quad(addrbuf, config.c_fqdn) == 0) {
*(public_clientspos++) = '|';
paddr = &addrbuf[0];
while (!IsEmptyStr (paddr) &&
if (CC->nologin==1) {
cprintf("%d %s: Too many users are already online (maximum is %d)\n",
ERROR + MAX_SESSIONS_EXCEEDED,
- CtdlGetConfigStr("c_nodename"), CtdlGetConfigInt("c_maxsessions")
+ config.c_nodename, config.c_maxsessions
);
CC->kill_me = KILLME_MAX_SESSIONS_EXCEEDED;
}
else {
- cprintf("%d %s Citadel server ready.\n", CIT_OK, CtdlGetConfigStr("c_nodename"));
+ cprintf("%d %s Citadel server ready.\n", CIT_OK, config.c_nodename);
CC->can_receive_im = 1;
}
}
void citproto_begin_admin_session() {
CC->internal_pgm = 1;
- cprintf("%d %s Citadel server ADMIN CONNECTION ready.\n", CIT_OK, CtdlGetConfigStr("c_nodename"));
+ cprintf("%d %s Citadel server ADMIN CONNECTION ready.\n", CIT_OK, config.c_nodename);
}
/*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
*
- * 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.
+ * 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.
*/
#include "serv_extensions.h"
/*
* Read and write the citadel.config file
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2014 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
#include "config.h"
#include "ctdl_module.h"
-long config_msgnum = 0;
-HashList *ctdlconfig = NULL; // new configuration
-
-
-void config_warn_if_port_unset(char *key, int default_port) \
-{
- int p = CtdlGetConfigInt(key);
- if ((p < -1) || (p == 0) || (p > UINT16_MAX))
- {
- syslog(LOG_EMERG,
- "configuration setting %s is not -1 (disabled) or a valid TCP-Port - check your config! Default setting is: %d",
- key, default_port
- );
- }
-}
-
-
-void config_warn_if_empty(char *key)
-{
- if (IsEmptyStr(CtdlGetConfigStr(key)))
- {
- syslog(LOG_EMERG, "configuration setting %s is empty, but must not - check your config!", key);
- }
-}
+struct config config;
+struct configlen configlen;
+#define STR_NOT_EMPTY(CFG_FIELDNAME) if (IsEmptyStr(config.CFG_FIELDNAME)) \
+ syslog(LOG_EMERG, "configuration setting "#CFG_FIELDNAME" is empty, but must not - check your config!");
+#define TEST_PORT(CFG_PORT, DEFAULTPORT) \
+ if ((config.CFG_PORT < -1) || \
+ (config.CFG_PORT == 0) || \
+ (config.CFG_PORT > UINT16_MAX)) \
+ syslog(LOG_EMERG, "configuration setting "#CFG_PORT" is not -1 (disabled) or a valid TCP-Port - check your config! Default setting is: "#DEFAULTPORT);
+
void validate_config(void) {
-
- /*
- * these shouldn't be empty
- */
- config_warn_if_empty("c_fqdn");
- config_warn_if_empty("c_baseroom");
- config_warn_if_empty("c_aideroom");
- config_warn_if_empty("c_twitroom");
- config_warn_if_empty("c_nodename");
- config_warn_if_empty("c_default_cal_zone");
-
- /*
- * Sanity check for port bindings
- */
- config_warn_if_port_unset("c_smtp_port", 25);
- config_warn_if_port_unset("c_pop3_port", 110);
- config_warn_if_port_unset("c_imap_port", 143);
- config_warn_if_port_unset("c_msa_port", 587);
- config_warn_if_port_unset("c_port_number", 504);
- config_warn_if_port_unset("c_smtps_port", 465);
- config_warn_if_port_unset("c_pop3s_port", 995);
- config_warn_if_port_unset("c_imaps_port", 993);
- config_warn_if_port_unset("c_pftcpdict_port", -1);
- config_warn_if_port_unset("c_managesieve_port", 2020);
- config_warn_if_port_unset("c_xmpp_c2s_port", 5222);
- config_warn_if_port_unset("c_xmpp_s2s_port", 5269);
- config_warn_if_port_unset("c_nntp_port", 119);
- config_warn_if_port_unset("c_nntps_port", 563);
-
- if (getpwuid(ctdluid) == NULL) {
- syslog(LOG_EMERG, "The UID (%d) citadel is configured to use is not defined in your system (/etc/passwd?)!", ctdluid);
- }
+/* these shouldn't be empty: */
+ STR_NOT_EMPTY(c_fqdn);
+
+ STR_NOT_EMPTY(c_baseroom);
+ STR_NOT_EMPTY(c_aideroom);
+ STR_NOT_EMPTY(c_twitroom);
+ STR_NOT_EMPTY(c_nodename);
+ STR_NOT_EMPTY(c_default_cal_zone);
+
+/* we bind a lot of ports: */
+ TEST_PORT(c_smtp_port, 25);
+ TEST_PORT(c_pop3_port, 110);
+ TEST_PORT(c_imap_port, 143);
+ TEST_PORT(c_msa_port, 587);
+ TEST_PORT(c_port_number, 504);
+ TEST_PORT(c_smtps_port, 465);
+ TEST_PORT(c_pop3s_port, 995);
+ TEST_PORT(c_imaps_port, 993);
+ TEST_PORT(c_pftcpdict_port, -1);
+ TEST_PORT(c_managesieve_port, 2020);
+ TEST_PORT(c_xmpp_c2s_port, 5222);
+ TEST_PORT(c_xmpp_s2s_port, 5269);
+ TEST_PORT(c_nntp_port, 119);
+ TEST_PORT(c_nntps_port, 563);
+
+ if (config.c_ctdluid == 0)
+ syslog(LOG_EMERG, "citadel should not be configured to run as root! Check the value of c_ctdluid");
+ else if (getpwuid(CTDLUID) == NULL)
+ syslog(LOG_EMERG, "The UID (%d) citadel is configured to use is not defined in your system (/etc/passwd?)! Check the value of c_ctdluid", CTDLUID);
}
*/
void brand_new_installation_set_defaults(void) {
+ struct passwd *pw;
struct utsname my_utsname;
struct hostent *he;
- char detected_hostname[256];
/* Determine our host name, in case we need to use it as a default */
uname(&my_utsname);
-
+ memset(&configlen, 0, sizeof(struct configlen));
/* set some sample/default values in place of blanks... */
- extract_token(detected_hostname, my_utsname.nodename, 0, '.', sizeof detected_hostname);
- CtdlSetConfigStr("c_nodename", detected_hostname);
+ configlen.c_nodename = extract_token(config.c_nodename, my_utsname.nodename, 0, '.', sizeof config.c_nodename);
+ if (IsEmptyStr(config.c_fqdn) ) {
+ if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
+ configlen.c_fqdn = safestrncpy(config.c_fqdn, he->h_name, sizeof config.c_fqdn);
+ }
+ else {
+ configlen.c_fqdn = safestrncpy(config.c_fqdn, my_utsname.nodename, sizeof config.c_fqdn);
+ }
+ }
- if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
- CtdlSetConfigStr("c_fqdn", he->h_name);
+ configlen.c_humannode = safestrncpy(config.c_humannode, "Citadel Server", sizeof config.c_humannode);
+ configlen.c_phonenum = safestrncpy(config.c_phonenum, "US 800 555 1212", sizeof config.c_phonenum);
+ config.c_initax = 4;
+ configlen.c_moreprompt = safestrncpy(config.c_moreprompt, "<more>", sizeof config.c_moreprompt);
+ configlen.c_twitroom = safestrncpy(config.c_twitroom, "Trashcan", sizeof config.c_twitroom);
+ configlen.c_baseroom = safestrncpy(config.c_baseroom, BASEROOM, sizeof config.c_baseroom);
+ configlen.c_aideroom = safestrncpy(config.c_aideroom, "Aide", sizeof config.c_aideroom);
+ config.c_port_number = 504;
+ config.c_sleeping = 900;
+
+ if (config.c_ctdluid == 0) {
+ pw = getpwnam("citadel");
+ if (pw != NULL) {
+ config.c_ctdluid = pw->pw_uid;
+ }
}
- else {
- CtdlSetConfigStr("c_fqdn", my_utsname.nodename);
+ if (config.c_ctdluid == 0) {
+ pw = getpwnam("bbs");
+ if (pw != NULL) {
+ config.c_ctdluid = pw->pw_uid;
+ }
}
-
- CtdlSetConfigStr("c_humannode", "Citadel Server");
- CtdlSetConfigInt("c_initax", 4);
- CtdlSetConfigStr("c_moreprompt", "<more>");
- CtdlSetConfigStr("c_twitroom", "Trashcan");
- CtdlSetConfigStr("c_baseroom", BASEROOM);
- CtdlSetConfigStr("c_aideroom", "Aide");
- CtdlSetConfigInt("c_sleeping", 900);
-
- if (CtdlGetConfigInt("c_createax") == 0) {
- CtdlSetConfigInt("c_createax", 3);
+ if (config.c_ctdluid == 0) {
+ pw = getpwnam("guest");
+ if (pw != NULL) {
+ config.c_ctdluid = pw->pw_uid;
+ }
+ }
+ if (config.c_createax == 0) {
+ config.c_createax = 3;
}
/*
* Default port numbers for various services
*/
- CtdlSetConfigInt("c_port_number", 504);
- CtdlSetConfigInt("c_smtp_port", 25);
- CtdlSetConfigInt("c_pop3_port", 110);
- CtdlSetConfigInt("c_imap_port", 143);
- CtdlSetConfigInt("c_msa_port", 587);
- CtdlSetConfigInt("c_smtps_port", 465);
- CtdlSetConfigInt("c_pop3s_port", 995);
- CtdlSetConfigInt("c_imaps_port", 993);
- CtdlSetConfigInt("c_pftcpdict_port", -1);
- CtdlSetConfigInt("c_managesieve_port", 2020);
- CtdlSetConfigInt("c_xmpp_c2s_port", 5222);
- CtdlSetConfigInt("c_xmpp_s2s_port", 5269);
- CtdlSetConfigInt("c_nntp_port", 119);
- CtdlSetConfigInt("c_nntps_port", 563);
-
- /*
- * Prevent the "new installation, set defaults" behavior from occurring again
- */
- CtdlSetConfigLong("c_config_created_or_migrated", (long)time(NULL));
+ config.c_smtp_port = 25;
+ config.c_pop3_port = 110;
+ config.c_imap_port = 143;
+ config.c_msa_port = 587;
+ config.c_smtps_port = 465;
+ config.c_pop3s_port = 995;
+ config.c_imaps_port = 993;
+ config.c_pftcpdict_port = -1 ;
+ config.c_managesieve_port = 2020;
+ config.c_xmpp_c2s_port = 5222;
+ config.c_xmpp_s2s_port = 5269;
+ config.c_nntp_port = 119;
+ config.c_nntps_port = 563;
}
-
-
-/*
- * Migrate a supplied legacy configuration to the new in-db format.
- * No individual site should ever have to do this more than once.
- */
-void migrate_legacy_config(struct legacy_config *lconfig)
+void setcfglen(void)
{
- CtdlSetConfigStr( "c_nodename" , lconfig->c_nodename );
- CtdlSetConfigStr( "c_fqdn" , lconfig->c_fqdn );
- CtdlSetConfigStr( "c_humannode" , lconfig->c_humannode );
- CtdlSetConfigInt( "c_creataide" , lconfig->c_creataide );
- CtdlSetConfigInt( "c_sleeping" , lconfig->c_sleeping );
- CtdlSetConfigInt( "c_initax" , lconfig->c_initax );
- CtdlSetConfigInt( "c_regiscall" , lconfig->c_regiscall );
- CtdlSetConfigInt( "c_twitdetect" , lconfig->c_twitdetect );
- CtdlSetConfigStr( "c_twitroom" , lconfig->c_twitroom );
- CtdlSetConfigStr( "c_moreprompt" , lconfig->c_moreprompt );
- CtdlSetConfigInt( "c_restrict" , lconfig->c_restrict );
- CtdlSetConfigStr( "c_site_location" , lconfig->c_site_location );
- CtdlSetConfigStr( "c_sysadm" , lconfig->c_sysadm );
- CtdlSetConfigInt( "c_maxsessions" , lconfig->c_maxsessions );
- CtdlSetConfigStr( "c_ip_addr" , lconfig->c_ip_addr );
- CtdlSetConfigInt( "c_port_number" , lconfig->c_port_number );
- CtdlSetConfigInt( "c_ep_mode" , lconfig->c_ep.expire_mode );
- CtdlSetConfigInt( "c_ep_value" , lconfig->c_ep.expire_value );
- CtdlSetConfigInt( "c_userpurge" , lconfig->c_userpurge );
- CtdlSetConfigInt( "c_roompurge" , lconfig->c_roompurge );
- CtdlSetConfigStr( "c_logpages" , lconfig->c_logpages );
- CtdlSetConfigInt( "c_createax" , lconfig->c_createax );
- CtdlSetConfigLong( "c_maxmsglen" , lconfig->c_maxmsglen );
- CtdlSetConfigInt( "c_min_workers" , lconfig->c_min_workers );
- CtdlSetConfigInt( "c_max_workers" , lconfig->c_max_workers );
- CtdlSetConfigInt( "c_pop3_port" , lconfig->c_pop3_port );
- CtdlSetConfigInt( "c_smtp_port" , lconfig->c_smtp_port );
- CtdlSetConfigInt( "c_rfc822_strict_from" , lconfig->c_rfc822_strict_from );
- CtdlSetConfigInt( "c_aide_zap" , lconfig->c_aide_zap );
- CtdlSetConfigInt( "c_imap_port" , lconfig->c_imap_port );
- CtdlSetConfigLong( "c_net_freq" , lconfig->c_net_freq );
- CtdlSetConfigInt( "c_disable_newu" , lconfig->c_disable_newu );
- CtdlSetConfigInt( "c_enable_fulltext" , lconfig->c_enable_fulltext );
- CtdlSetConfigStr( "c_baseroom" , lconfig->c_baseroom );
- CtdlSetConfigStr( "c_aideroom" , lconfig->c_aideroom );
- CtdlSetConfigInt( "c_purge_hour" , lconfig->c_purge_hour );
- CtdlSetConfigInt( "c_mbxep_mode" , lconfig->c_mbxep.expire_mode );
- CtdlSetConfigInt( "c_mbxep_value" , lconfig->c_mbxep.expire_value );
- CtdlSetConfigStr( "c_ldap_host" , lconfig->c_ldap_host );
- CtdlSetConfigInt( "c_ldap_port" , lconfig->c_ldap_port );
- CtdlSetConfigStr( "c_ldap_base_dn" , lconfig->c_ldap_base_dn );
- CtdlSetConfigStr( "c_ldap_bind_dn" , lconfig->c_ldap_bind_dn );
- CtdlSetConfigStr( "c_ldap_bind_pw" , lconfig->c_ldap_bind_pw );
- CtdlSetConfigInt( "c_msa_port" , lconfig->c_msa_port );
- CtdlSetConfigInt( "c_imaps_port" , lconfig->c_imaps_port );
- CtdlSetConfigInt( "c_pop3s_port" , lconfig->c_pop3s_port );
- CtdlSetConfigInt( "c_smtps_port" , lconfig->c_smtps_port );
- CtdlSetConfigInt( "c_auto_cull" , lconfig->c_auto_cull );
- CtdlSetConfigInt( "c_allow_spoofing" , lconfig->c_allow_spoofing );
- CtdlSetConfigInt( "c_journal_email" , lconfig->c_journal_email );
- CtdlSetConfigInt( "c_journal_pubmsgs" , lconfig->c_journal_pubmsgs );
- CtdlSetConfigStr( "c_journal_dest" , lconfig->c_journal_dest );
- CtdlSetConfigStr( "c_default_cal_zone" , lconfig->c_default_cal_zone );
- CtdlSetConfigInt( "c_pftcpdict_port" , lconfig->c_pftcpdict_port );
- CtdlSetConfigInt( "c_managesieve_port" , lconfig->c_managesieve_port );
- CtdlSetConfigInt( "c_auth_mode" , lconfig->c_auth_mode );
- CtdlSetConfigStr( "c_funambol_host" , lconfig->c_funambol_host );
- CtdlSetConfigInt( "c_funambol_port" , lconfig->c_funambol_port );
- CtdlSetConfigStr( "c_funambol_source" , lconfig->c_funambol_source );
- CtdlSetConfigStr( "c_funambol_auth" , lconfig->c_funambol_auth );
- CtdlSetConfigInt( "c_rbl_at_greeting" , lconfig->c_rbl_at_greeting );
- CtdlSetConfigStr( "c_master_user" , lconfig->c_master_user );
- CtdlSetConfigStr( "c_master_pass" , lconfig->c_master_pass );
- CtdlSetConfigStr( "c_pager_program" , lconfig->c_pager_program );
- CtdlSetConfigInt( "c_imap_keep_from" , lconfig->c_imap_keep_from );
- CtdlSetConfigInt( "c_xmpp_c2s_port" , lconfig->c_xmpp_c2s_port );
- CtdlSetConfigInt( "c_xmpp_s2s_port" , lconfig->c_xmpp_s2s_port );
- CtdlSetConfigLong( "c_pop3_fetch" , lconfig->c_pop3_fetch );
- CtdlSetConfigLong( "c_pop3_fastest" , lconfig->c_pop3_fastest );
- CtdlSetConfigInt( "c_spam_flag_only" , lconfig->c_spam_flag_only );
- CtdlSetConfigInt( "c_guest_logins" , lconfig->c_guest_logins );
- CtdlSetConfigInt( "c_nntp_port" , lconfig->c_nntp_port );
- CtdlSetConfigInt( "c_nntps_port" , lconfig->c_nntps_port );
+ configlen.c_nodename = strlen(config.c_nodename);
+ configlen.c_fqdn = strlen(config.c_fqdn);
+ configlen.c_humannode = strlen(config.c_humannode);
+ configlen.c_phonenum = strlen(config.c_phonenum);
+ configlen.c_twitroom = strlen(config.c_twitroom);
+ configlen.c_moreprompt = strlen(config.c_moreprompt);
+ configlen.c_site_location = strlen(config.c_site_location);
+ configlen.c_sysadm = strlen(config.c_sysadm);
+ configlen.c_niu_2 = strlen(config.c_niu_2);
+ configlen.c_ip_addr = strlen(config.c_ip_addr);
+ configlen.c_logpages = strlen(config.c_logpages);
+ configlen.c_baseroom = strlen(config.c_baseroom);
+ configlen.c_aideroom = strlen(config.c_aideroom);
+ configlen.c_ldap_host = strlen(config.c_ldap_host);
+ configlen.c_ldap_base_dn = strlen(config.c_ldap_base_dn);
+ configlen.c_ldap_bind_dn = strlen(config.c_ldap_bind_dn);
+ configlen.c_ldap_bind_pw = strlen(config.c_ldap_bind_pw);
+ configlen.c_journal_dest = strlen(config.c_journal_dest);
+ configlen.c_default_cal_zone = strlen(config.c_default_cal_zone);
+ configlen.c_funambol_host = strlen(config.c_funambol_host);
+ configlen.c_funambol_source = strlen(config.c_funambol_source);
+ configlen.c_funambol_auth = strlen(config.c_funambol_auth);
+ configlen.c_master_user = strlen(config.c_master_user);
+ configlen.c_master_pass = strlen(config.c_master_pass);
+ configlen.c_pager_program = strlen(config.c_pager_program);
}
-
-
/*
- * Called during the initialization of Citadel server.
+ * get_config() is called during the initialization of Citadel server.
* It verifies the system's integrity and reads citadel.config into memory.
*/
-void initialize_config_system(void) {
+void get_config(void) {
FILE *cfp;
int rv;
- struct legacy_config lconfig; // legacy configuration
- ctdlconfig = NewHash(1, NULL); // set up the real config system
-
- /* 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);
- }
if (chdir(ctdl_bbsbase_dir) != 0) {
fprintf(stderr,
exit(CTDLEXIT_HOME);
}
- memset(&lconfig, 0, sizeof(struct legacy_config));
+ memset(&config, 0, sizeof(struct config));
cfp = fopen(file_citadel_config, "rb");
if (cfp != NULL) {
- if (CtdlGetConfigLong("c_config_created_or_migrated") <= 0) {
- fprintf(stderr, "Citadel Server found BOTH legacy and new configurations present.\n");
- fprintf(stderr, "Exiting to prevent data corruption.\n");
- exit(CTDLEXIT_CONFIG);
- }
- rv = fread((char *) &lconfig, sizeof(struct legacy_config), 1, cfp);
+ rv = fread((char *) &config, sizeof(struct config), 1, cfp);
if (rv != 1)
{
fprintf(stderr,
- "Warning: Found a legacy config file %s has unexpected size. \n",
+ "Warning: The config file %s has unexpected size. \n",
file_citadel_config
);
}
-
- migrate_legacy_config(&lconfig);
-
fclose(cfp);
- if (unlink(file_citadel_config) != 0) {
- fprintf(stderr, "Unable to remove legacy config file %s after migrating it.\n", file_citadel_config);
- fprintf(stderr, "Exiting to prevent data corruption.\n");
- exit(CTDLEXIT_CONFIG);
- }
-
- /*
- * Prevent migration/initialization from happening again.
- */
- CtdlSetConfigLong("c_config_created_or_migrated", (long)time(NULL));
-
+ setcfglen();
}
-
- /* New installation? Set up configuration */
- if (CtdlGetConfigLong("c_config_created_or_migrated") <= 0) {
+ else {
brand_new_installation_set_defaults();
}
+ /* 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 ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
+ 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);
* configurable. Also check to make sure the limit has not been
* set below 8192 bytes.
*/
- if (CtdlGetConfigLong("c_maxmsglen") <= 0) CtdlSetConfigLong("c_maxmsglen", 10485760);
- if (CtdlGetConfigLong("c_maxmsglen") < 8192) CtdlSetConfigLong("c_maxmsglen", 8192);
+ 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 (CtdlGetConfigInt("c_min_workers") < 5) CtdlSetConfigInt("c_min_workers", 5); // min
- if (CtdlGetConfigInt("c_max_workers") == 0) CtdlSetConfigInt("c_max_workers", 256); // default max
- if (CtdlGetConfigInt("c_max_workers") < CtdlGetConfigInt("c_min_workers")) {
- CtdlSetConfigInt("c_max_workers", CtdlGetConfigInt("c_min_workers")); // max >= min
- }
+ /* 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 (CtdlGetConfigLong("c_net_freq") == 0) CtdlSetConfigLong("c_net_freq", 3600); // once per hour default
- if (CtdlGetConfigLong("c_net_freq") < 300) CtdlSetConfigLong("c_net_freq", 300); // minimum 5 minutes
+ 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 (CtdlGetConfigLong("c_pop3_fetch") == 0) CtdlSetConfigLong("c_pop3_fetch", 3600); // once per hour default
- if (CtdlGetConfigLong("c_pop3_fetch") < 300) CtdlSetConfigLong("c_pop3_fetch", 300); // 5 minutes min
- if (CtdlGetConfigLong("c_pop3_fastest") == 0) CtdlSetConfigLong("c_pop3_fastest", 3600); // once per hour default
- if (CtdlGetConfigLong("c_pop3_fastest") < 300) CtdlSetConfigLong("c_pop3_fastest", 300); // 5 minutes min
+ 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 (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_NATIVE) {
- CtdlSetConfigInt("c_disable_newu", 1);
+ if (config.c_auth_mode != AUTHMODE_NATIVE) {
+ config.c_disable_newu = 1;
}
}
-
-
-/*
- * Called when Citadel server is shutting down.
- * Clears out the config hash table.
- */
-void shutdown_config_system(void)
-{
- DeleteHash(&ctdlconfig);
-}
-
-
-
-/*
- * Set a system config value. Simple key/value here.
- */
-void CtdlSetConfigStr(char *key, char *value)
-{
- int key_len = strlen(key);
- int value_len = strlen(value);
-
- /* FIXME we are noisy logging for now */
- syslog(LOG_DEBUG, "\033[31mSET CONFIG: '%s' = '%s'\033[0m", key, value);
-
- /* Save it in memory */
- Put(ctdlconfig, key, key_len, strdup(value), NULL);
-
- /* Also write it to the config database */
-
- int dbv_size = key_len + value_len + 2;
- char *dbv = malloc(dbv_size);
- strcpy(dbv, key);
- strcpy(&dbv[key_len + 1], value);
- cdb_store(CDB_CONFIG, key, key_len, dbv, dbv_size);
- free(dbv);
-}
-
-
-/*
- * Set a numeric system config value (long integer)
- */
-void CtdlSetConfigLong(char *key, long value)
-{
- char longstr[256];
- sprintf(longstr, "%ld", value);
- CtdlSetConfigStr(key, longstr);
-}
-
-
-/*
- * Set a numeric system config value (integer)
- */
-void CtdlSetConfigInt(char *key, int value)
-{
- char intstr[256];
- sprintf(intstr, "%d", value);
- CtdlSetConfigStr(key, intstr);
-}
-
+long config_msgnum = 0;
/*
- * Fetch a system config value. Caller does *not* own the returned value and may not alter it.
+ * Occasionally, we will need to write the config file, because some operations
+ * change site-wide parameters.
*/
-char *CtdlGetConfigStr(char *key)
+void put_config(void)
{
- char *value = NULL;
- struct cdbdata *cdb;
- int key_len = strlen(key);
-
- if (IsEmptyStr(key)) return(NULL);
-
- /* Temporary hack to make sure we didn't mess up any porting - FIXME remove this after testing thoroughly */
- if (!strncmp(key, "config", 6)) {
- syslog(LOG_EMERG, "You requested a key starting with 'config' which probably means a porting error: %s", key);
- abort();
- }
-
- /* First look in memory */
- if (GetHash(ctdlconfig, key, key_len, (void *)&value))
- {
- syslog(LOG_DEBUG, "\033[32mGET CONFIG: '%s' = '%s'\033[0m", key, value);
- return value;
- }
-
- /* Then look in the database. */
-
- cdb = cdb_fetch(CDB_CONFIG, key, key_len);
+ FILE *cfp;
+ int blocks_written = 0;
- if (cdb == NULL) { /* nope, not there either. */
- syslog(LOG_DEBUG, "\033[32mGET CONFIG: '%s' = NULL\033[0m", key);
- return(NULL);
+ cfp = fopen(file_citadel_config, "w");
+ if (cfp != NULL) {
+ blocks_written = fwrite((char *) &config, sizeof(struct config), 1, cfp);
+ if (blocks_written == 1) {
+ chown(file_citadel_config, CTDLUID, (-1));
+ chmod(file_citadel_config, 0600);
+ fclose(cfp);
+ return;
+ }
+ fclose(cfp);
}
-
- /* Got it. Save it in memory for the next fetch. */
- value = strdup(cdb->ptr + key_len + 1); /* The key was stored there too; skip past it */
- cdb_free(cdb);
- Put(ctdlconfig, key, key_len, value, NULL);
- syslog(LOG_DEBUG, "\033[32mGET CONFIG: '%s' = '%s'\033[0m", key, value);
- return value;
-}
-
-
-/*
- * Fetch a system config value - integer
- */
-int CtdlGetConfigInt(char *key)
-{
- char *s = CtdlGetConfigStr(key);
- if (s) return atoi(s);
- return 0;
+ syslog(LOG_EMERG, "%s: %s", file_citadel_config, strerror(errno));
}
-/*
- * Fetch a system config value - long integer
- */
-long CtdlGetConfigLong(char *key)
-{
- char *s = CtdlGetConfigStr(key);
- if (s) return atol(s);
- return 0;
-}
-
-
-
-/**********************************************************************/
-
-
-
-
-
-
-
-
-
void CtdlGetSysConfigBackend(long msgnum, void *userdata) {
config_msgnum = msgnum;
/*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
*
- * 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.
+ * 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.
*/
#include "serv_extensions.h"
#include "citadel_dirs.h"
-
-/*
- * This is the format of the legacy config file. Do not attempt to do anything with it other
- * than migrate it into the new format.
- */
-struct legacy_config {
- char c_nodename[16]; /* short name of this node on a Citadel network */
- char c_fqdn[64]; /* this site's fully qualified domain name */
- char c_humannode[21]; /* human-readable site name */
- char c_niu_7[16];
- uid_t c_niu_6;
- char c_creataide; /* 1 = creating a room auto-grants room aide privileges */
- int c_sleeping; /* watchdog timer (seconds) */
- char c_initax; /* initial access level for new users */
- char c_regiscall; /* after c_regiscall logins user will be asked to register */
- char c_twitdetect; /* automatically move messages from problem users to trashcan */
- char c_twitroom[ROOMNAMELEN]; /* name of trashcan */
- char c_moreprompt[80]; /* paginator prompt */
- char c_restrict; /* require per-user permission to send Internet mail */
- long c_niu_1;
- char c_site_location[32]; /* geographic location of this Citadel site */
- char c_sysadm[26]; /* name of system administrator */
- char c_niu_2[15];
- int c_niu_3;
- int c_maxsessions; /* maximum number of concurrent sessions allowed */
- char c_ip_addr[20]; /* bind address for listening sockets */
- int c_port_number; /* port number for Citadel protocol (usually 504) */
- int c_niu_4;
- struct ExpirePolicy c_ep; /* default expire policy for the entire site */
- int c_userpurge; /* user purge time (in days) */
- int c_roompurge; /* room purge time (in days) */
- char c_logpages[ROOMNAMELEN];
- char c_createax;
- long c_maxmsglen;
- int c_min_workers;
- int c_max_workers;
- int c_pop3_port;
- int c_smtp_port;
- int c_rfc822_strict_from;
- int c_aide_zap;
- int c_imap_port;
- time_t c_net_freq;
- char c_disable_newu;
- char c_enable_fulltext;
- char c_baseroom[ROOMNAMELEN];
- char c_aideroom[ROOMNAMELEN];
- int c_purge_hour;
- struct ExpirePolicy c_mbxep;
- char c_ldap_host[128];
- int c_ldap_port;
- char c_ldap_base_dn[256];
- char c_ldap_bind_dn[256];
- char c_ldap_bind_pw[256];
- int c_msa_port;
- int c_imaps_port;
- int c_pop3s_port;
- int c_smtps_port;
- char c_auto_cull;
- char c_niu_5;
- char c_allow_spoofing;
- char c_journal_email;
- char c_journal_pubmsgs;
- char c_journal_dest[128];
- char c_default_cal_zone[128];
- int c_pftcpdict_port;
- int c_managesieve_port;
- int c_auth_mode;
- char c_funambol_host[256];
- int c_funambol_port;
- char c_funambol_source[256];
- char c_funambol_auth[256];
- char c_rbl_at_greeting;
- char c_master_user[32];
- char c_master_pass[32];
- char c_pager_program[256];
- char c_imap_keep_from;
- int c_xmpp_c2s_port;
- int c_xmpp_s2s_port;
- time_t c_pop3_fetch;
- time_t c_pop3_fastest;
- int c_spam_flag_only;
- int c_guest_logins;
- int c_nntp_port;
- int c_nntps_port;
-};
-
-
-
-
-void initialize_config_system(void);
-void shutdown_config_system(void);
+void get_config(void);
void put_config(void);
-void CtdlSetConfigStr(char *, char *);
-char *CtdlGetConfigStr(char *);
-int CtdlGetConfigInt(char *);
-long CtdlGetConfigLong(char *);
-void CtdlSetConfigInt(char *key, int value);
-void CtdlSetConfigLong(char *key, long value);
char *CtdlGetSysConfig(char *sysconfname);
void CtdlPutSysConfig(char *sysconfname, char *sysconfdata);
* Citadel context management stuff.
* Here's where we (hopefully) have all the code that manipulates contexts.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "locate_host.h"
#include "context.h"
#include "control.h"
-#include "config.h"
int DebugSession = 0;
for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) {
if (
(ccptr != CC)
- && (CtdlGetConfigLong("c_sleeping") > 0)
- && (now - (ccptr->lastcmd) > CtdlGetConfigLong("c_sleeping"))
+ && (config.c_sleeping > 0)
+ && (now - (ccptr->lastcmd) > config.c_sleeping)
) {
if (!ccptr->dont_term) {
ccptr->kill_me = KILLME_IDLE;
*con->fake_hostname = '\0';
*con->fake_roomname = '\0';
*con->cs_clientinfo = '\0';
- safestrncpy(con->cs_host, CtdlGetConfigStr("c_fqdn"), sizeof con->cs_host);
+ safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
safestrncpy(con->cs_addr, "", sizeof con->cs_addr);
con->cs_UDSclientUID = -1;
con->cs_host[sizeof con->cs_host - 1] = 0;
con->dl_is_net = 0;
con->nologin = 0;
- if (((CtdlGetConfigInt("c_maxsessions") > 0)&&(num_sessions > CtdlGetConfigInt("c_maxsessions"))) || CtdlWantSingleUser()) {
+ if (((config.c_maxsessions > 0)&&(num_sessions > config.c_maxsessions)) || CtdlWantSingleUser()) {
con->nologin = 1;
}
/*
* This module handles states which are global to the entire server.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2014 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
*
- * 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.
+ * 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.
*/
#include <stdio.h>
#include "user_ops.h"
struct CitControl CitControl;
+extern struct config config;
FILE *control_fp = NULL;
long control_highest_user = 0;
control_fp = fopen(file_citadel_control, "rb+");
if (control_fp != NULL) {
lock_control();
- rv = fchown(fileno(control_fp), ctdluid, -1);
+ rv = fchown(fileno(control_fp), config.c_ctdluid, -1);
if (rv == -1)
syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n",
file_citadel_control, strerror(errno));
lock_control();
memset(&CitControl, 0, sizeof(struct CitControl));
- rv = fchown(fileno(control_fp), ctdluid, -1);
+ rv = fchown(fileno(control_fp), config.c_ctdluid, -1);
if (rv == -1)
syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n",
file_citadel_control, strerror(errno));
syslog(LOG_EMERG, "Failed to read Controlfile: %s [%s]\n",
file_citadel_control, strerror(errno));
already_have_control = 1;
- rv = chown(file_citadel_control, ctdluid, (-1));
+ rv = chown(file_citadel_control, config.c_ctdluid, (-1));
if (rv == -1)
syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n",
file_citadel_control, strerror(errno));
-/*
- * Helper function for cmd_conf() to handle boolean values
- */
-int confbool(char *v)
-{
- if (IsEmptyStr(v)) return(0);
- if (atoi(v) != 0) return(1);
- return(0);
-}
-
-
/*
* Get or set global configuration options
*
{
char cmd[16];
char buf[256];
- int a, i;
- long ii;
+ int a;
char *confptr;
char confname[128];
extract_token(cmd, argbuf, 0, '|', sizeof cmd);
if (!strcasecmp(cmd, "GET")) {
cprintf("%d Configuration...\n", LISTING_FOLLOWS);
- cprintf("%s\n", CtdlGetConfigStr("c_nodename"));
- cprintf("%s\n", CtdlGetConfigStr("c_fqdn"));
- cprintf("%s\n", CtdlGetConfigStr("c_humannode"));
- cprintf("xxx\n"); /* placeholder -- field no longer in use */
- cprintf("%d\n", CtdlGetConfigInt("c_creataide"));
- cprintf("%d\n", CtdlGetConfigInt("c_sleeping"));
- cprintf("%d\n", CtdlGetConfigInt("c_initax"));
- cprintf("%d\n", CtdlGetConfigInt("c_regiscall"));
- cprintf("%d\n", CtdlGetConfigInt("c_twitdetect"));
- cprintf("%s\n", CtdlGetConfigStr("c_twitroom"));
- cprintf("%s\n", CtdlGetConfigStr("c_moreprompt"));
- cprintf("%d\n", CtdlGetConfigInt("c_restrict"));
- cprintf("%s\n", CtdlGetConfigStr("c_site_location"));
- cprintf("%s\n", CtdlGetConfigStr("c_sysadm"));
- cprintf("%d\n", CtdlGetConfigInt("c_maxsessions"));
+ cprintf("%s\n", config.c_nodename);
+ cprintf("%s\n", config.c_fqdn);
+ cprintf("%s\n", config.c_humannode);
+ cprintf("%s\n", config.c_phonenum);
+ cprintf("%d\n", config.c_creataide);
+ cprintf("%d\n", config.c_sleeping);
+ cprintf("%d\n", config.c_initax);
+ cprintf("%d\n", config.c_regiscall);
+ cprintf("%d\n", config.c_twitdetect);
+ cprintf("%s\n", config.c_twitroom);
+ cprintf("%s\n", config.c_moreprompt);
+ cprintf("%d\n", config.c_restrict);
+ cprintf("%s\n", config.c_site_location);
+ cprintf("%s\n", config.c_sysadm);
+ cprintf("%d\n", config.c_maxsessions);
cprintf("xxx\n"); /* placeholder -- field no longer in use */
- cprintf("%d\n", CtdlGetConfigInt("c_userpurge"));
- cprintf("%d\n", CtdlGetConfigInt("c_roompurge"));
- cprintf("%s\n", CtdlGetConfigStr("c_logpages"));
- cprintf("%d\n", CtdlGetConfigInt("c_createax"));
- cprintf("%ld\n", CtdlGetConfigLong("c_maxmsglen"));
- cprintf("%d\n", CtdlGetConfigInt("c_min_workers"));
- cprintf("%d\n", CtdlGetConfigInt("c_max_workers"));
- cprintf("%d\n", CtdlGetConfigInt("c_pop3_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_smtp_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_rfc822_strict_from"));
- cprintf("%d\n", CtdlGetConfigInt("c_aide_zap"));
- cprintf("%d\n", CtdlGetConfigInt("c_imap_port"));
- cprintf("%ld\n", CtdlGetConfigLong("c_net_freq"));
- cprintf("%d\n", CtdlGetConfigInt("c_disable_newu"));
+ cprintf("%d\n", config.c_userpurge);
+ cprintf("%d\n", config.c_roompurge);
+ cprintf("%s\n", config.c_logpages);
+ cprintf("%d\n", config.c_createax);
+ cprintf("%ld\n", config.c_maxmsglen);
+ cprintf("%d\n", config.c_min_workers);
+ cprintf("%d\n", config.c_max_workers);
+ cprintf("%d\n", config.c_pop3_port);
+ cprintf("%d\n", config.c_smtp_port);
+ cprintf("%d\n", config.c_rfc822_strict_from);
+ cprintf("%d\n", config.c_aide_zap);
+ cprintf("%d\n", config.c_imap_port);
+ cprintf("%ld\n", config.c_net_freq);
+ cprintf("%d\n", config.c_disable_newu);
cprintf("1\n"); /* niu */
- cprintf("%d\n", CtdlGetConfigInt("c_purge_hour"));
+ cprintf("%d\n", config.c_purge_hour);
#ifdef HAVE_LDAP
- cprintf("%s\n", CtdlGetConfigStr("c_ldap_host"));
- cprintf("%d\n", CtdlGetConfigInt("c_ldap_port"));
- cprintf("%s\n", CtdlGetConfigStr("c_ldap_base_dn"));
- cprintf("%s\n", CtdlGetConfigStr("c_ldap_bind_dn"));
- cprintf("%s\n", CtdlGetConfigStr("c_ldap_bind_pw"));
+ cprintf("%s\n", config.c_ldap_host);
+ cprintf("%d\n", config.c_ldap_port);
+ cprintf("%s\n", config.c_ldap_base_dn);
+ cprintf("%s\n", config.c_ldap_bind_dn);
+ cprintf("%s\n", config.c_ldap_bind_pw);
#else
cprintf("\n");
cprintf("0\n");
cprintf("\n");
cprintf("\n");
#endif
- cprintf("%s\n", CtdlGetConfigStr("c_ip_addr"));
- cprintf("%d\n", CtdlGetConfigInt("c_msa_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_imaps_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_pop3s_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_smtps_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_enable_fulltext"));
- cprintf("%d\n", CtdlGetConfigInt("c_auto_cull"));
+ cprintf("%s\n", config.c_ip_addr);
+ cprintf("%d\n", config.c_msa_port);
+ cprintf("%d\n", config.c_imaps_port);
+ cprintf("%d\n", config.c_pop3s_port);
+ cprintf("%d\n", config.c_smtps_port);
+ cprintf("%d\n", config.c_enable_fulltext);
+ cprintf("%d\n", config.c_auto_cull);
cprintf("1\n");
- cprintf("%d\n", CtdlGetConfigInt("c_allow_spoofing"));
- cprintf("%d\n", CtdlGetConfigInt("c_journal_email"));
- cprintf("%d\n", CtdlGetConfigInt("c_journal_pubmsgs"));
- cprintf("%s\n", CtdlGetConfigStr("c_journal_dest"));
- cprintf("%s\n", CtdlGetConfigStr("c_default_cal_zone"));
- cprintf("%d\n", CtdlGetConfigInt("c_pftcpdict_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_managesieve_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_auth_mode"));
- cprintf("%s\n", CtdlGetConfigStr("c_funambol_host"));
- cprintf("%d\n", CtdlGetConfigInt("c_funambol_port"));
- cprintf("%s\n", CtdlGetConfigStr("c_funambol_source"));
- cprintf("%s\n", CtdlGetConfigStr("c_funambol_auth"));
- cprintf("%d\n", CtdlGetConfigInt("c_rbl_at_greeting"));
- cprintf("%s\n", CtdlGetConfigStr("c_master_user"));
- cprintf("%s\n", CtdlGetConfigStr("c_master_pass"));
- cprintf("%s\n", CtdlGetConfigStr("c_pager_program"));
- cprintf("%d\n", CtdlGetConfigInt("c_imap_keep_from"));
- cprintf("%d\n", CtdlGetConfigInt("c_xmpp_c2s_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_xmpp_s2s_port"));
- cprintf("%ld\n", CtdlGetConfigLong("c_pop3_fetch"));
- cprintf("%ld\n", CtdlGetConfigLong("c_pop3_fastest"));
- cprintf("%d\n", CtdlGetConfigInt("c_spam_flag_only"));
- cprintf("%d\n", CtdlGetConfigInt("c_guest_logins"));
- cprintf("%d\n", CtdlGetConfigInt("c_port_number"));
- cprintf("%d\n", ctdluid);
- cprintf("%d\n", CtdlGetConfigInt("c_nntp_port"));
- cprintf("%d\n", CtdlGetConfigInt("c_nntps_port"));
+ cprintf("%d\n", config.c_allow_spoofing);
+ cprintf("%d\n", config.c_journal_email);
+ cprintf("%d\n", config.c_journal_pubmsgs);
+ cprintf("%s\n", config.c_journal_dest);
+ cprintf("%s\n", config.c_default_cal_zone);
+ cprintf("%d\n", config.c_pftcpdict_port);
+ cprintf("%d\n", config.c_managesieve_port);
+ cprintf("%d\n", config.c_auth_mode);
+ cprintf("%s\n", config.c_funambol_host);
+ cprintf("%d\n", config.c_funambol_port);
+ cprintf("%s\n", config.c_funambol_source);
+ cprintf("%s\n", config.c_funambol_auth);
+ cprintf("%d\n", config.c_rbl_at_greeting);
+ cprintf("%s\n", config.c_master_user);
+ cprintf("%s\n", config.c_master_pass);
+ cprintf("%s\n", config.c_pager_program);
+ cprintf("%d\n", config.c_imap_keep_from);
+ cprintf("%d\n", config.c_xmpp_c2s_port);
+ cprintf("%d\n", config.c_xmpp_s2s_port);
+ cprintf("%ld\n", config.c_pop3_fetch);
+ cprintf("%ld\n", config.c_pop3_fastest);
+ cprintf("%d\n", config.c_spam_flag_only);
+ cprintf("%d\n", config.c_guest_logins);
+ cprintf("%d\n", config.c_port_number);
+ cprintf("%d\n", config.c_ctdluid);
+ cprintf("%d\n", config.c_nntp_port);
+ cprintf("%d\n", config.c_nntps_port);
cprintf("000\n");
}
while (client_getln(buf, sizeof buf) >= 0 && strcmp(buf, "000")) {
switch (a) {
case 0:
- CtdlSetConfigStr("c_nodename", buf);
+ configlen.c_nodename = safestrncpy(config.c_nodename, buf,
+ sizeof config.c_nodename);
break;
case 1:
- CtdlSetConfigStr("c_fqdn", buf);
+ configlen.c_fqdn = safestrncpy(config.c_fqdn, buf,
+ sizeof config.c_fqdn);
break;
case 2:
- CtdlSetConfigStr("c_humannode", buf);
+ configlen.c_humannode = safestrncpy(config.c_humannode, buf,
+ sizeof config.c_humannode);
break;
case 3:
- /* placeholder -- field no longer in use */
+ configlen.c_phonenum = safestrncpy(config.c_phonenum, buf,
+ sizeof config.c_phonenum);
break;
case 4:
- CtdlSetConfigInt("c_creataide", atoi(buf));
+ config.c_creataide = atoi(buf);
break;
case 5:
- CtdlSetConfigInt("c_sleeping", atoi(buf));
+ config.c_sleeping = atoi(buf);
break;
case 6:
- i = atoi(buf);
- if (i < 1) i = 1;
- if (i > 6) i = 6;
- CtdlSetConfigInt("c_initax", i);
+ config.c_initax = atoi(buf);
+ if (config.c_initax < 1)
+ config.c_initax = 1;
+ if (config.c_initax > 6)
+ config.c_initax = 6;
break;
case 7:
- CtdlSetConfigInt("c_regiscall", confbool(buf));
+ config.c_regiscall = atoi(buf);
+ if (config.c_regiscall != 0)
+ config.c_regiscall = 1;
break;
case 8:
- CtdlSetConfigInt("c_twitdetect", confbool(buf));
+ config.c_twitdetect = atoi(buf);
+ if (config.c_twitdetect != 0)
+ config.c_twitdetect = 1;
break;
case 9:
- CtdlSetConfigStr("c_twitroom", buf);
+ configlen.c_twitroom = safestrncpy(config.c_twitroom, buf,
+ sizeof config.c_twitroom);
break;
case 10:
- CtdlSetConfigStr("c_moreprompt", buf);
+ configlen.c_moreprompt = safestrncpy(config.c_moreprompt, buf,
+ sizeof config.c_moreprompt);
break;
case 11:
- CtdlSetConfigInt("c_restrict", confbool(buf));
+ config.c_restrict = atoi(buf);
+ if (config.c_restrict != 0)
+ config.c_restrict = 1;
break;
case 12:
- CtdlSetConfigInt("c_site_location", confbool(buf));
+ configlen.c_site_location = safestrncpy(
+ config.c_site_location, buf,
+ sizeof config.c_site_location);
break;
case 13:
- CtdlSetConfigInt("c_sysadm", confbool(buf));
+ configlen.c_sysadm = safestrncpy(config.c_sysadm, buf,
+ sizeof config.c_sysadm);
break;
case 14:
- i = atoi(buf);
- if (i < 0) i = 0;
- CtdlSetConfigInt("c_maxsessions", i);
+ config.c_maxsessions = atoi(buf);
+ if (config.c_maxsessions < 0)
+ config.c_maxsessions = 0;
break;
case 15:
/* placeholder -- field no longer in use */
break;
case 16:
- CtdlSetConfigInt("c_userpurge", atoi(buf));
+ config.c_userpurge = atoi(buf);
break;
case 17:
- CtdlSetConfigInt("c_roompurge", atoi(buf));
+ config.c_roompurge = atoi(buf);
break;
case 18:
- CtdlSetConfigStr("c_logpages", buf);
+ configlen.c_logpages = safestrncpy(config.c_logpages, buf,
+ sizeof config.c_logpages);
break;
case 19:
- i = atoi(buf);
- if (i < 1) i = 1;
- if (i > 6) i = 6;
- CtdlSetConfigInt("c_createax", i);
+ config.c_createax = atoi(buf);
+ if (config.c_createax < 1)
+ config.c_createax = 1;
+ if (config.c_createax > 6)
+ config.c_createax = 6;
break;
case 20:
- ii = atol(buf);
- if (ii >= 8192) {
- CtdlSetConfigLong("c_maxmsglen", ii);
- }
+ if (atoi(buf) >= 8192)
+ config.c_maxmsglen = atoi(buf);
break;
case 21:
- i = atoi(buf);
- if (i >= 3) { // minimum value
- CtdlSetConfigInt("c_min_workers", i);
- }
- break;
+ if (atoi(buf) >= 2)
+ config.c_min_workers = atoi(buf);
case 22:
- i = atoi(buf);
- if (i >= CtdlGetConfigInt("c_min_workers")) { // max must be >= min
- CtdlSetConfigInt("c_max_workers", i);
- }
- break;
+ if (atoi(buf) >= config.c_min_workers)
+ config.c_max_workers = atoi(buf);
case 23:
- CtdlSetConfigInt("c_pop3_port", atoi(buf));
+ config.c_pop3_port = atoi(buf);
break;
case 24:
- CtdlSetConfigInt("c_smtp_port", atoi(buf));
+ config.c_smtp_port = atoi(buf);
break;
case 25:
- CtdlSetConfigInt("c_rfc822_strict_from", atoi(buf));
+ config.c_rfc822_strict_from = atoi(buf);
break;
case 26:
- CtdlSetConfigInt("c_aide_zap", confbool(buf));
+ config.c_aide_zap = atoi(buf);
+ if (config.c_aide_zap != 0)
+ config.c_aide_zap = 1;
break;
case 27:
- CtdlSetConfigInt("c_imap_port", atoi(buf));
+ config.c_imap_port = atoi(buf);
break;
case 28:
- CtdlSetConfigLong("c_net_freq", atol(buf));
+ config.c_net_freq = atol(buf);
break;
case 29:
- CtdlSetConfigInt("c_disable_newu", confbool(buf));
+ config.c_disable_newu = atoi(buf);
+ if (config.c_disable_newu != 0)
+ config.c_disable_newu = 1;
break;
case 30:
/* niu */
break;
case 31:
- i = atoi(buf);
- if ((i >= 0) && (i <= 23)) {
- CtdlSetConfigInt("c_purge_hour", i);
+ if ((config.c_purge_hour >= 0)
+ && (config.c_purge_hour <= 23)) {
+ config.c_purge_hour = atoi(buf);
}
break;
+#ifdef HAVE_LDAP
case 32:
- CtdlSetConfigStr("c_ldap_host", buf);
+ configlen.c_ldap_host = safestrncpy(config.c_ldap_host, buf,
+ sizeof config.c_ldap_host);
break;
case 33:
- CtdlSetConfigInt("c_ldap_port", atoi(buf));
+ config.c_ldap_port = atoi(buf);
break;
case 34:
- CtdlSetConfigStr("c_ldap_base_dn", buf);
+ configlen.c_ldap_base_dn = safestrncpy(config.c_ldap_base_dn, buf,
+ sizeof config.c_ldap_base_dn);
break;
case 35:
- CtdlSetConfigStr("c_ldap_bind_dn", buf);
+ configlen.c_ldap_bind_dn = safestrncpy(config.c_ldap_bind_dn, buf,
+ sizeof config.c_ldap_bind_dn);
break;
case 36:
- CtdlSetConfigStr("c_ldap_bind_pw", buf);
+ configlen.c_ldap_bind_pw = safestrncpy(config.c_ldap_bind_pw, buf,
+ sizeof config.c_ldap_bind_pw);
break;
+#endif
case 37:
- CtdlSetConfigStr("c_ip_addr", buf);
- break;
+ configlen.c_ip_addr = safestrncpy(config.c_ip_addr, buf,
+ sizeof config.c_ip_addr);
case 38:
- CtdlSetConfigInt("c_msa_port", atoi(buf));
+ config.c_msa_port = atoi(buf);
break;
case 39:
- CtdlSetConfigInt("c_imaps_port", atoi(buf));
+ config.c_imaps_port = atoi(buf);
break;
case 40:
- CtdlSetConfigInt("c_pop3s_port", atoi(buf));
+ config.c_pop3s_port = atoi(buf);
break;
case 41:
- CtdlSetConfigInt("c_smtps_port", atoi(buf));
+ config.c_smtps_port = atoi(buf);
break;
case 42:
- CtdlSetConfigInt("c_enable_fulltext", confbool(buf));
+ config.c_enable_fulltext = atoi(buf);
break;
case 43:
- CtdlSetConfigInt("c_auto_cull", confbool(buf));
+ config.c_auto_cull = atoi(buf);
break;
case 44:
/* niu */
break;
case 45:
- CtdlSetConfigInt("c_allow_spoofing", confbool(buf));
+ config.c_allow_spoofing = atoi(buf);
break;
case 46:
- CtdlSetConfigInt("c_journal_email", confbool(buf));
+ config.c_journal_email = atoi(buf);
break;
case 47:
- CtdlSetConfigInt("c_journal_pubmsgs", confbool(buf));
+ config.c_journal_pubmsgs = atoi(buf);
break;
case 48:
- CtdlSetConfigStr("c_journal_dest", buf);
- break;
+ configlen.c_journal_dest = safestrncpy(config.c_journal_dest, buf,
+ sizeof config.c_journal_dest);
case 49:
- CtdlSetConfigStr("c_default_cal_zone", buf);
+ configlen.c_default_cal_zone = safestrncpy(
+ config.c_default_cal_zone, buf,
+ sizeof config.c_default_cal_zone);
break;
case 50:
- CtdlSetConfigInt("c_pftcpdict_port", atoi(buf));
+ config.c_pftcpdict_port = atoi(buf);
break;
case 51:
- CtdlSetConfigInt("c_managesieve_port", atoi(buf));
+ config.c_managesieve_port = atoi(buf);
break;
case 52:
- CtdlSetConfigInt("c_auth_mode", atoi(buf));
- break;
+ config.c_auth_mode = atoi(buf);
case 53:
- CtdlSetConfigStr("c_funambol_host", buf);
+ configlen.c_funambol_host = safestrncpy(
+ config.c_funambol_host, buf,
+ sizeof config.c_funambol_host);
break;
case 54:
- CtdlSetConfigInt("c_funambol_port", atoi(buf));
+ config.c_funambol_port = atoi(buf);
break;
case 55:
- CtdlSetConfigStr("c_funambol_source", buf);
+ configlen.c_funambol_source = safestrncpy(
+ config.c_funambol_source, buf,
+ sizeof config.c_funambol_source);
break;
case 56:
- CtdlSetConfigStr("c_funambol_auth", buf);
+ configlen.c_funambol_auth = safestrncpy(
+ config.c_funambol_auth, buf,
+ sizeof config.c_funambol_auth);
break;
case 57:
- CtdlSetConfigInt("c_rbl_at_greeting", confbool(buf));
+ config.c_rbl_at_greeting = atoi(buf);
break;
case 58:
- CtdlSetConfigStr("c_master_user", buf);
+ configlen.c_master_user = safestrncpy(
+ config.c_master_user,
+ buf, sizeof config.c_master_user);
break;
case 59:
- CtdlSetConfigStr("c_master_pass", buf);
+ configlen.c_master_pass = safestrncpy(
+ config.c_master_pass, buf, sizeof config.c_master_pass);
break;
case 60:
- CtdlSetConfigStr("c_pager_program", buf);
+ configlen.c_pager_program = safestrncpy(
+ config.c_pager_program, buf, sizeof config.c_pager_program);
break;
case 61:
- CtdlSetConfigInt("c_imap_keep_from", confbool(buf));
+ config.c_imap_keep_from = atoi(buf);
break;
case 62:
- CtdlSetConfigInt("c_xmpp_c2s_port", atoi(buf));
+ config.c_xmpp_c2s_port = atoi(buf);
break;
case 63:
- CtdlSetConfigInt("c_xmpp_s2s_port", atoi(buf));
+ config.c_xmpp_s2s_port = atoi(buf);
break;
case 64:
- CtdlSetConfigLong("c_pop3_fetch", atol(buf));
+ config.c_pop3_fetch = atol(buf);
break;
case 65:
- CtdlSetConfigLong("c_pop3_fastest", atol(buf));
+ config.c_pop3_fastest = atol(buf);
break;
case 66:
- CtdlSetConfigInt("c_spam_flag_only", confbool(buf));
+ config.c_spam_flag_only = atoi(buf);
break;
case 67:
- CtdlSetConfigInt("c_guest_logins", confbool(buf));
+ config.c_guest_logins = atoi(buf);
break;
case 68:
- CtdlSetConfigInt("c_port_number", atoi(buf));
+ config.c_port_number = atoi(buf);
break;
case 69:
- /* niu */
+ config.c_ctdluid = atoi(buf);
break;
case 70:
- CtdlSetConfigInt("c_nntp_port", atoi(buf));
+ config.c_nntp_port = atoi(buf);
break;
case 71:
- CtdlSetConfigInt("c_nntps_port", atoi(buf));
+ config.c_nntps_port = atoi(buf);
break;
}
++a;
}
+ put_config();
snprintf(buf, sizeof buf,
"The global system configuration has been edited by %s.\n",
(CC->logged_in ? CC->curr_user : "an administrator")
);
CtdlAideMessage(buf,"Citadel Configuration Manager Message");
- if (!IsEmptyStr(CtdlGetConfigStr("c_logpages")))
- CtdlCreateRoom(CtdlGetConfigStr("c_logpages"), 3, "", 0, 1, 1, VIEW_BBS);
+ if (!IsEmptyStr(config.c_logpages))
+ CtdlCreateRoom(config.c_logpages, 3, "", 0, 1, 1, VIEW_BBS);
/* If full text indexing has been disabled, invalidate the
* index so it doesn't try to use it later.
*/
- if (CtdlGetConfigInt("c_enable_fulltext") == 0) {
- CitControl.MM_fulltext_wordbreaker = 0;
+ if (config.c_enable_fulltext == 0) {
+ CitControl.fulltext_wordbreaker = 0;
put_control();
}
}
extract_token(confname, argbuf, 1, '|', sizeof confname);
unbuffer_output();
cprintf("%d %s\n", SEND_LISTING, confname);
- confptr = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0);
+ confptr = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
CtdlPutSysConfig(confname, confptr);
free(confptr);
}
void *vptr;
List = NewHash(1, NULL);
- Cfg = NewStrBufPlain(CtdlGetConfigStr("c_fqdn"), -1);
+ Cfg = NewStrBufPlain(config.c_fqdn, -1);
Put(List, SKEY(Cfg), Cfg, HFreeStrBuf);
Cfg = NULL;
/*
* This is a data store backend for the Citadel server which uses Berkeley DB.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 3.
#include "ctdl_module.h"
#include "control.h"
#include "citserver.h"
-#include "config.h"
static DB *dbp[MAXCDB]; /* One DB handle for each Citadel database */
}
/* After a successful checkpoint, we can cull the unused logs */
- if (CtdlGetConfigInt("c_auto_cull")) {
+ if (config.c_auto_cull) {
cdb_cull_logs();
}
}
#include "ctdl_module.h"
#include "event_client.h"
#include "citserver.h"
-#include "config.h"
ConstStr IOStates[] = {
{HKEY("DB Queue")},
memset(&egress_sin, 0, sizeof(egress_sin));
egress_sin.sin_family = AF_INET;
- if (!IsEmptyStr(CtdlGetConfigStr("c_ip_addr"))) {
- egress_sin.sin_addr.s_addr = inet_addr(CtdlGetConfigStr("c_ip_addr"));
+ if (!IsEmptyStr(config.c_ip_addr)) {
+ egress_sin.sin_addr.s_addr = inet_addr(config.c_ip_addr);
if (egress_sin.sin_addr.s_addr == !INADDR_ANY) {
egress_sin.sin_addr.s_addr = INADDR_ANY;
}
* Function to go through an ical component set and convert all non-UTC
* date/time properties to UTC. It also strips out any VTIMEZONE
* subcomponents afterwards, because they're irrelevant.
- *
- * Copyright (c) 1987-2015 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
- *
- * 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.
*/
icaltimezone *get_default_icaltimezone(void) {
icaltimezone *zone = NULL;
- char *default_zone_name = CtdlGetConfigStr("c_default_cal_zone");
+ char *default_zone_name = config.c_default_cal_zone;
+ //char *default_zone_name = "America/New_York";
if (!zone) {
zone = icaltimezone_get_builtin_timezone(default_zone_name);
*/
void CtdlModuleDoSearch(int *num_msgs, long **search_msgs, const char *search_string, const char *func_name);
-#define NODENAME CtdlGetConfigStr("c_nodename")
-#define FQDN CtdlGetConfigStr("c_fqdn")
-#define CTDLUID ctdluid
-#define CREATAIDE CtdlGetConfigInt("c_creataide")
-#define REGISCALL CtdlGetConfigInt("c_regiscall")
-#define TWITDETECT CtdlGetConfigInt("c_twitdetect")
-#define TWITROOM CtdlGetConfigStr("c_twitroom")
-#define RESTRICT_INTERNET CtdlGetConfigInt("c_restrict")
+/*
+ * Global system configuration
+ */
+struct config {
+ char c_nodename[16]; /* short name of this node on a Citadel network */
+ char c_fqdn[64]; /* this site's fully qualified domain name */
+ char c_humannode[21]; /* human-readable site name */
+ char c_phonenum[16]; /* telephone number */
+ uid_t c_ctdluid; /* uid of posix account under which Citadel will run */
+ char c_creataide; /* 1 = creating a room auto-grants room aide privileges */
+ int c_sleeping; /* watchdog timer (seconds) */
+ char c_initax; /* initial access level for new users */
+ char c_regiscall; /* after c_regiscall logins user will be asked to register */
+ char c_twitdetect; /* automatically move messages from problem users to trashcan */
+ char c_twitroom[ROOMNAMELEN]; /* name of trashcan */
+ char c_moreprompt[80]; /* paginator prompt */
+ char c_restrict; /* require per-user permission to send Internet mail */
+ long c_niu_1;
+ char c_site_location[32]; /* geographic location of this Citadel site */
+ char c_sysadm[26]; /* name of system administrator */
+ char c_niu_2[15];
+ int c_niu_3;
+ int c_maxsessions; /* maximum number of concurrent sessions allowed */
+ char c_ip_addr[20]; /* bind address for listening sockets */
+ int c_port_number; /* port number for Citadel protocol (usually 504) */
+ int c_niu_4;
+ struct ExpirePolicy c_ep; /* default expire policy for the entire site */
+ int c_userpurge; /* user purge time (in days) */
+ int c_roompurge; /* room purge time (in days) */
+ char c_logpages[ROOMNAMELEN];
+ char c_createax;
+ long c_maxmsglen;
+ int c_min_workers;
+ int c_max_workers;
+ int c_pop3_port;
+ int c_smtp_port;
+ int c_rfc822_strict_from;
+ int c_aide_zap;
+ int c_imap_port;
+ time_t c_net_freq;
+ char c_disable_newu;
+ char c_enable_fulltext;
+ char c_baseroom[ROOMNAMELEN];
+ char c_aideroom[ROOMNAMELEN];
+ int c_purge_hour;
+ struct ExpirePolicy c_mbxep;
+ char c_ldap_host[128];
+ int c_ldap_port;
+ char c_ldap_base_dn[256];
+ char c_ldap_bind_dn[256];
+ char c_ldap_bind_pw[256];
+ int c_msa_port;
+ int c_imaps_port;
+ int c_pop3s_port;
+ int c_smtps_port;
+ char c_auto_cull;
+ char c_niu_5;
+ char c_allow_spoofing;
+ char c_journal_email;
+ char c_journal_pubmsgs;
+ char c_journal_dest[128];
+ char c_default_cal_zone[128];
+ int c_pftcpdict_port;
+ int c_managesieve_port;
+ int c_auth_mode;
+ char c_funambol_host[256];
+ int c_funambol_port;
+ char c_funambol_source[256];
+ char c_funambol_auth[256];
+ char c_rbl_at_greeting;
+ char c_master_user[32];
+ char c_master_pass[32];
+ char c_pager_program[256];
+ char c_imap_keep_from;
+ int c_xmpp_c2s_port;
+ int c_xmpp_s2s_port;
+ time_t c_pop3_fetch;
+ time_t c_pop3_fastest;
+ int c_spam_flag_only;
+ int c_guest_logins;
+ int c_nntp_port;
+ int c_nntps_port;
+};
+struct configlen {
+ long c_nodename;
+ long c_fqdn;
+ long c_humannode;
+ long c_phonenum;
+ long c_twitroom;
+ long c_moreprompt;
+ long c_site_location;
+ long c_sysadm;
+ long c_niu_2;
+ long c_ip_addr;
+ long c_logpages;
+ long c_baseroom;
+ long c_aideroom;
+ long c_ldap_host;
+ long c_ldap_base_dn;
+ long c_ldap_bind_dn;
+ long c_ldap_bind_pw;
+ long c_journal_dest;
+ long c_default_cal_zone;
+ long c_funambol_host;
+ long c_funambol_source;
+ long c_funambol_auth;
+ long c_master_user;
+ long c_master_pass;
+ long c_pager_program;
+};
+
+#define SET_CFGSTRBUF(which, buffer) configlen.which = safestrncpy(config.which, ChrPtr(buffer), sizeof(config.which))
+#define SET_CFGSTR(which, buffer) configlen.which = safestrncpy(config.which, buffer, sizeof(config.which))
+
+extern struct config config;
+extern struct configlen configlen;
+
+
+#define NODENAME config.c_nodename
+#define FQDN config.c_fqdn
+#define CTDLUID config.c_ctdluid
+#define CREATAIDE config.c_creataide
+#define REGISCALL config.c_regiscall
+#define TWITDETECT config.c_twitdetect
+#define TWITROOM config.c_twitroom
+#define RESTRICT_INTERNET config.c_restrict
+
+#define CFG_KEY(which) config.which, configlen.which
typedef void (*CfgLineParser)(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *rncfg);
typedef void (*CfgLineSerializer)(const CfgLineType *ThisOne, StrBuf *OuptputBuffer, OneRoomNetCfg *rncfg, RoomNetCfgLine *data);
/*
* This file contains functions which handle the mapping of Internet addresses
* to users on the Citadel system.
- *
- * Copyright (c) 1987-2015 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
- *
- * 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.
*/
-
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
if (fqdn == NULL) return(hostalias_nomatch);
if (IsEmptyStr(fqdn)) return(hostalias_nomatch);
if (!strcasecmp(fqdn, "localhost")) return(hostalias_localhost);
- if (!strcasecmp(fqdn, CtdlGetConfigStr("c_fqdn"))) return(hostalias_localhost);
- if (!strcasecmp(fqdn, CtdlGetConfigStr("c_nodename"))) return(hostalias_localhost);
+ if (!strcasecmp(fqdn, config.c_fqdn)) return(hostalias_localhost);
+ if (!strcasecmp(fqdn, config.c_nodename)) return(hostalias_localhost);
if (inetcfg == NULL) return(hostalias_nomatch);
config_lines = num_tokens(inetcfg, '\n');
case MES_LOCAL:
if (!strcasecmp(this_recp, "sysop")) {
++ret->num_room;
- strcpy(this_recp, CtdlGetConfigStr("c_aideroom"));
+ strcpy(this_recp, config.c_aideroom);
if (!IsEmptyStr(ret->recp_room)) {
strcat(ret->recp_room, "|");
}
int a;
strcpy(user, "");
- strcpy(node, CtdlGetConfigStr("c_fqdn"));
+ strcpy(node, config.c_fqdn);
strcpy(name, "");
if (rfc822 == NULL) return;
&& (haschar(node, '%')==0)
&& (haschar(node, '!')==0)
) {
- strcpy(node, CtdlGetConfigStr("c_nodename"));
+ strcpy(node, config.c_nodename);
}
else {
/*
* Message journaling functions.
- *
- * Copyright (c) 1987-2015 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
- *
- * 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.
*/
#include <stdio.h>
#include "ctdl_module.h"
#include "citserver.h"
-#include "config.h"
#include "user_ops.h"
#include "serv_vcard.h" /* Needed for vcard_getuser and extract_inet_email_addrs */
#include "internet_addressing.h"
if (jmsg == NULL)
return;
- journal_recps = validate_recipients(CtdlGetConfigStr("c_journal_dest"), NULL, 0);
+ journal_recps = validate_recipients(config.c_journal_dest, NULL, 0);
if (journal_recps != NULL) {
if ( (journal_recps->num_local > 0)
* These functions implement the portions of AUTHMODE_LDAP and AUTHMODE_LDAP_AD which
* actually speak to the LDAP server.
*
- * Copyright (c) 2011-2015 by the citadel.org development team.
+ * Copyright (c) 2011-2014 by the citadel.org development team.
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "citadel_ldap.h"
#include "ctdl_module.h"
#include "user_ops.h"
-#include "config.h"
#ifdef HAVE_LDAP
#define LDAP_DEPRECATED 1 /* Suppress libldap's warning that we are using deprecated API calls */
char server_url[256];
int ret;
- snprintf(server_url, sizeof server_url, "ldap://%s:%d", CtdlGetConfigStr("c_ldap_host"), CtdlGetConfigInt("c_ldap_port"));
+ snprintf(server_url, sizeof server_url, "ldap://%s:%d", config.c_ldap_host, config.c_ldap_port);
ret = ldap_initialize(ld, server_url);
if (ret != LDAP_SUCCESS) {
syslog(LOG_ALERT, "LDAP: Could not connect to %s : %s",
ldap_set_option(ldserver, LDAP_OPT_PROTOCOL_VERSION, &ctdl_require_ldap_version);
ldap_set_option(ldserver, LDAP_OPT_REFERRALS, (void *)LDAP_OPT_OFF);
- striplt(CtdlGetConfigStr("c_ldap_bind_dn"));
- striplt(CtdlGetConfigStr("c_ldap_bind_pw"));
- syslog(LOG_DEBUG, "LDAP bind DN: %s", CtdlGetConfigStr("c_ldap_bind_dn"));
+ striplt(config.c_ldap_bind_dn);
+ striplt(config.c_ldap_bind_pw);
+ syslog(LOG_DEBUG, "LDAP bind DN: %s", config.c_ldap_bind_dn);
i = ldap_simple_bind_s(ldserver,
- (!IsEmptyStr(CtdlGetConfigStr("c_ldap_bind_dn")) ? CtdlGetConfigStr("c_ldap_bind_dn") : NULL),
- (!IsEmptyStr(CtdlGetConfigStr("c_ldap_bind_pw")) ? CtdlGetConfigStr("c_ldap_bind_pw") : NULL)
+ (!IsEmptyStr(config.c_ldap_bind_dn) ? config.c_ldap_bind_dn : NULL),
+ (!IsEmptyStr(config.c_ldap_bind_pw) ? config.c_ldap_bind_pw : NULL)
);
if (i != LDAP_SUCCESS) {
syslog(LOG_ALERT, "LDAP: Cannot bind: %s (%d)", ldap_err2string(i), i);
tv.tv_sec = 10;
tv.tv_usec = 0;
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
+ if (config.c_auth_mode == AUTHMODE_LDAP_AD) {
if (lookup_based_on_username != 0)
snprintf(searchstring, sizeof(searchstring), "(displayName=%s)",username);
else
syslog(LOG_DEBUG, "LDAP search: %s", searchstring);
(void) ldap_search_ext_s(
ldserver, /* ld */
- CtdlGetConfigStr("c_ldap_base_dn"), /* base */
+ config.c_ldap_base_dn, /* base */
LDAP_SCOPE_SUBTREE, /* scope */
searchstring, /* filter */
NULL, /* attrs (all attributes) */
syslog(LOG_DEBUG, "dn = %s", user_dn);
}
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
+ if (config.c_auth_mode == AUTHMODE_LDAP_AD) {
values = ldap_get_values(ldserver, search_result, "displayName");
if (values) {
if (values[0]) {
}
/* If we know the username is the CN/displayName, we already set the uid*/
if (lookup_based_on_username==0) {
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD) {
+ if (config.c_auth_mode == AUTHMODE_LDAP_AD) {
values = ldap_get_values(ldserver, search_result, "objectGUID");
if (values) {
if (values[0]) {
ldap_set_option(ldserver, LDAP_OPT_PROTOCOL_VERSION, &ctdl_require_ldap_version);
ldap_set_option(ldserver, LDAP_OPT_REFERRALS, (void *)LDAP_OPT_OFF);
- striplt(CtdlGetConfigStr("c_ldap_bind_dn"));
- striplt(CtdlGetConfigStr("c_ldap_bind_pw"));
- syslog(LOG_DEBUG, "LDAP bind DN: %s", CtdlGetConfigStr("c_ldap_bind_dn"));
+ striplt(config.c_ldap_bind_dn);
+ striplt(config.c_ldap_bind_pw);
+ syslog(LOG_DEBUG, "LDAP bind DN: %s", config.c_ldap_bind_dn);
i = ldap_simple_bind_s(ldserver,
- (!IsEmptyStr(CtdlGetConfigStr("c_ldap_bind_dn")) ? CtdlGetConfigStr("c_ldap_bind_dn") : NULL),
- (!IsEmptyStr(CtdlGetConfigStr("c_ldap_bind_pw")) ? CtdlGetConfigStr("c_ldap_bind_pw") : NULL)
+ (!IsEmptyStr(config.c_ldap_bind_dn) ? config.c_ldap_bind_dn : NULL),
+ (!IsEmptyStr(config.c_ldap_bind_pw) ? config.c_ldap_bind_pw : NULL)
);
if (i != LDAP_SUCCESS) {
syslog(LOG_ALERT, "LDAP: Cannot bind: %s (%d)", ldap_err2string(i), i);
/*
* Autocompletion of email recipients, etc.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
*
- * 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.
+ * 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.
*/
+#include "ctdl_module.h"
-#include "ctdl_module.h"
#include "serv_autocompletion.h"
-#include "config.h"
+
/*
/*
* Search-reduce the results if we have the full text index available
*/
- if (CtdlGetConfigInt("c_enable_fulltext")) {
+ if (config.c_enable_fulltext) {
CtdlModuleDoSearch(&fts_num_msgs, &fts_msgs, search_string, "fulltext");
if (fts_msgs) {
for (i=0; i<num_msgs; ++i) {
* This module implementsserver commands related to the display and
* manipulation of user "bio" files.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include "ctdl_module.h"
-#include "config.h"
#include <sys/types.h>
#include <sys/stat.h>
}
cprintf("%d \n",SEND_LISTING);
while(client_getln(buf, sizeof buf) >= 0 && strcmp(buf,"000")) {
- if (ftell(fp) < CtdlGetConfigLong("c_maxmsglen")) {
+ if (ftell(fp) < config.c_maxmsglen) {
fprintf(fp,"%s\n",buf);
}
}
* room on a Citadel server. It handles iCalendar objects using the
* iTIP protocol. See RFCs 2445 and 2446.
*
- * Copyright (c) 1987-2015 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * Copyright (c) 1987-2011 by the citadel.org team
*
- * 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.
+ * This program is open source 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
*/
#define PRODID "-//Citadel//NONSGML Citadel Calendar//EN"
#include "room_ops.h"
#include "euidindex.h"
#include "ical_dezonify.h"
-#include "config.h"
msg->cm_format_type = 4;
CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
- CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
MsgBody = NewStrBufPlain(NULL, serlen + 100);
StrBufAppendBufPlain(MsgBody, HKEY("Content-type: text/calendar\r\n\r\n"), 0);
* primary FQDN of this Citadel node.
*/
if (found_user != 0) {
- snprintf(buf, sizeof buf, "%s@%s", who, CtdlGetConfigStr("c_fqdn"));
+ snprintf(buf, sizeof buf, "%s@%s", who, config.c_fqdn);
syslog(LOG_DEBUG, "Trying <%s>\n", buf);
recp = validate_recipients(buf, NULL, 0);
if (recp != NULL) {
sprintf(buf, "MAILTO:%s", who);
if (strchr(buf, '@') == NULL) {
strcat(buf, "@");
- strcat(buf, CtdlGetConfigStr("c_fqdn"));
+ strcat(buf, config.c_fqdn);
}
for (i=0; buf[i]; ++i) {
if (buf[i]==' ') buf[i] = '_';
}
cprintf("%d Transmit data now\n", SEND_LISTING);
- calstream = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0);
+ calstream = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
if (calstream == NULL) {
return;
}
/*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*/
#include <string.h>
X509_NAME_add_entry_by_txt(name, "O",
MBSTRING_ASC,
- (unsigned char*) CtdlGetConfigStr("c_humannode"),
+ (unsigned char*) config.c_humannode,
-1, -1, 0);
X509_NAME_add_entry_by_txt(name, "OU",
-1, -1, 0);
/* X509_NAME_add_entry_by_txt(name, "CN",
- MBSTRING_ASC, CtdlGetConfigStr("c_fqdn"), -1, -1, 0);
+ MBSTRING_ASC, config.c_fqdn, -1, -1, 0);
*/
X509_NAME_add_entry_by_txt(name,
/*
* Server functions which handle file transfers and room directories.
- *
- * Copyright (c) 1987-2015 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
- *
- * 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.
*/
#include <stdio.h>
#include "ctdl_module.h"
#include "citserver.h"
#include "support.h"
-#include "config.h"
#include "user_ops.h"
-
/*
* Server command to delete a file from a room's directory
*/
{
char buf2[16];
- help_subst(buffer, "^nodename", CtdlGetConfigStr("c_nodename"));
- help_subst(buffer, "^humannode", CtdlGetConfigStr("c_humannode"));
- help_subst(buffer, "^fqdn", CtdlGetConfigStr("c_fqdn"));
+ help_subst(buffer, "^nodename", config.c_nodename);
+ help_subst(buffer, "^humannode", config.c_humannode);
+ help_subst(buffer, "^fqdn", config.c_fqdn);
help_subst(buffer, "^username", CC->user.fullname);
snprintf(buf2, sizeof buf2, "%ld", CC->user.usernum);
help_subst(buffer, "^usernum", buf2);
- help_subst(buffer, "^sysadm", CtdlGetConfigStr("c_sysadm"));
+ help_subst(buffer, "^sysadm", config.c_sysadm);
help_subst(buffer, "^variantname", CITADEL);
- help_subst(buffer, "^maxsessions", CtdlGetConfigStr("c_maxsessions")); // yes it's numeric but str is ok here
+ snprintf(buf2, sizeof buf2, "%d", config.c_maxsessions);
+ help_subst(buffer, "^maxsessions", buf2);
help_subst(buffer, "^bbsdir", ctdl_message_dir);
}
/*
* represent messages to the citadel clients
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
#include "internet_addressing.h"
#include "user_ops.h"
#include "room_ops.h"
-#include "config.h"
extern char *msgkeys[];
+
/*
* Back end for the MSGS command: output message number only.
*/
}
+
/*
* Back end for the MSGS command: output header summary.
*/
else
mode = MSGS_ALL;
- if ( (mode == MSGS_SEARCH) && (!CtdlGetConfigInt("c_enable_fulltext")) ) {
+ if ( (mode == MSGS_SEARCH) && (!config.c_enable_fulltext) ) {
cprintf("%d Full text index is not enabled on this server.\n",
ERROR + CMD_NOT_SUPPORTED);
return;
/*
* Server functions which perform operations on room objects.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "citserver.h"
#include "ctdl_module.h"
#include "room_ops.h"
-#include "config.h"
/*
* Back-back-end for all room listing commands
cprintf("%d not here.\n", ERROR + HIGHER_ACCESS_REQUIRED);
return;
}
- cprintf("%d %s|%s/%s\n", LISTING_FOLLOWS, CtdlGetConfigStr("c_fqdn"), ctdl_file_dir, CC->room.QRdirname);
+ cprintf("%d %s|%s/%s\n", LISTING_FOLLOWS, config.c_fqdn, ctdl_file_dir, CC->room.QRdirname);
snprintf(buf, sizeof buf, "%s/%s/filedir", ctdl_file_dir, CC->room.QRdirname);
fd = fopen(buf, "r");
CC->room.QRflags |= QR_PRIVATE;
/* Some changes can't apply to BASEROOM */
- if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
+ if (!strncasecmp(CC->room.QRname, config.c_baseroom,
+ ROOMNAMELEN)) {
CC->room.QRorder = 0;
CC->room.QRpasswd[0] = '\0';
CC->room.QRflags &= ~(QR_PRIVATE & QR_PASSWORDED &
}
}
/* Some changes can't apply to AIDEROOM */
- if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
+ if (!strncasecmp(CC->room.QRname, config.c_baseroom,
+ ROOMNAMELEN)) {
CC->room.QRorder = 0;
CC->room.QRflags &= ~QR_MAILBOX;
CC->room.QRflags |= QR_PERMANENT;
CtdlScheduleRoomForDeletion(&CC->room);
/* Return to the Lobby */
- CtdlUserGoto(CtdlGetConfigStr("c_baseroom"), 0, 0, NULL, NULL, NULL, NULL);
+ CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL, NULL, NULL);
/* tell the world what we did */
snprintf(msg, sizeof msg, "The room \"%s\" has been deleted by %s.\n",
if (CtdlAccessCheck(ac_logged_in)) return;
- if (CC->user.axlevel < CtdlGetConfigInt("c_createax") && !CC->internal_pgm) {
+ if (CC->user.axlevel < config.c_createax && !CC->internal_pgm) {
cprintf("%d You need higher access to create rooms.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
return;
/*
* Server functions which perform operations on user objects.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, version 3.
#include "citserver.h"
#include "svn_revision.h"
#include "ctdl_module.h"
-#include "config.h"
void cmd_noop(char *argbuf)
{
void cmd_info(char *cmdbuf) {
cprintf("%d Server info:\n", LISTING_FOLLOWS);
cprintf("%d\n", CC->cs_pid);
- cprintf("%s\n", CtdlGetConfigStr("c_nodename"));
- cprintf("%s\n", CtdlGetConfigStr("c_humannode"));
- cprintf("%s\n", CtdlGetConfigStr("c_fqdn"));
+ cprintf("%s\n", config.c_nodename);
+ cprintf("%s\n", config.c_humannode);
+ cprintf("%s\n", config.c_fqdn);
cprintf("%s\n", CITADEL);
cprintf("%d\n", REV_LEVEL);
- cprintf("%s\n", CtdlGetConfigStr("c_site_location"));
- cprintf("%s\n", CtdlGetConfigStr("c_sysadm"));
+ cprintf("%s\n", config.c_site_location);
+ cprintf("%s\n", config.c_sysadm);
cprintf("%d\n", SERVER_TYPE);
- cprintf("%s\n", CtdlGetConfigStr("c_moreprompt"));
+ cprintf("%s\n", config.c_moreprompt);
cprintf("1\n"); /* 1 = yes, this system supports floors */
cprintf("1\n"); /* 1 = we support the extended paging options */
cprintf("\n"); /* nonce no longer supported */
cprintf("0\n"); /* 1 = no, this server is not LDAP-enabled */
#endif
- if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_NATIVE) && (CtdlGetConfigInt("c_disable_newu") == 0))
+ if ((config.c_auth_mode == AUTHMODE_NATIVE) &&
+ (config.c_disable_newu == 0))
{
- cprintf("%d\n", CtdlGetConfigInt("c_disable_newu"));
+ cprintf("%d\n", config.c_disable_newu);
}
else {
cprintf("1\n"); /* "create new user" does not work with non-native auth modes */
}
- cprintf("%s\n", CtdlGetConfigStr("c_default_cal_zone"));
+ cprintf("%s\n", config.c_default_cal_zone);
/* thread load averages -- temporarily disabled during refactoring of this code */
cprintf("0\n"); /* load average */
cprintf("0\n"); /* thread count */
cprintf("1\n"); /* yes, Sieve mail filtering is supported */
- cprintf("%d\n", CtdlGetConfigInt("c_enable_fulltext"));
+ cprintf("%d\n", config.c_enable_fulltext);
cprintf("%s\n", svn_revision());
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_NATIVE) {
+ if (config.c_auth_mode == AUTHMODE_NATIVE) {
cprintf("%d\n", openid_level_supported); /* OpenID is enabled when using native auth */
}
else {
cprintf("0\n"); /* OpenID is disabled when using non-native auth */
}
- cprintf("%d\n", CtdlGetConfigInt("c_guest_logins"));
+ cprintf("%d\n", config.c_guest_logins);
cprintf("000\n");
}
* get the paginator prompt
*/
void cmd_more(char *argbuf) {
- cprintf("%d %s\n", CIT_OK, CtdlGetConfigStr("c_moreprompt"));
+ cprintf("%d %s\n", CIT_OK, config.c_moreprompt);
}
rev_level = extract_int(argbuf,2);
extract_token(desc, argbuf, 3, '|', sizeof desc);
- safestrncpy(from_host, CtdlGetConfigStr("c_fqdn"), sizeof from_host);
+ safestrncpy(from_host, config.c_fqdn, sizeof from_host);
from_host[sizeof from_host - 1] = 0;
if (num_parms(argbuf)>=5) extract_token(from_host, argbuf, 4, '|', sizeof from_host);
/*
* Server functions which perform operations on user objects.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, version 3.
#include "support.h"
#include "control.h"
#include "ctdl_module.h"
+
#include "citserver.h"
-#include "config.h"
+
#include "user_ops.h"
#include "internet_addressing.h"
+
/*
* USER cmd
*/
"Too many users are already online "
"(maximum is %d)\n",
ERROR + MAX_SESSIONS_EXCEEDED,
- CtdlGetConfigStr("c_nodename"), CtdlGetConfigInt("c_maxsessions"));
+ config.c_nodename, config.c_maxsessions);
return;
case login_ok:
cprintf("%d Password required for %s\n",
long len;
char username[SIZ];
- if (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_NATIVE) {
+ if (config.c_auth_mode != AUTHMODE_NATIVE) {
cprintf("%d This system does not use native mode authentication.\n",
ERROR + NOT_HERE);
return;
}
- if (CtdlGetConfigInt("c_disable_newu")) {
+ if (config.c_disable_newu) {
cprintf("%d Self-service user account creation "
"is disabled on this system.\n", ERROR + NOT_HERE);
return;
if (CC->nologin) {
cprintf("%d %s: Too many users are already online (maximum is %d)\n",
ERROR + MAX_SESSIONS_EXCEEDED,
- CtdlGetConfigStr("c_nodename"), CtdlGetConfigInt("c_maxsessions"));
+ config.c_nodename, config.c_maxsessions);
return;
}
extract_token(username, cmdbuf, 0, '|', sizeof username);
} else if (a == ERROR + ALREADY_EXISTS) {
cprintf("%d '%s' already exists.\n", ERROR + ALREADY_EXISTS, username);
return;
- } else if ( (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_NATIVE) && (a == ERROR + NO_SUCH_USER) ) {
+ } else if ( (config.c_auth_mode != AUTHMODE_NATIVE) && (a == ERROR + NO_SUCH_USER) ) {
cprintf("%d User accounts are not created within Citadel in host authentication mode.\n",
ERROR + NO_SUCH_USER);
return;
return;
}
- if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"),
+ if (!strncasecmp(CC->room.QRname, config.c_baseroom,
ROOMNAMELEN)) {
cprintf("%d Can't add/remove users from this room.\n",
ERROR + NOT_HERE);
/*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*/
#include "sysdep.h"
#include "server.h"
#include "citserver.h"
#include "support.h"
+
#include "ctdl_module.h"
-#include "config.h"
+
#include "event_client.h"
#include "serv_curl.h"
OPT(WRITEDATA, (void *)IO);
OPT(ERRORBUFFER, IO->HttpReq.errdesc);
- if ((!IsEmptyStr(CtdlGetConfigStr("c_ip_addr")))
- && (strcmp(CtdlGetConfigStr("c_ip_addr"), "*"))
- && (strcmp(CtdlGetConfigStr("c_ip_addr"), "::"))
- && (strcmp(CtdlGetConfigStr("c_ip_addr"), "0.0.0.0"))
+ if ((!IsEmptyStr(config.c_ip_addr))
+ && (strcmp(config.c_ip_addr, "*"))
+ && (strcmp(config.c_ip_addr, "::"))
+ && (strcmp(config.c_ip_addr, "0.0.0.0"))
)
{
- OPT(INTERFACE, CtdlGetConfigStr("c_ip_addr"));
+ OPT(INTERFACE, config.c_ip_addr);
}
#ifdef CURLOPT_HTTP_CONTENT_DECODING
/*
* Functions which manage expire policy for rooms
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "support.h"
#include "msgbase.h"
#include "citserver.h"
+
#include "ctdl_module.h"
#include "user_ops.h"
* If there is a default policy for mailbox rooms, return it
*/
if (qrbuf->QRflags & QR_MAILBOX) {
- if (CtdlGetConfigInt("c_mbxep_mode") != 0) {
- epbuf->expire_mode = CtdlGetConfigInt("c_mbxep_mode");
- epbuf->expire_value = CtdlGetConfigInt("c_mbxep_value");
+ if (config.c_mbxep.expire_mode != 0) {
+ memcpy(epbuf, &config.c_mbxep,
+ sizeof(struct ExpirePolicy));
return;
}
}
/* Otherwise, fall back on the system default */
- epbuf->expire_mode = CtdlGetConfigInt("c_ep_mode");
- epbuf->expire_value = CtdlGetConfigInt("c_ep_value");
+ memcpy(epbuf, &config.c_ep, sizeof(struct ExpirePolicy));
}
struct floor *fl;
char which[128];
- memset(&exp, 0, sizeof(struct ExpirePolicy));
extract_token(which, argbuf, 0, '|', sizeof which);
- if (!strcasecmp(which, strof(roompolicy)) || !strcasecmp(which, "room")) {
+ if (!strcasecmp(which, strof(roompolicy))||
+ !strcasecmp(which, "room")) { /* Deprecated version */
memcpy(&exp, &CC->room.QRep, sizeof(struct ExpirePolicy));
}
- else if (!strcasecmp(which, strof(floorpolicy)) || !strcasecmp(which, "floor")) {
+ else if (!strcasecmp(which, strof(floorpolicy))||
+ !strcasecmp(which, "floor")) { /* Deprecated version */
fl = CtdlGetCachedFloor(CC->room.QRfloor);
memcpy(&exp, &fl->f_ep, sizeof(struct ExpirePolicy));
}
- else if (!strcasecmp(which, strof(mailboxespolicy)) || !strcasecmp(which, "mailboxes")) {
- exp.expire_mode = CtdlGetConfigInt("c_mbxep_mode");
- exp.expire_value = CtdlGetConfigInt("c_mbxep_value");
+ else if (!strcasecmp(which, strof(mailboxespolicy))||
+ !strcasecmp(which, "mailboxes")) {/* Deprecated version */
+ memcpy(&exp, &config.c_mbxep, sizeof(struct ExpirePolicy));
}
- else if (!strcasecmp(which, strof(sitepolicy)) || !strcasecmp(which, "site")) {
- exp.expire_mode = CtdlGetConfigInt("c_ep_mode");
- exp.expire_value = CtdlGetConfigInt("c_ep_value");
+ else if (!strcasecmp(which, strof(sitepolicy))||
+ !strcasecmp(which, "site")) {/* Deprecated version */
+ memcpy(&exp, &config.c_ep, sizeof(struct ExpirePolicy));
}
else {
cprintf("%d Invalid keyword \"%s\"\n", ERROR + ILLEGAL_VALUE, which);
return;
}
- if ((!strcasecmp(which, strof(roompolicy))) || (!strcasecmp(which, "room")))
- {
+ if ( (!strcasecmp(which, strof(roompolicy)))
+ || (!strcasecmp(which, "room"))
+ ) {
if (!is_room_aide()) {
cprintf("%d Higher access required.\n", ERROR + HIGHER_ACCESS_REQUIRED);
return;
return;
}
- if ((!strcasecmp(which, strof(floorpolicy))) || (!strcasecmp(which, "floor")))
- {
+ if ( (!strcasecmp(which, strof(floorpolicy)))
+ || (!strcasecmp(which, "floor"))
+ ) {
lgetfloor(&flbuf, CC->room.QRfloor);
memcpy(&flbuf.f_ep, &exp, sizeof(struct ExpirePolicy));
lputfloor(&flbuf, CC->room.QRfloor);
return;
}
- else if ((!strcasecmp(which, strof(mailboxespolicy))) || (!strcasecmp(which, "mailboxes")))
- {
- CtdlSetConfigInt("c_mbxep_mode", exp.expire_mode);
- CtdlSetConfigInt("c_mbxep_value", exp.expire_value);
+ else if ( (!strcasecmp(which, strof(mailboxespolicy)))
+ || (!strcasecmp(which, "mailboxes"))
+ ) {
+ memcpy(&config.c_mbxep, &exp, sizeof(struct ExpirePolicy));
+ put_config();
cprintf("%d Default expire policy for mailboxes set.\n", CIT_OK);
return;
}
- else if ((!strcasecmp(which, strof(sitepolicy))) || (!strcasecmp(which, "site")))
- {
+ else if ( (!strcasecmp(which, strof(sitepolicy)))
+ || (!strcasecmp(which, "site"))
+ ) {
if (exp.expire_mode == EXPIRE_NEXTLEVEL) {
- cprintf("%d Invalid policy (no higher level)\n", ERROR + ILLEGAL_VALUE);
+ cprintf("%d Invalid policy (no higher level)\n",
+ ERROR + ILLEGAL_VALUE);
return;
}
- CtdlSetConfigInt("c_ep_mode", exp.expire_mode);
- CtdlSetConfigInt("c_ep_value", exp.expire_value);
+ memcpy(&config.c_ep, &exp, sizeof(struct ExpirePolicy));
+ put_config();
cprintf("%d Site expire policy has been updated.\n", CIT_OK);
return;
}
*
* You might also see this module affectionately referred to as the DAP (the Dreaded Auto-Purger).
*
- * Copyright (c) 1988-2015 by citadel.org (Art Cancro, Wilifried Goesgens, and others)
+ * Copyright (c) 1988-2011 by citadel.org (Art Cancro, Wilifried Goesgens, and others)
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* 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
+ *
+ *
* A brief technical discussion:
*
* Several of the purge operations found in this module operate in two
if (qrbuf->QRmtime <= (time_t)0) return;
/* If no room purge time is set, be safe and don't purge */
- if (CtdlGetConfigLong("c_roompurge") < 0) return;
+ if (config.c_roompurge < 0) return;
/* Otherwise, check the date of last modification */
age = time(NULL) - (qrbuf->QRmtime);
- purge_secs = CtdlGetConfigLong("c_roompurge") * 86400;
+ purge_secs = (time_t)config.c_roompurge * (time_t)86400;
if (purge_secs <= (time_t)0) return;
syslog(LOG_DEBUG, "<%s> is <%ld> seconds old", qrbuf->QRname, (long)age);
if (age > purge_secs) do_purge = 1;
/* Set purge time; if the user overrides the system default, use it */
if (us->USuserpurge > 0) {
- purge_time = ((time_t)us->USuserpurge) * 86400;
+ purge_time = ((time_t)us->USuserpurge) * 86400L;
}
else {
- purge_time = CtdlGetConfigLong("c_userpurge") * 86400;
+ purge_time = ((time_t)config.c_userpurge) * 86400L;
}
/* The default rule is to not purge. */
/* If the user hasn't called in two months and expiring of accounts is turned on, his/her account
* has expired, so purge the record.
*/
- if (CtdlGetConfigLong("c_userpurge") > 0)
+ if (config.c_userpurge > 0)
{
now = time(NULL);
if ((now - us->lastcall) > purge_time) purge = 1;
syslog(LOG_DEBUG, "PurgeUsers() called");
users_not_purged = 0;
- switch(CtdlGetConfigInt("c_auth_mode")) {
+ switch(config.c_auth_mode) {
case AUTHMODE_NATIVE:
ForEachUser(do_user_purge, NULL);
break;
ForEachUser(do_uid_user_purge, NULL);
break;
default:
- syslog(LOG_DEBUG, "User purge for auth mode %d is not implemented.", CtdlGetConfigInt("c_auth_mode"));
+ syslog(LOG_DEBUG, "User purge for auth mode %d is not implemented.",
+ config.c_auth_mode);
break;
}
*/
now = time(NULL);
localtime_r(&now, &tm);
- if (((tm.tm_hour != CtdlGetConfigInt("c_purge_hour")) || ((now - last_purge) < 43200)) && (force_purge_now == 0))
- {
+ if (
+ ((tm.tm_hour != config.c_purge_hour) || ((now - last_purge) < 43200))
+ && (force_purge_now == 0)
+ ) {
return;
}
* Based on bits of serv_funambol
* Contact: <matt@mcbridematt.dhs.org> / <matt@comalies>
*
- * Copyright (c) 2008-2015
+ * Copyright (c) 2008-2011
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* 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
*/
{
case eFunambol:
snprintf(remoteurl, SIZ, "http://%s@%s:%d/%s",
- CtdlGetConfigStr("c_funambol_auth"),
- CtdlGetConfigStr("c_funambol_host"),
- CtdlGetConfigInt("c_funambol_port"),
+ config.c_funambol_auth,
+ config.c_funambol_host,
+ config.c_funambol_port,
FUNAMBOL_WS);
notify_http_server(remoteurl,
int commandSiz;
char *command;
- commandSiz = sizeof(CtdlGetConfigStr("c_pager_program")) +
+ commandSiz = sizeof(config.c_pager_program) +
strlen(PagerNo) +
msg->cm_lengths[eExtnotify] + 5;
snprintf(command,
commandSiz,
"%s %s -u %s",
- CtdlGetConfigStr("c_pager_program"),
+ config.c_pager_program,
PagerNo,
msg->cm_fields[eExtnotify]);
* don't really require extremely fine granularity here, we'll do it
* with a static variable instead.
*/
- if (IsEmptyStr(CtdlGetConfigStr("c_pager_program")) &&
- IsEmptyStr(CtdlGetConfigStr("c_funambol_host")))
+ if (IsEmptyStr(config.c_pager_program) &&
+ IsEmptyStr(config.c_funambol_host))
{
syslog(LOG_ERR,
"No external notifiers configured on system/user\n");
/* If this is private, local mail, make a copy in the
* recipient's mailbox and bump the reference count.
*/
- if (!IsEmptyStr(CtdlGetConfigStr("c_funambol_host")) || !IsEmptyStr(CtdlGetConfigStr("c_pager_program")))
+ if (!IsEmptyStr(config.c_funambol_host) || !IsEmptyStr(config.c_pager_program))
{
/* Generate a instruction message for the Funambol notification
* server, in the same style as the SMTP queue
* Based on bits of the previous serv_funambol
* Contact: <matt@mcbridematt.dhs.org> / <matt@comalies>
*
- * Copyright (c) 2008-2015
+ * Copyright (c) 2008-2010
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
+ *
+ *
*
* 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.
+ *
+ *
+ *
+ *
*/
#include <stdio.h>
// Do substitutions
help_subst(SOAPMessage, "^notifyuser", user);
- help_subst(SOAPMessage, "^syncsource", CtdlGetConfigStr("c_funambol_source"));
+ help_subst(SOAPMessage, "^syncsource",
+ config.c_funambol_source);
help_subst(SOAPMessage, "^msgid", msgid);
help_subst(SOAPMessage, "^msgnum", msgnumstr);
}
else {
help_subst(remoteurl, "^notifyuser", user);
- help_subst(remoteurl, "^syncsource", CtdlGetConfigStr("c_funambol_source"));
+ help_subst(remoteurl, "^syncsource", config.c_funambol_source);
help_subst(remoteurl, "^msgid", msgid);
help_subst(remoteurl, "^msgnum", msgnumstr);
/*
* This module handles fulltext indexing of the message base.
- * Copyright (c) 2005-2015 by the citadel.org team
+ * Copyright (c) 2005-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
/*
* Don't do this if the site doesn't have it enabled.
*/
- if (!CtdlGetConfigInt("c_enable_fulltext")) {
+ if (!config.c_enable_fulltext) {
return;
}
* Check to see whether the fulltext index is up to date; if there
* are no messages to index, don't waste any more time trying.
*/
- if ((CitControl.MMfulltext >= CitControl.MMhighest) && (CitControl.MM_fulltext_wordbreaker == FT_WORDBREAKER_ID)) {
+ if ((CitControl.MMfulltext >= CitControl.MMhighest) && (CitControl.fulltext_wordbreaker == FT_WORDBREAKER_ID)) {
return; /* nothing to do! */
}
* over.
*/
begin_critical_section(S_CONTROL);
- if (CitControl.MM_fulltext_wordbreaker != FT_WORDBREAKER_ID) {
+ if (CitControl.fulltext_wordbreaker != FT_WORDBREAKER_ID) {
syslog(LOG_DEBUG, "wb ver on disk = %d, code ver = %d",
- CitControl.MM_fulltext_wordbreaker, FT_WORDBREAKER_ID
+ CitControl.fulltext_wordbreaker, FT_WORDBREAKER_ID
);
syslog(LOG_INFO, "(re)initializing full text index");
cdb_trunc(CDB_FULLTEXT);
ft_flush_cache();
begin_critical_section(S_CONTROL);
CitControl.MMfulltext = ft_newhighest;
- CitControl.MM_fulltext_wordbreaker = FT_WORDBREAKER_ID;
+ CitControl.fulltext_wordbreaker = FT_WORDBREAKER_ID;
put_control();
end_critical_section(S_CONTROL);
last_index = time(NULL);
if (CtdlAccessCheck(ac_logged_in)) return;
- if (!CtdlGetConfigInt("c_enable_fulltext")) {
+ if (!config.c_enable_fulltext) {
cprintf("%d Full text index is not enabled on this server.\n",
ERROR + CMD_NOT_SUPPORTED);
return;
if (room) return;
/* Remove from fulltext index */
- if (CtdlGetConfigInt("c_enable_fulltext")) {
+ if (config.c_enable_fulltext) {
ft_index_message(msgnum, 0);
}
}
* Implements the FETCH command in IMAP.
* This is a good example of the protocol's gratuitous complexity.
*
- * Copyright (c) 2001-2015 by the citadel.org team
+ * Copyright (c) 2001-2011 by the citadel.org team
*
- * This program is open source 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 open source 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.
+ * 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
*/
process_rfc822_addr(msg->cm_fields[erFc822Addr], user, node, name);
IPutStr(user, strlen(user)); /* mailbox name (user id) */
IAPuts(" ");
- if (!strcasecmp(node, CtdlGetConfigStr("c_nodename"))) {
- IPutStr(CtdlGetConfigStr("c_fqdn"), strlen(CtdlGetConfigStr("c_fqdn")));
+ if (!strcasecmp(node, config.c_nodename)) {
+ IPutStr(CFG_KEY(c_fqdn));
}
else {
IPutStr(node, strlen(node)); /* host name */
/*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* 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
*/
IUnbuffer ();
- client_read_blob(Imap->TransmittedMessage, literal_length, CtdlGetConfigInt("c_sleeping"));
+ client_read_blob(Imap->TransmittedMessage, literal_length, config.c_sleeping);
if ((ret < 0) || (StrLength(Imap->TransmittedMessage) < literal_length)) {
IReply("NO Read failed.");
CtdlUserGoto(roomname, 0, 0, &msgs, &new, NULL, NULL);
/* If the user is locally authenticated, FORCE the From: header to
- * show up as the real sender. (Configurable setting)
+ * show up as the real sender. FIXME do we really want to do this?
+ * Probably should make it site-definable or even room-definable.
+ *
+ * For now, we allow "forgeries" if the room is one of the user's
+ * private mailboxes.
*/
if (CCC->logged_in) {
- if ( ((CCC->room.QRflags & QR_MAILBOX) == 0) && (CtdlGetConfigInt("c_imap_keep_from") == 0))
- {
- CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
- CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
- }
+ if ( ((CCC->room.QRflags & QR_MAILBOX) == 0) && (config.c_imap_keep_from == 0)) {
+
+ CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
+ }
}
/*
/*
* Implements IMAP's gratuitously complex SEARCH command.
*
- * Copyright (c) 2001-2015 by the citadel.org team
+ * Copyright (c) 2001-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*/
#include "ctdl_module.h"
/* If fulltext indexing is active, on this server,
* all messages have already been qualified.
*/
- if (CtdlGetConfigInt("c_enable_fulltext")) {
+ if (config.c_enable_fulltext) {
match = 1;
}
* text index to disqualify messages that don't have any chance of
* matching. (Only do this if the index is enabled!!)
*/
- if (CtdlGetConfigInt("c_enable_fulltext")) for (i=0; i<(num_items-1); ++i) {
+ if (config.c_enable_fulltext) for (i=0; i<(num_items-1); ++i) {
if (!strcasecmp(itemlist[i].Key, "BODY")) {
CtdlModuleDoSearch(&fts_num_msgs, &fts_msgs, itemlist[i+1].Key, "fulltext");
if (fts_num_msgs > 0) {
/*
* IMAP server for the Citadel system
*
- * Copyright (C) 2000-2015 by Art Cancro and others.
+ * Copyright (C) 2000-2011 by Art Cancro and others.
* This code is released under the terms of the GNU General Public License.
*
* WARNING: the IMAP protocol is badly designed. No implementation of it
* 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"
IAPuts("* OK [");
imap_output_capability_string();
- IAPrintf("] %s IMAP4rev1 %s ready\r\n", CtdlGetConfigStr("c_fqdn"), CITADEL);
+ IAPrintf("] %s IMAP4rev1 %s ready\r\n", config.c_fqdn, CITADEL);
IUnbuffer();
}
if (IMAP->selected) {
imap_do_expunge(); /* yes, we auto-expunge at logout */
}
- IAPrintf("* BYE %s logging out\r\n", CtdlGetConfigStr("c_fqdn"));
+ IAPrintf("* BYE %s logging out\r\n", config.c_fqdn);
IReply("OK Citadel IMAP session ended.");
CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
return;
if (!threading)
{
CtdlRegisterDebugFlagHook(HKEY("imapsrv"), SetIMAPDebugEnabled, &IMAPDebugEnabled);
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_imap_port"),
+ CtdlRegisterServiceHook(config.c_imap_port,
NULL, imap_greeting, imap_command_loop, NULL, CitadelServiceIMAP);
#ifdef HAVE_OPENSSL
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_imaps_port"),
+ CtdlRegisterServiceHook(config.c_imaps_port,
NULL, imaps_greeting, imap_command_loop, NULL, CitadelServiceIMAPS);
#endif
CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP, PRIO_STOP + 30);
/*
* This module handles instant messaging between users.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
-
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
(long)ptr->timestamp, /* time sent */
ptr->flags, /* flags */
ptr->sender, /* sender of msg */
- CtdlGetConfigStr("c_nodename"), /* static for now (and possibly deprecated) */
+ config.c_nodename, /* static for now (and possibly deprecated) */
ptr->sender_email /* email or jid of sender */
);
}
CM_SetField(msg, eOriginalRoom, HKEY(PAGELOGROOM));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
CM_SetAsFieldSB(msg, eMesageText, &FullMsgBuf); /* we own this memory now */
/* Start with usernums[1] because it's guaranteed to be higher than usernums[0],
}
/* Finally, if we're logging instant messages globally, do that now. */
- if (!IsEmptyStr(CtdlGetConfigStr("c_logpages"))) {
- CtdlCreateRoom(CtdlGetConfigStr("c_logpages"), 3, "", 0, 1, 1, VIEW_BBS);
- CtdlSaveMsgPointerInRoom(CtdlGetConfigStr("c_logpages"), msgnum, 0, NULL);
+ if (!IsEmptyStr(config.c_logpages)) {
+ CtdlCreateRoom(config.c_logpages, 3, "", 0, 1, 1, VIEW_BBS);
+ CtdlSaveMsgPointerInRoom(config.c_logpages, msgnum, 0, NULL);
}
}
* as this draft expires with this writing, you might need to search for
* the new one.
*
- * Copyright (c) 2007-2015 by the citadel.org team
+ * Copyright (c) 2007-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
{
if (!threading)
{
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_managesieve_port"),
+ CtdlRegisterServiceHook(config.c_managesieve_port,
NULL,
managesieve_greeting,
managesieve_command_loop,
/*
* This module dumps and/or loads the Citadel database in XML format.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2014 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
char migr_tempfilename2[PATH_MAX];
FILE *migr_global_message_list;
int total_msgs = 0;
-int we_are_currently_importing_config = 0;
+
/*
* Code which implements the export appears in this section
/* export the config file (this is done using x-macros) */
client_write("<config>\n", 9);
-
- /* FIXME FIXME FIXME FIXME FIXME write a config exporter and put it here */
-
+ client_write("<c_nodename>", 12); xml_strout(config.c_nodename); client_write("</c_nodename>\n", 14);
+ client_write("<c_fqdn>", 8); xml_strout(config.c_fqdn); client_write("</c_fqdn>\n", 10);
+ client_write("<c_humannode>", 13); xml_strout(config.c_humannode); client_write("</c_humannode>\n", 15);
+ client_write("<c_phonenum>", 12); xml_strout(config.c_phonenum); client_write("</c_phonenum>\n", 14);
+ cprintf("<c_ctdluid>%d</c_ctdluid>\n", config.c_ctdluid);
+ cprintf("<c_creataide>%d</c_creataide>\n", config.c_creataide);
+ cprintf("<c_sleeping>%d</c_sleeping>\n", config.c_sleeping);
+ cprintf("<c_initax>%d</c_initax>\n", config.c_initax);
+ cprintf("<c_regiscall>%d</c_regiscall>\n", config.c_regiscall);
+ cprintf("<c_twitdetect>%d</c_twitdetect>\n", config.c_twitdetect);
+ client_write("<c_twitroom>", 12); xml_strout(config.c_twitroom); client_write("</c_twitroom>\n", 14);
+ client_write("<c_moreprompt>", 14); xml_strout(config.c_moreprompt); client_write("</c_moreprompt>\n", 16);
+ cprintf("<c_restrict>%d</c_restrict>\n", config.c_restrict);
+ client_write("<c_site_location>", 17); xml_strout(config.c_site_location); client_write("</c_site_location>\n", 19);
+ client_write("<c_sysadm>", 10); xml_strout(config.c_sysadm); client_write("</c_sysadm>\n", 12);
+ cprintf("<c_maxsessions>%d</c_maxsessions>\n", config.c_maxsessions);
+ client_write("<c_ip_addr>", 11); xml_strout(config.c_ip_addr); client_write("</c_ip_addr>\n", 13);
+ cprintf("<c_port_number>%d</c_port_number>\n", config.c_port_number);
+ cprintf("<c_ep_expire_mode>%d</c_ep_expire_mode>\n", config.c_ep.expire_mode);
+ cprintf("<c_ep_expire_value>%d</c_ep_expire_value>\n", config.c_ep.expire_value);
+ cprintf("<c_userpurge>%d</c_userpurge>\n", config.c_userpurge);
+ cprintf("<c_roompurge>%d</c_roompurge>\n", config.c_roompurge);
+ client_write("<c_logpages>", 12); xml_strout(config.c_logpages); client_write("</c_logpages>\n", 14);
+ cprintf("<c_createax>%d</c_createax>\n", config.c_createax);
+ cprintf("<c_maxmsglen>%ld</c_maxmsglen>\n", config.c_maxmsglen);
+ cprintf("<c_min_workers>%d</c_min_workers>\n", config.c_min_workers);
+ cprintf("<c_max_workers>%d</c_max_workers>\n", config.c_max_workers);
+ cprintf("<c_pop3_port>%d</c_pop3_port>\n", config.c_pop3_port);
+ cprintf("<c_smtp_port>%d</c_smtp_port>\n", config.c_smtp_port);
+ cprintf("<c_rfc822_strict_from>%d</c_rfc822_strict_from>\n", config.c_rfc822_strict_from);
+ cprintf("<c_aide_zap>%d</c_aide_zap>\n", config.c_aide_zap);
+ cprintf("<c_imap_port>%d</c_imap_port>\n", config.c_imap_port);
+ cprintf("<c_net_freq>%ld</c_net_freq>\n", config.c_net_freq);
+ cprintf("<c_disable_newu>%d</c_disable_newu>\n", config.c_disable_newu);
+ cprintf("<c_enable_fulltext>%d</c_enable_fulltext>\n", config.c_enable_fulltext);
+ client_write("<c_baseroom>", 12); xml_strout(config.c_baseroom); client_write("</c_baseroom>\n", 14);
+ client_write("<c_aideroom>", 12); xml_strout(config.c_aideroom); client_write("</c_aideroom>\n", 14);
+ cprintf("<c_purge_hour>%d</c_purge_hour>\n", config.c_purge_hour);
+ cprintf("<c_mbxep_expire_mode>%d</c_mbxep_expire_mode>\n", config.c_mbxep.expire_mode);
+ cprintf("<c_mbxep_expire_value>%d</c_mbxep_expire_value>\n", config.c_mbxep.expire_value);
+ client_write("<c_ldap_host>", 13); xml_strout(config.c_ldap_host); client_write("</c_ldap_host>\n", 15);
+ cprintf("<c_ldap_port>%d</c_ldap_port>\n", config.c_ldap_port);
+ client_write("<c_ldap_base_dn>", 16); xml_strout(config.c_ldap_base_dn); client_write("</c_ldap_base_dn>\n", 18);
+ client_write("<c_ldap_bind_dn>", 16); xml_strout(config.c_ldap_bind_dn); client_write("</c_ldap_bind_dn>\n", 18);
+ client_write("<c_ldap_bind_pw>", 16); xml_strout(config.c_ldap_bind_pw); client_write("</c_ldap_bind_pw>\n", 18);
+ cprintf("<c_msa_port>%d</c_msa_port>\n", config.c_msa_port);
+ cprintf("<c_imaps_port>%d</c_imaps_port>\n", config.c_imaps_port);
+ cprintf("<c_pop3s_port>%d</c_pop3s_port>\n", config.c_pop3s_port);
+ cprintf("<c_smtps_port>%d</c_smtps_port>\n", config.c_smtps_port);
+ cprintf("<c_auto_cull>%d</c_auto_cull>\n", config.c_auto_cull);
+ cprintf("<c_allow_spoofing>%d</c_allow_spoofing>\n", config.c_allow_spoofing);
+ cprintf("<c_journal_email>%d</c_journal_email>\n", config.c_journal_email);
+ cprintf("<c_journal_pubmsgs>%d</c_journal_pubmsgs>\n", config.c_journal_pubmsgs);
+ client_write("<c_journal_dest>", 16); xml_strout(config.c_journal_dest); client_write("</c_journal_dest>\n", 18);
+ client_write("<c_default_cal_zone>", 20); xml_strout(config.c_default_cal_zone); client_write("</c_default_cal_zone>\n", 22);
+ cprintf("<c_pftcpdict_port>%d</c_pftcpdict_port>\n", config.c_pftcpdict_port);
+ cprintf("<c_managesieve_port>%d</c_managesieve_port>\n", config.c_managesieve_port);
+ cprintf("<c_auth_mode>%d</c_auth_mode>\n", config.c_auth_mode);
+ client_write("<c_funambol_host>", 17); xml_strout(config.c_funambol_host); client_write("</c_funambol_host>\n", 19);
+ cprintf("<c_funambol_port>%d</c_funambol_port>\n", config.c_funambol_port);
+ client_write("<c_funambol_source>", 19); xml_strout(config.c_funambol_source); client_write("</c_funambol_source>\n", 21);
+ client_write("<c_funambol_auth>", 17); xml_strout(config.c_funambol_auth); client_write("</c_funambol_auth>\n", 19);
+ cprintf("<c_rbl_at_greeting>%d</c_rbl_at_greeting>\n", config.c_rbl_at_greeting);
+ client_write("<c_master_user>", 15); xml_strout(config.c_master_user); client_write("</c_master_user>\n", 17);
+ client_write("<c_master_pass>", 15); xml_strout(config.c_master_pass); client_write("</c_master_pass>\n", 17);
+ client_write("<c_pager_program>", 17); xml_strout(config.c_pager_program); client_write("</c_pager_program>\n", 19);
+ cprintf("<c_imap_keep_from>%d</c_imap_keep_from>\n", config.c_imap_keep_from);
+ cprintf("<c_xmpp_c2s_port>%d</c_xmpp_c2s_port>\n", config.c_xmpp_c2s_port);
+ cprintf("<c_xmpp_s2s_port>%d</c_xmpp_s2s_port>\n", config.c_xmpp_s2s_port);
+ cprintf("<c_pop3_fetch>%ld</c_pop3_fetch>\n", config.c_pop3_fetch);
+ cprintf("<c_pop3_fastest>%ld</c_pop3_fastest>\n", config.c_pop3_fastest);
+ cprintf("<c_spam_flag_only>%d</c_spam_flag_only>\n", config.c_spam_flag_only);
+ cprintf("<c_nntp_port>%d</c_nntp_port>\n", config.c_nntp_port);
+ cprintf("<c_nntps_port>%d</c_nntps_port>\n", config.c_nntps_port);
client_write("</config>\n", 10);
cprintf("<progress>%d</progress>\n", 1);
cprintf("<control_flags>%u</control_flags>\n", CitControl.MMflags);
cprintf("<control_nextuser>%ld</control_nextuser>\n", CitControl.MMnextuser);
cprintf("<control_nextroom>%ld</control_nextroom>\n", CitControl.MMnextroom);
- cprintf("<control_version>%d</control_version>\n", CitControl.MM_hosted_upgrade_level);
+ cprintf("<control_version>%d</control_version>\n", CitControl.version);
client_write("</control>\n", 11);
cprintf("<progress>%d</progress>\n", 2);
memset(&smi, 0, sizeof (struct MetaData));
import_msgnum = 0;
}
- else if (!strcasecmp(el, "config")) {
- we_are_currently_importing_config = 1;
- }
}
int migr_config(void *data, const char *el)
{
-
- /* FIXME FIXME FIXME FIXME FIXME write a config importer and put it here */
-
- return 0; /* if string was not found */
- return 1; /* if string was found */
+ if (!strcasecmp(el, "c_nodename")) SET_CFGSTRBUF(c_nodename, migr_chardata);
+ else if (!strcasecmp(el, "c_fqdn")) SET_CFGSTRBUF(c_fqdn, migr_chardata);
+ else if (!strcasecmp(el, "c_humannode")) SET_CFGSTRBUF(c_humannode, migr_chardata);
+ else if (!strcasecmp(el, "c_phonenum")) SET_CFGSTRBUF(c_phonenum, migr_chardata);
+ else if (!strcasecmp(el, "c_ctdluid")) config.c_ctdluid = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_creataide")) config.c_creataide = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_sleeping")) config.c_sleeping = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_initax")) config.c_initax = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_regiscall")) config.c_regiscall = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_twitdetect")) config.c_twitdetect = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_twitroom")) SET_CFGSTRBUF(c_twitroom, migr_chardata);
+ else if (!strcasecmp(el, "c_moreprompt")) SET_CFGSTRBUF(c_moreprompt, migr_chardata);
+ else if (!strcasecmp(el, "c_restrict")) config.c_restrict = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_site_location")) SET_CFGSTRBUF(c_site_location, migr_chardata);
+ else if (!strcasecmp(el, "c_sysadm")) SET_CFGSTRBUF(c_sysadm, migr_chardata);
+ else if (!strcasecmp(el, "c_maxsessions")) config.c_maxsessions = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_ip_addr")) SET_CFGSTRBUF(c_ip_addr, migr_chardata);
+ else if (!strcasecmp(el, "c_port_number")) config.c_port_number = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_ep_expire_mode")) config.c_ep.expire_mode = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_ep_expire_value")) config.c_ep.expire_value = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_userpurge")) config.c_userpurge = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_roompurge")) config.c_roompurge = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_logpages")) SET_CFGSTRBUF(c_logpages, migr_chardata);
+ else if (!strcasecmp(el, "c_createax")) config.c_createax = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_maxmsglen")) config.c_maxmsglen = atol(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_min_workers")) config.c_min_workers = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_max_workers")) config.c_max_workers = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_pop3_port")) config.c_pop3_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_smtp_port")) config.c_smtp_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_rfc822_strict_from")) config.c_rfc822_strict_from = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_aide_zap")) config.c_aide_zap = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_imap_port")) config.c_imap_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_net_freq")) config.c_net_freq = atol(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_disable_newu")) config.c_disable_newu = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_enable_fulltext")) config.c_enable_fulltext = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_baseroom")) SET_CFGSTRBUF(c_baseroom, migr_chardata);
+ else if (!strcasecmp(el, "c_aideroom")) SET_CFGSTRBUF(c_aideroom, migr_chardata);
+ else if (!strcasecmp(el, "c_purge_hour")) config.c_purge_hour = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_mbxep_expire_mode")) config.c_mbxep.expire_mode = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_mbxep_expire_value")) config.c_mbxep.expire_value = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_ldap_host")) SET_CFGSTRBUF(c_ldap_host, migr_chardata);
+ else if (!strcasecmp(el, "c_ldap_port")) config.c_ldap_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_ldap_base_dn")) SET_CFGSTRBUF(c_ldap_base_dn, migr_chardata);
+ else if (!strcasecmp(el, "c_ldap_bind_dn")) SET_CFGSTRBUF(c_ldap_bind_dn, migr_chardata);
+ else if (!strcasecmp(el, "c_ldap_bind_pw")) SET_CFGSTRBUF(c_ldap_bind_pw, migr_chardata);
+ else if (!strcasecmp(el, "c_msa_port")) config.c_msa_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_imaps_port")) config.c_imaps_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_pop3s_port")) config.c_pop3s_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_smtps_port")) config.c_smtps_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_auto_cull")) config.c_auto_cull = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_allow_spoofing")) config.c_allow_spoofing = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_journal_email")) config.c_journal_email = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_journal_pubmsgs")) config.c_journal_pubmsgs = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_journal_dest")) SET_CFGSTRBUF(c_journal_dest, migr_chardata);
+ else if (!strcasecmp(el, "c_default_cal_zone")) SET_CFGSTRBUF(c_default_cal_zone, migr_chardata);
+ else if (!strcasecmp(el, "c_pftcpdict_port")) config.c_pftcpdict_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_managesieve_port")) config.c_managesieve_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_auth_mode")) config.c_auth_mode = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_funambol_host")) SET_CFGSTRBUF(c_funambol_host, migr_chardata);
+ else if (!strcasecmp(el, "c_funambol_port")) config.c_funambol_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_funambol_source")) SET_CFGSTRBUF(c_funambol_source, migr_chardata);
+ else if (!strcasecmp(el, "c_funambol_auth")) SET_CFGSTRBUF(c_funambol_auth, migr_chardata);
+ else if (!strcasecmp(el, "c_rbl_at_greeting")) config.c_rbl_at_greeting = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_master_user")) SET_CFGSTRBUF(c_master_user, migr_chardata);
+ else if (!strcasecmp(el, "c_master_pass")) SET_CFGSTRBUF(c_master_pass, migr_chardata);
+ else if (!strcasecmp(el, "c_pager_program")) SET_CFGSTRBUF(c_pager_program, migr_chardata);
+ else if (!strcasecmp(el, "c_imap_keep_from")) config.c_imap_keep_from = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_xmpp_c2s_port")) config.c_xmpp_c2s_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_xmpp_s2s_port")) config.c_xmpp_s2s_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_pop3_fetch")) config.c_pop3_fetch = atol(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_pop3_fastest")) config.c_pop3_fastest = atol(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_spam_flag_only")) config.c_spam_flag_only = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_nntp_port")) config.c_nntp_port = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "c_nntps_port")) config.c_nntps_port = atoi(ChrPtr(migr_chardata));
+ else return 0;
+ return 1; /* Found above...*/
}
-
int migr_controlrecord(void *data, const char *el)
{
if (!strcasecmp(el, "control_highest")) CitControl.MMhighest = atol(ChrPtr(migr_chardata));
else if (!strcasecmp(el, "control_flags")) CitControl.MMflags = atoi(ChrPtr(migr_chardata));
else if (!strcasecmp(el, "control_nextuser")) CitControl.MMnextuser = atol(ChrPtr(migr_chardata));
else if (!strcasecmp(el, "control_nextroom")) CitControl.MMnextroom = atol(ChrPtr(migr_chardata));
- else if (!strcasecmp(el, "control_version")) CitControl.MM_hosted_upgrade_level = atoi(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "control_version")) CitControl.version = atoi(ChrPtr(migr_chardata));
else if (!strcasecmp(el, "control")) {
CitControl.MMfulltext = (-1L); /* always flush */
else return 0;
return 1;
}
-
-
void migr_xml_end(void *data, const char *el)
{
const char *ptr;
/*** CONFIG ***/
- if (!strcasecmp(el, "config"))
- {
- CtdlSetConfigInt("c_enable_fulltext", 0); /* always disable */
- we_are_currently_importing_config = 0;
+ if (!strcasecmp(el, "config")) {
+ config.c_enable_fulltext = 0; /* always disable */
+ put_config();
syslog(LOG_INFO, "Completed import of server configuration\n");
}
- else if (we_are_currently_importing_config)
- {
- migr_config(data, el);
- }
+ else if ((!strncasecmp(el, HKEY("c_"))) &&
+ migr_config(data, el))
+ ; /* Nothing to do anymore */
/*** CONTROL ***/
else if ((!strncasecmp(el, HKEY("control"))) &&
* is available at http://www.mrtg.org that can fetch data using external
* scripts. This module supplies data in the format expected by MRTG.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*/
#include "sysdep.h"
cprintf("%ld\n", value2);
cprintf("%d days, %d hours, %d minutes\n",
uptime_days, uptime_hours, uptime_minutes);
- cprintf("%s\n", CtdlGetConfigStr("c_humannode"));
+ cprintf("%s\n", config.c_humannode);
cprintf("000\n");
}
* This module handles shared rooms, inter-Citadel mail, and outbound
* mailing list processing.
*
- * Copyright (c) 2000-2015 by the citadel.org team
+ * Copyright (c) 2000-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
/* Where do we want bounces and other noise to be heard?
* Surely not the list members! */
- snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", CtdlGetConfigStr("c_fqdn"));
+ snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", config.c_fqdn);
/* Now submit the message */
valid = validate_recipients(ChrPtr(sc->Users[digestrecp]), NULL, 0);
/* Where do we want bounces and other noise to be heard?
* Surely not the list members! */
- snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", CtdlGetConfigStr("c_fqdn"));
+ snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", config.c_fqdn);
/* Now submit the message */
valid = validate_recipients(ChrPtr(sc->Users[listrecp]), NULL, 0);
*/
ok_to_participate = 0;
if (!CM_IsEmpty(msg, eNodeName)) {
- if (!strcasecmp(msg->cm_fields[eNodeName], CtdlGetConfigStr("c_nodename")))
- {
+ if (!strcasecmp(msg->cm_fields[eNodeName],
+ config.c_nodename)) {
ok_to_participate = 1;
}
* This module handles shared rooms, inter-Citadel mail, and outbound
* mailing list processing.
*
- * Copyright (c) 2000-2015 by the citadel.org team
+ * Copyright (c) 2000-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
*
- * 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.
+ * 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.
*
* ** NOTE ** A word on the S_NETCONFIGS semaphore:
* This is a fairly high-level type of critical section. It ensures that no
if (CM_IsEmpty(msg, eMessagePath)) {
CM_SetField(msg, eMessagePath, defl, defllen);
}
- node_len = strlen(CtdlGetConfigStr("c_nodename"));
+ node_len = configlen.c_nodename;
if (node_len >= SIZ)
node_len = SIZ - 1;
- memcpy(buf, CtdlGetConfigStr("c_nodename"), node_len);
+ memcpy(buf, config.c_nodename, node_len);
buf[node_len] = '!';
buf[node_len + 1] = '\0';
CM_PrependToField(msg, eMessagePath, buf, node_len + 1);
StrBufAppendBufPlain(sc->ListID, HKEY("room_"), 0);
StrBufAppendBuf(sc->ListID, RoomName, 0);
StrBufAppendBufPlain(sc->ListID, HKEY("."), 0);
- StrBufAppendBufPlain(sc->ListID, CtdlGetConfigStr("c_fqdn"), -1, 0);
+ StrBufAppendBufPlain(sc->ListID, config.c_fqdn, -1, 0);
/*
* this used to be:
* roomname <Room-Number.list-id.fqdn>
StrBufAppendBufPlain(sc->Users[roommailalias], HKEY("room_"), 0);
StrBufAppendBuf(sc->Users[roommailalias], RoomName, 0);
StrBufAppendBufPlain(sc->Users[roommailalias], HKEY("@"), 0);
- StrBufAppendBufPlain(sc->Users[roommailalias], CtdlGetConfigStr("c_fqdn"), -1, 0);
+ StrBufAppendBufPlain(sc->Users[roommailalias], config.c_fqdn, -1, 0);
StrBufLowerCase(sc->Users[roommailalias]);
}
}
else
{
- snprintf(buf, sizeof buf, "room_%s@%s", CCC->room.QRname, CtdlGetConfigStr("c_fqdn"));
+ snprintf(buf, sizeof buf, "room_%s@%s",
+ CCC->room.QRname, config.c_fqdn);
}
for (i=0; buf[i]; ++i) {
/* Check for message routing */
if (!CM_IsEmpty(msg, eDestination)) {
- if (strcasecmp(msg->cm_fields[eDestination], CtdlGetConfigStr("c_nodename"))) {
+ if (strcasecmp(msg->cm_fields[eDestination], config.c_nodename)) {
/* route the message */
Buf = NewStrBufPlain(CM_KEY(msg,eDestination));
* This module handles shared rooms, inter-Citadel mail, and outbound
* mailing list processing.
*
- * Copyright (c) 2000-2015 by the citadel.org team
+ * Copyright (c) 2000-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
*
- * 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.
+ * 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.
*
* ** NOTE ** A word on the S_NETCONFIGS semaphore:
* This is a fairly high-level type of critical section. It ensures that no
if (msg == NULL) return;
- snprintf(bouncesource, sizeof bouncesource, "%s@%s", BOUNCESOURCE, CtdlGetConfigStr("c_nodename"));
+ snprintf(bouncesource, sizeof bouncesource, "%s@%s", BOUNCESOURCE, config.c_nodename);
/*
* Give it a fresh message ID
(long)time(NULL),
(long)getpid(),
++serialnum,
- CtdlGetConfigStr("c_fqdn")
- );
+ config.c_fqdn);
CM_SetField(msg, emessageId, buf, len);
msg->cm_fields[eNodeName]);
CM_SetField(msg, eAuthor, HKEY(BOUNCESOURCE));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
CM_SetField(msg, eMsgSubject, HKEY("Delivery Status Notification (Failure)"));
Netmap_AddMe(msg, HKEY("unknown_user"));
free_recipients(valid);
valid = NULL;
}
- if ( (valid == NULL) || (!strcasecmp(recipient, bouncesource)) )
- {
- strcpy(force_room, CtdlGetConfigStr("c_aideroom"));
+ if ( (valid == NULL) || (!strcasecmp(recipient, bouncesource)) ) {
+ strcpy(force_room, config.c_aideroom);
}
else {
strcpy(force_room, "");
}
if ( (valid == NULL) && IsEmptyStr(force_room) ) {
- strcpy(force_room, CtdlGetConfigStr("c_aideroom"));
+ strcpy(force_room, config.c_aideroom);
}
CtdlSubmitMsg(msg, valid, force_room, 0);
* Run the full set of processing tasks no more frequently
* than once every n seconds
*/
- if ( (time(NULL) - last_run) < CtdlGetConfigLong("c_net_freq") )
- {
+ if ( (time(NULL) - last_run) < config.c_net_freq ) {
full_processing = 0;
syslog(LOG_DEBUG, "Network full processing in %ld seconds.\n",
- CtdlGetConfigLong("c_net_freq") - (time(NULL)- last_run)
+ config.c_net_freq - (time(NULL)- last_run)
);
}
* This module handles shared rooms, inter-Citadel mail, and outbound
* mailing list processing.
*
- * Copyright (c) 2000-2015 by the citadel.org team
+ * Copyright (c) 2000-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 3.
*
- * 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.
+ * 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.
*
* ** NOTE ** A word on the S_NETCONFIGS semaphore:
* This is a fairly high-level type of critical section. It ensures that no
SetNWCState(IO, eNWCVSAuth);
/* We're talking to the correct node. Now identify ourselves. */
StrBufPrintf(NW->IO.SendBuf.Buf, "NETP %s|%s\n",
- CtdlGetConfigStr("c_nodename"),
+ config.c_nodename,
ChrPtr(NW->secret));
NWC_DBG_SEND();
return eSendReply;
* Run the full set of processing tasks no more frequently
* than once every n seconds
*/
- if ( (time(NULL) - last_run) < CtdlGetConfigLong("c_net_freq") )
- {
+ if ( (time(NULL) - last_run) < config.c_net_freq ) {
full_processing = 0;
syslog(LOG_DEBUG, "Network full processing in %ld seconds.\n",
- CtdlGetConfigLong("c_net_freq") - (time(NULL)- last_run)
+ config.c_net_freq - (time(NULL)- last_run)
);
}
//
// NNTP server module (RFC 3977)
//
-// Copyright (c) 2014-2015 by the citadel.org team
+// Copyright (c) 2014 by the citadel.org team
//
// This program is open source software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 3.
}
// Display the standard greeting
- cprintf("200 %s NNTP Citadel server is not finished yet\r\n", CtdlGetConfigStr("c_fqdn"));
+ cprintf("200 %s NNTP Citadel server is not finished yet\r\n", config.c_fqdn);
}
cprintf("482 Already logged in\r\n");
return;
case login_too_many_users:
- cprintf("481 Too many users are already online (maximum is %d)\r\n", CtdlGetConfigInt("c_maxsessions"));
+ cprintf("481 Too many users are already online (maximum is %d)\r\n", config.c_maxsessions);
return;
case login_ok:
cprintf("381 Password required for %s\r\n", CC->curr_user);
{
if (!threading)
{
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_nntp_port"),
+ CtdlRegisterServiceHook(config.c_nntp_port,
NULL,
nntp_greeting,
nntp_command_loop,
CitadelServiceNNTP);
#ifdef HAVE_OPENSSL
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_nntps_port"),
+ CtdlRegisterServiceHook(config.c_nntps_port,
NULL,
nntps_greeting,
nntp_command_loop,
/*
* This is an implementation of OpenID 2.0 relying party support in stateless mode.
*
- * Copyright (c) 2007-2015 by the citadel.org team
+ * Copyright (c) 2007-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
struct cdbdata *cdboi;
long usernum = 0L;
- if (CtdlGetConfigInt("c_disable_newu"))
+ if (config.c_disable_newu)
{
cprintf("%d this system does not support openid.\n",
ERROR + CMD_NOT_SUPPORTED);
long usernum;
struct ctdluser usbuf;
- if (CtdlGetConfigInt("c_disable_newu"))
+ if (config.c_disable_newu)
{
cprintf("%d this system does not support openid.\n",
ERROR + CMD_NOT_SUPPORTED);
void cmd_oidc(char *argbuf) {
ctdl_openid *oiddata = (ctdl_openid *) CC->openid_data;
- if (CtdlGetConfigInt("c_disable_newu"))
+ if (config.c_disable_newu)
{
cprintf("%d this system does not support openid.\n",
ERROR + CMD_NOT_SUPPORTED);
int this_is_mine = 0;
long usernum = 0L;
- if (CtdlGetConfigInt("c_disable_newu"))
+ if (config.c_disable_newu)
{
cprintf("%d this system does not support openid.\n",
ERROR + CMD_NOT_SUPPORTED);
const char *Key;
void *Value;
- if (CtdlGetConfigInt("c_auth_mode") != AUTHMODE_NATIVE) return(1);
- if (CtdlGetConfigInt("c_disable_newu")) return(2);
+ if (config.c_auth_mode != AUTHMODE_NATIVE) return(1);
+ if (config.c_disable_newu) return(2);
if (CC->logged_in) return(3);
HashPos *HashPos = GetNewHashPos(sreg_keys, 0);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); /* die after 30 seconds */
if (
- (!IsEmptyStr(CtdlGetConfigStr("c_ip_addr")))
- && (strcmp(CtdlGetConfigStr("c_ip_addr"), "*"))
- && (strcmp(CtdlGetConfigStr("c_ip_addr"), "::"))
- && (strcmp(CtdlGetConfigStr("c_ip_addr"), "0.0.0.0"))
+ (!IsEmptyStr(config.c_ip_addr))
+ && (strcmp(config.c_ip_addr, "*"))
+ && (strcmp(config.c_ip_addr, "::"))
+ && (strcmp(config.c_ip_addr, "0.0.0.0"))
) {
- curl_easy_setopt(curl, CURLOPT_INTERFACE, CtdlGetConfigStr("c_ip_addr"));
+ curl_easy_setopt(curl, CURLOPT_INTERFACE, config.c_ip_addr);
}
return(curl);
ctdl_openid *oiddata;
int discovery_succeeded = 0;
- if (CtdlGetConfigInt("c_disable_newu"))
+ if (config.c_disable_newu)
{
cprintf("%d this system does not support openid.\n",
ERROR + CMD_NOT_SUPPORTED);
void *Value;
ctdl_openid *oiddata = (ctdl_openid *) CC->openid_data;
- if (CtdlGetConfigInt("c_disable_newu"))
+ if (config.c_disable_newu)
{
cprintf("%d this system does not support openid.\n",
ERROR + CMD_NOT_SUPPORTED);
* If this system does not allow self-service new user registration, the
* remaining modes do not apply, so fail here and now.
*/
- else if (CtdlGetConfigInt("c_disable_newu")) {
+ else if (config.c_disable_newu) {
cprintf("fail\n");
syslog(LOG_DEBUG, "Creating user failed due to local policy");
}
// evcurl call this for us. curl_global_init(CURL_GLOBAL_ALL);
/* Only enable the OpenID command set when native mode authentication is in use. */
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_NATIVE) {
+ if (config.c_auth_mode == AUTHMODE_NATIVE) {
CtdlRegisterProtoHook(cmd_oids, "OIDS", "Setup OpenID authentication");
CtdlRegisterProtoHook(cmd_oidf, "OIDF", "Finalize OpenID authentication");
CtdlRegisterProtoHook(cmd_oidl, "OIDL", "List OpenIDs associated with an account");
/*
* POP3 service for the Citadel system
*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*
* Current status of standards conformance:
*
{
CtdlRegisterDebugFlagHook(HKEY("pop3srv"), SetPOP3DebugEnabled, &POP3DebugEnabled);
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_pop3_port"),
+ CtdlRegisterServiceHook(config.c_pop3_port,
NULL,
pop3_greeting,
pop3_command_loop,
NULL,
CitadelServicePop3);
#ifdef HAVE_OPENSSL
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_pop3s_port"),
+ CtdlRegisterServiceHook(config.c_pop3s_port,
NULL,
pop3s_greeting,
pop3_command_loop,
/*
* Consolidate mail from remote POP3 accounts.
*
- * Copyright (c) 2007-2015 by the citadel.org team
+ * Copyright (c) 2007-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* 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 <stdlib.h>
if (!POP3C_OK) return eTerminateConnection;
RecvMsg->IO.ReadMsg = NewAsyncMsg(HKEY("."),
RecvMsg->CurrMsg->MSGSize,
- CtdlGetConfigLong("c_maxmsglen"),
+ config.c_maxmsglen,
NULL, -1,
1);
become_session(&pop3_client_CC);
- if (CtdlGetConfigLong("c_pop3_fastest") < CtdlGetConfigLong("c_pop3_fetch"))
- fastest_scan = CtdlGetConfigLong("c_pop3_fastest");
+ if (config.c_pop3_fastest < config.c_pop3_fetch)
+ fastest_scan = config.c_pop3_fastest;
else
- fastest_scan = CtdlGetConfigLong("c_pop3_fetch");
+ fastest_scan = config.c_pop3_fetch;
/*
* Run POP3 aggregation no more frequently than once every n seconds
/*
if ((palist->interval && time(NULL) > (last_run + palist->interval))
- || (time(NULL) > last_run + CtdlGetConfigLong("c_pop3_fetch")))
+ || (time(NULL) > last_run + config.c_pop3_fetch))
pop3_do_fetching(palist->roomname, palist->pop3host,
palist->pop3user, palist->pop3pass, palist->keep);
pptr = palist;
/*
* Bring external RSS feeds into rooms.
*
- * Copyright (c) 2007-2015 by the citadel.org team
+ * Copyright (c) 2007-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
CM_SetField(&SaveMsg->Msg, eAuthor, HKEY("rss"));
}
- CM_SetField(&SaveMsg->Msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(&SaveMsg->Msg, eNodeName, CFG_KEY(c_nodename));
if (SaveMsg->title != NULL) {
long len;
char *Sbj;
* This module glues libSieve to the Citadel server in order to implement
* the Sieve mailbox filtering language (RFC 3028).
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
}
if (haschar(my.envelope_from, '@') == 0) {
strcat(my.envelope_from, "@");
- strcat(my.envelope_from, CtdlGetConfigStr("c_fqdn"));
+ strcat(my.envelope_from, config.c_fqdn);
}
/* Keep track of the envelope-to address (use body-to if not found) */
}
if (haschar(my.envelope_to, '@') == 0) {
strcat(my.envelope_to, "@");
- strcat(my.envelope_to, CtdlGetConfigStr("c_fqdn"));
+ strcat(my.envelope_to, config.c_fqdn);
}
CM_Free(msg);
extract_token(script_name, argbuf, 1, '|', sizeof script_name);
if (!IsEmptyStr(script_name)) {
cprintf("%d Transmit script now\n", SEND_LISTING);
- script_content = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0);
+ script_content = CtdlReadMessageBody(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
msiv_putscript(&u, script_name, script_content);
changes_made = 1;
}
* The VRFY and EXPN commands have been removed from this implementation
* because nobody uses these commands anymore, except for spammers.
*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2013 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
/* If this config option is set, reject connections from problem
* addresses immediately instead of after they execute a RCPT
*/
- if ( (CtdlGetConfigInt("c_rbl_at_greeting")) && (sSMTP->is_msa == 0) ) {
+ if ( (config.c_rbl_at_greeting) && (sSMTP->is_msa == 0) ) {
if (rbl_check(message_to_spammer)) {
if (server_shutting_down)
cprintf("421 %s\r\n", message_to_spammer);
/* Note: the FQDN *must* appear as the first thing after the 220 code.
* Some clients (including citmail.c) depend on it being there.
*/
- cprintf("220 %s ESMTP Citadel server ready.\r\n", CtdlGetConfigStr("c_fqdn"));
+ cprintf("220 %s ESMTP Citadel server ready.\r\n", config.c_fqdn);
}
cprintf("250-Greetings and joyous salutations.\r\n");
}
cprintf("250-HELP\r\n");
- cprintf("250-SIZE %ld\r\n", CtdlGetConfigLong("c_maxmsglen"));
+ cprintf("250-SIZE %ld\r\n", config.c_maxmsglen);
#ifdef HAVE_OPENSSL
/*
/* Otherwise, make sure outsiders aren't trying to forge mail from
* this system (unless, of course, c_allow_spoofing is enabled)
*/
- else if (CtdlGetConfigInt("c_allow_spoofing") == 0) {
+ else if (config.c_allow_spoofing == 0) {
process_rfc822_addr(ChrPtr(sSMTP->from), user, node, name);
syslog(LOG_DEBUG, "Claimed envelope sender is '%s' == '%s' @ '%s' ('%s')",
ChrPtr(sSMTP->from), user, node, name
/* RBL check */
if ( (!CCC->logged_in) /* Don't RBL authenticated users */
&& (!sSMTP->is_lmtp) ) { /* Don't RBL LMTP clients */
- if (CtdlGetConfigInt("c_rbl_at_greeting") == 0) { /* Don't RBL again if we already did it */
+ if (config.c_rbl_at_greeting == 0) { /* Don't RBL again if we already did it */
if (rbl_check(message_to_spammer)) {
if (server_shutting_down)
cprintf("421 %s\r\n", message_to_spammer);
" by %s; %s\n",
ChrPtr(sSMTP->helo_node),
(long int) CCC->cs_UDSclientUID,
- CtdlGetConfigStr("c_fqdn"),
+ config.c_fqdn,
nowstamp);
}
else {
ChrPtr(sSMTP->helo_node),
CCC->cs_host,
CCC->cs_addr,
- CtdlGetConfigStr("c_fqdn"),
+ config.c_fqdn,
nowstamp);
}
}
- body = CtdlReadMessageBodyBuf(HKEY("."), CtdlGetConfigLong("c_maxmsglen"), defbody, 1, NULL);
+ body = CtdlReadMessageBodyBuf(HKEY("."), config.c_maxmsglen, defbody, 1, NULL);
FreeStrBuf(&defbody);
if (body == NULL) {
cprintf("550 Unable to save message: internal error.\r\n");
* to something ugly like "0000058008.Sent Items>" when the message
* is read with a Citadel client.
*/
- if ( (CCC->logged_in) && (CtdlGetConfigInt("c_rfc822_strict_from") != CFG_SMTP_FROM_NOFILTER) ) {
+ if ( (CCC->logged_in) && (config.c_rfc822_strict_from != CFG_SMTP_FROM_NOFILTER) ) {
int validemail = 0;
if (!CM_IsEmpty(msg, erFc822Addr) &&
- ((CtdlGetConfigInt("c_rfc822_strict_from") == CFG_SMTP_FROM_CORRECT) ||
- (CtdlGetConfigInt("c_rfc822_strict_from") == CFG_SMTP_FROM_REJECT) ) )
+ ((config.c_rfc822_strict_from == CFG_SMTP_FROM_CORRECT) ||
+ (config.c_rfc822_strict_from == CFG_SMTP_FROM_REJECT) ) )
{
if (!IsEmptyStr(CCC->cs_inet_email))
validemail = strcmp(CCC->cs_inet_email, msg->cm_fields[erFc822Addr]) == 0;
}
}
- if (!validemail && (CtdlGetConfigInt("c_rfc822_strict_from") == CFG_SMTP_FROM_REJECT)) {
+ if (!validemail && (config.c_rfc822_strict_from == CFG_SMTP_FROM_REJECT)) {
syslog(LOG_ERR, "invalid sender '%s' - rejecting this message", msg->cm_fields[erFc822Addr]);
cprintf("550 Invalid sender '%s' - rejecting this message.\r\n", msg->cm_fields[erFc822Addr]);
return;
}
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
- CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
CM_SetField(msg, eOriginalRoom, HKEY(MAILROOM));
if (sSMTP->preferred_sender_name != NULL)
CM_SetField(msg, eAuthor, SKEY(sSMTP->preferred_sender_name));
#endif
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_smtp_port"), /* SMTP MTA */
+ CtdlRegisterServiceHook(config.c_smtp_port, /* SMTP MTA */
NULL,
smtp_mta_greeting,
smtp_command_loop,
CitadelServiceSMTP_MTA);
#ifdef HAVE_OPENSSL
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_smtps_port"), /* SMTPS MTA */
+ CtdlRegisterServiceHook(config.c_smtps_port,
NULL,
smtps_greeting,
smtp_command_loop,
CitadelServiceSMTPS_MTA);
#endif
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_msa_port"), /* SMTP MSA */
+ CtdlRegisterServiceHook(config.c_msa_port, /* SMTP MSA */
NULL,
smtp_msa_greeting,
smtp_command_loop,
* The VRFY and EXPN commands have been removed from this implementation
* because nobody uses these commands anymore, except for spammers.
*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
+ *
+ * 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.
*
- * 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.
+ *
+ *
+ *
*/
#include "sysdep.h"
boundary = NewStrBufPlain(HKEY("=_Citadel_Multipart_"));
StrBufAppendPrintf(boundary,
"%s_%04x%04x",
- CtdlGetConfigStr("c_fqdn"),
+ config.c_fqdn,
getpid(),
++seq);
CM_SetField(bmsg, eOriginalRoom, HKEY(MAILROOM));
CM_SetField(bmsg, eAuthor, HKEY("Citadel"));
- CM_SetField(bmsg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(bmsg, eNodeName, CFG_KEY(c_nodename));
CM_SetField(bmsg, eMsgSubject, HKEY("Delivery Status Notification (Failure)"));
CM_SetAsFieldSB(bmsg, eMesageText, &BounceMB);
/* If not, post it in the Aide> room */
if (successful_bounce == 0) {
- CtdlSubmitMsg(bmsg, NULL, CtdlGetConfigStr("c_aideroom"), QP_EADDR);
+ CtdlSubmitMsg(bmsg, NULL, config.c_aideroom, QP_EADDR);
}
/* Free up the memory we used */
* RFC 2822 - Internet Message Format
* RFC 2920 - SMTP Service Extension for Command Pipelining
*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*/
#include "sysdep.h"
/* At this point we know we are talking to a real SMTP server */
/* Do a EHLO command. If it fails, try the HELO command. */
- StrBufPrintf(Msg->IO.SendBuf.Buf, "EHLO %s\r\n", CtdlGetConfigStr("c_fqdn"));
+ StrBufPrintf(Msg->IO.SendBuf.Buf,
+ "EHLO %s\r\n", config.c_fqdn);
SMTP_DBG_SEND();
return eReadMessage;
eNextState STMPC_send_HELO(SmtpOutMsg *Msg)
{
AsyncIO *IO = &Msg->IO;
- StrBufPrintf(Msg->IO.SendBuf.Buf, "HELO %s\r\n", CtdlGetConfigStr("c_fqdn"));
+ StrBufPrintf(Msg->IO.SendBuf.Buf,
+ "HELO %s\r\n", config.c_fqdn);
SMTP_DBG_SEND();
return eReadMessage;
* The VRFY and EXPN commands have been removed from this implementation
* because nobody uses these commands anymore, except for spammers.
*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2012 by the citadel.org team
*
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3.
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ *
*
- * 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.
+ * 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.
+ *
+ *
+ *
+ *
*/
#include "sysdep.h"
strcpy(bounceto, "");
boundary = NewStrBufPlain(HKEY("=_Citadel_Multipart_"));
- StrBufAppendPrintf(boundary, "%s_%04x%04x", CtdlGetConfigStr("c_fqdn"), getpid(), ++seq);
+ StrBufAppendPrintf(boundary,
+ "%s_%04x%04x",
+ config.c_fqdn,
+ getpid(),
+ ++seq);
lines = num_tokens(instr, '\n');
bmsg->cm_format_type = FMT_RFC822;
CM_SetField(bmsg, eAuthor, HKEY("Citadel"));
CM_SetField(bmsg, eOriginalRoom, HKEY(MAILROOM));
- CM_SetField(bmsg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(bmsg, eNodeName, CFG_KEY(c_nodename));
CM_SetField(bmsg, eMsgSubject, HKEY("Delivery Status Notification (Failure)"));
- StrBufAppendBufPlain(BounceMB, HKEY("Content-type: multipart/mixed; boundary=\""), 0);
+ StrBufAppendBufPlain(
+ BounceMB,
+ HKEY("Content-type: multipart/mixed; boundary=\""), 0);
StrBufAppendBuf(BounceMB, boundary, 0);
StrBufAppendBufPlain(BounceMB, HKEY("\"\r\n"), 0);
StrBufAppendBufPlain(BounceMB, HKEY("MIME-Version: 1.0\r\n"), 0);
/* If not, post it in the Aide> room */
if (successful_bounce == 0) {
- CtdlSubmitMsg(bmsg, NULL, CtdlGetConfigStr("c_aideroom"), QP_EADDR);
+ CtdlSubmitMsg(bmsg, NULL, config.c_aideroom, QP_EADDR);
}
/* Free up the memory we used */
* http://www.spamassassin.org (the SpamAssassin project is not in any way
* affiliated with the Citadel project).
*
- * Copyright (c) 1998-2015 by the citadel.org team
+ * Copyright (c) 1998-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
+ *
+ *
*
* 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.
+ *
+ *
+ *
+ *
*/
#define SPAMASSASSIN_PORT "783"
goto bail;
}
syslog(LOG_DEBUG, "<%s\n", buf);
- syslog(LOG_DEBUG, "c_spam_flag_only setting %d\n", CtdlGetConfigInt("c_spam_flag_only"));
- if (CtdlGetConfigInt("c_spam_flag_only")) {
+ syslog(LOG_DEBUG, "c_spam_flag_only setting %d\n", config.c_spam_flag_only);
+ if (config.c_spam_flag_only) {
int headerlen;
char *cur;
char sastatus[10];
/*
* Transparently handle the upgrading of server data formats.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2014 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 3.
if (fp) {
if (fgets(buf, sizeof buf, fp) && (strlen(buf) > 2)) {
buf[strlen(buf)-1] = 0;
- CtdlSetConfigStr("c_default_cal_zone", buf);
- syslog(LOG_INFO, "Configuring timezone: %s", buf);
+ safestrncpy(config.c_default_cal_zone, buf, sizeof config.c_default_cal_zone);
+ syslog(LOG_INFO, "Configuring timezone: %s", config.c_default_cal_zone);
}
fclose(fp);
}
* Note that if the previous version was 0 then this is a new installation running for the first time.
*/
void update_config(void) {
+ get_config();
- int oldver = CitControl.MM_hosted_upgrade_level;
-
- if (oldver < 606) {
- CtdlSetConfigInt("c_rfc822_strict_from", 0);
+ if (CitControl.version < 606) {
+ config.c_rfc822_strict_from = 0;
}
- if (oldver < 609) {
- CtdlSetConfigInt("c_purge_hour", 3);
+ if (CitControl.version < 609) {
+ config.c_purge_hour = 3;
}
- if (oldver < 615) {
- CtdlSetConfigInt("c_ldap_port", 389);
+ if (CitControl.version < 615) {
+ config.c_ldap_port = 389;
}
- if (oldver < 623) {
- CtdlSetConfigStr("c_ip_addr", "*");
+ if (CitControl.version < 623) {
+ strcpy(config.c_ip_addr, "*");
}
- if (oldver < 650) {
- CtdlSetConfigInt("c_enable_fulltext", 1);
+ if (CitControl.version < 650) {
+ config.c_enable_fulltext = 1;
}
- if (oldver < 652) {
- CtdlSetConfigInt("c_auto_cull", 1);
+ if (CitControl.version < 652) {
+ config.c_auto_cull = 1;
}
- if (oldver < 725) {
- CtdlSetConfigInt("c_xmpp_c2s_port", 5222);
- CtdlSetConfigInt("c_xmpp_s2s_port", 5269);
+ if (CitControl.version < 725) {
+ config.c_xmpp_c2s_port = 5222;
+ config.c_xmpp_s2s_port = 5269;
}
- if (oldver < 830) {
- CtdlSetConfigInt("c_nntp_port", 119);
- CtdlSetConfigInt("c_nntps_port", 563);
+ if (CitControl.version < 830) {
+ config.c_nntp_port = 119;
+ config.c_nntps_port = 563;
}
- if (IsEmptyStr(CtdlGetConfigStr("c_default_cal_zone"))) {
+ if (IsEmptyStr(config.c_default_cal_zone)) {
guess_time_zone();
}
+
+ put_config();
}
get_control();
syslog(LOG_INFO, "Existing database version on disk is %d.%02d",
- (CitControl.MM_hosted_upgrade_level / 100),
- (CitControl.MM_hosted_upgrade_level % 100)
+ (CitControl.version / 100),
+ (CitControl.version % 100)
);
- if (CitControl.MM_hosted_upgrade_level < REV_LEVEL) {
+ if (CitControl.version < REV_LEVEL) {
syslog(LOG_WARNING,
"Server hosted updates need to be processed at this time. Please wait..."
);
update_config();
- if ((CitControl.MM_hosted_upgrade_level > 000) && (CitControl.MM_hosted_upgrade_level < 555)) {
+ if ((CitControl.version > 000) && (CitControl.version < 555)) {
syslog(LOG_EMERG, "This database is too old to be upgraded. Citadel server will exit.");
exit(EXIT_FAILURE);
}
- if ((CitControl.MM_hosted_upgrade_level > 000) && (CitControl.MM_hosted_upgrade_level < 591)) {
+ if ((CitControl.version > 000) && (CitControl.version < 591)) {
bump_mailbox_generation_numbers();
}
- if ((CitControl.MM_hosted_upgrade_level > 000) && (CitControl.MM_hosted_upgrade_level < 608)) {
+ if ((CitControl.version > 000) && (CitControl.version < 608)) {
convert_ctdluid_to_minusone();
}
- if ((CitControl.MM_hosted_upgrade_level > 000) && (CitControl.MM_hosted_upgrade_level < 659)) {
+ if ((CitControl.version > 000) && (CitControl.version < 659)) {
rebuild_euid_index();
}
- if (CitControl.MM_hosted_upgrade_level < 735) {
+ if (CitControl.version < 735) {
fix_sys_user_name();
}
- if (CitControl.MM_hosted_upgrade_level < 736) {
+ if (CitControl.version < 736) {
rebuild_usersbynumber();
}
- if (CitControl.MM_hosted_upgrade_level < 790) {
+ if (CitControl.version < 790) {
remove_thread_users();
}
- if (CitControl.MM_hosted_upgrade_level < 810) {
+ if (CitControl.version < 810) {
struct ctdlroom QRoom;
if (!CtdlGetRoom(&QRoom, SMTP_SPOOLOUT_ROOM)) {
QRoom.QRdefaultview = VIEW_QUEUE;
}
}
- CitControl.MM_hosted_upgrade_level = REV_LEVEL;
+ CitControl.version = REV_LEVEL;
/*
* Negative values for maxsessions are not allowed.
*/
- if (CtdlGetConfigInt("c_maxsessions") < 0) {
- CtdlSetConfigInt("c_maxsessions", 0);
+ if (config.c_maxsessions < 0) {
+ config.c_maxsessions = 0;
}
/* We need a system default message expiry policy, because this is
* the top level and there's no 'higher' policy to fall back on.
* By default, do not expire messages at all.
*/
- if (CtdlGetConfigInt("c_ep_mode") == 0) {
- CtdlSetConfigInt("c_ep_mode", EXPIRE_MANUAL);
- CtdlSetConfigInt("c_ep_value", 0);
+ if (config.c_ep.expire_mode == 0) {
+ config.c_ep.expire_mode = EXPIRE_MANUAL;
+ config.c_ep.expire_value = 0;
}
put_control();
* A server-side module for Citadel which supports address book information
* using the standard vCard format.
*
- * Copyright (c) 1999-2015 by the citadel.org team
+ * Copyright (c) 1999-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
/* If users cannot create their own accounts, they cannot re-register either. */
if ( (yes_my_citadel_config) &&
- (CtdlGetConfigInt("c_disable_newu")) &&
+ (config.c_disable_newu) &&
(CCC->user.axlevel < AxAideU) &&
(CCC->vcard_updated_by_ldap==0) )
{
/* Insert or replace RFC2739-compliant free/busy URL */
if (yes_my_citadel_config) {
sprintf(buf, "http://%s/%s.vfb",
- CtdlGetConfigStr("c_fqdn"),
+ config.c_fqdn,
usbuf.fullname);
for (i=0; buf[i]; ++i) {
if (buf[i] == ' ') buf[i] = '_';
}
/* If users cannot create their own accounts, they cannot re-register either. */
- if ( (CtdlGetConfigInt("c_disable_newu")) && (CCC->user.axlevel < AxAideU) ) {
+ if ( (config.c_disable_newu) && (CCC->user.axlevel < AxAideU) ) {
cprintf("%d Self-service registration is not allowed here.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
}
#ifdef HAVE_GETPWUID_R
/* If using host auth mode, we add an email address based on the login */
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
+ if (config.c_auth_mode == AUTHMODE_HOST) {
struct passwd pwd;
char pwd_buffer[SIZ];
syslog(LOG_DEBUG, "Searching for uid %d", usbuf->uid);
if (getpwuid_r(usbuf->uid, &pwd, pwd_buffer, sizeof pwd_buffer, &result) == 0) {
#endif // HAVE_GETPWUID_R
- snprintf(buf, sizeof buf, "%s@%s", pwd.pw_name, CtdlGetConfigStr("c_fqdn"));
+ snprintf(buf, sizeof buf, "%s@%s", pwd.pw_name, config.c_fqdn);
vcard_add_prop(v, "email;internet", buf);
need_default_vcard=0;
}
* Is this an LDAP session? If so, copy various LDAP attributes from the directory entry
* into the user's vCard.
*/
- if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
+ if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
//uid_t ldap_uid;
int found_user;
char ldap_cn[512];
#endif
if (need_default_vcard!=0) {
/* Everyone gets an email address based on their display name */
- snprintf(buf, sizeof buf, "%s@%s", usbuf->fullname, CtdlGetConfigStr("c_fqdn"));
+ snprintf(buf, sizeof buf, "%s@%s", usbuf->fullname, config.c_fqdn);
for (i=0; buf[i]; ++i) {
if (buf[i] == ' ') buf[i] = '_';
}
msg->cm_format_type = 0;
CM_SetField(msg, eAuthor, usbuf->fullname, strlen(usbuf->fullname));
CM_SetField(msg, eOriginalRoom, HKEY(ADDRESS_BOOK_ROOM));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
CM_SetField(msg, eMesageText, HKEY("Purge this vCard\n"));
len = snprintf(buf, sizeof buf, VCARD_EXT_FORMAT,
* Is this an LDAP session? If so, copy various LDAP attributes from the directory entry
* into the user's vCard.
*/
- if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
+ if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
v = vcard_get_user(&CCC->user);
if (v) {
if (Ctdl_LDAP_to_vCard(CCC->ldap_dn, v)) {
}
/* for postfix tcpdict */
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_pftcpdict_port"), /* Postfix */
+ CtdlRegisterServiceHook(config.c_pftcpdict_port, /* Postfix */
NULL,
check_get_greeting,
check_get,
/*
* Server-side module for Wiki rooms. This handles things like version control.
*
- * Copyright (c) 2009-2015 by the citadel.org team
+ * Copyright (c) 2009-2012 by the citadel.org team
*
* This program is open source software. You can redistribute it and/or
* modify it under the terms of the GNU General Public License, version 3.
uuid,
Now,
CCC->user.fullname,
- CtdlGetConfigStr("c_nodename"));
+ config.c_nodename);
memolen = CtdlEncodeBase64(encoded_memo, memo, memolen, 0);
CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
CM_SetField(msg, erFc822Addr, CCC->cs_inet_email, strlen(CCC->cs_inet_email));
CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
CM_SetField(msg, eExclusiveID, pagename, strlen(pagename));
msgnum = CtdlSubmitMsg(msg, NULL, "", 0); /* Replace the current revision */
}
CTDL_MODULE_INIT(xmpp)
{
if (!threading) {
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_xmpp_c2s_port"),
+ CtdlRegisterServiceHook(config.c_xmpp_c2s_port,
NULL,
xmpp_greeting,
xmpp_command_loop,
);
cprintf("<query xmlns=\"jabber:iq:roster\">");
cprintf("<item jid=\"%s\" subscription=\"remove\">", xmlesc(xmlbuf1, presence_jid, sizeof xmlbuf1));
- cprintf("<group>%s</group>", xmlesc(xmlbuf1, CtdlGetConfigStr("c_humannode"), sizeof xmlbuf1));
+ cprintf("<group>%s</group>", xmlesc(xmlbuf1, config.c_humannode, sizeof xmlbuf1));
cprintf("</item>");
cprintf("</query>"
"</iq>"
xmlesc(xmlbuf1, cptr->cs_inet_email, sizeof xmlbuf1),
xmlesc(xmlbuf2, cptr->user.fullname, sizeof xmlbuf2)
);
- cprintf("<group>%s</group>", xmlesc(xmlbuf1, CtdlGetConfigStr("c_humannode"), sizeof xmlbuf1));
+ cprintf("<group>%s</group>", xmlesc(xmlbuf1, config.c_humannode, sizeof xmlbuf1));
cprintf("</item>");
}
/*
* Implements the message store.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
#include "ctdl_module.h"
#include "citserver.h"
#include "control.h"
-#include "config.h"
#include "clientsocket.h"
#include "genstamp.h"
#include "room_ops.h"
if (haschar(mptr, '@') == 0)
{
sanitize_truncated_recipient(mptr);
- cprintf("To: %s@%s", mptr, CtdlGetConfigStr("c_fqdn"));
+ cprintf("To: %s@%s", mptr, config.c_fqdn);
cprintf("%s", nl);
}
else
strcpy(suser, "");
strcpy(luser, "");
strcpy(fuser, "");
- memcpy(snode, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")) + 1);
+ memcpy(snode, CFG_KEY(c_nodename) + 1);
if (mode == MT_RFC822)
OutputRFC822MsgHeaders(
TheMessage,
msgidbuflen = snprintf(msgidbuf, sizeof msgidbuf, "%08lX-%08lX@%s",
(long unsigned int) time(NULL),
(long unsigned int) newmsgid,
- CtdlGetConfigStr("c_fqdn")
+ config.c_fqdn
);
/* Generate an ID if we don't have one already */
if (TWITDETECT) {
if (CCC->user.axlevel == AxProbU) {
strcpy(hold_rm, actual_rm);
- strcpy(actual_rm, CtdlGetConfigStr("c_twitroom"));
+ strcpy(actual_rm, config.c_twitroom);
MSGM_syslog(LOG_DEBUG, "Diverting to twit room\n");
}
}
if ((!CCC->internal_pgm) || (recps == NULL)) {
if (CtdlSaveMsgPointerInRoom(actual_rm, newmsgid, 1, msg) != 0) {
MSGM_syslog(LOG_ERR, "ERROR saving message pointer!\n");
- CtdlSaveMsgPointerInRoom(CtdlGetConfigStr("c_aideroom"), newmsgid, 0, msg);
+ CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0, msg);
}
}
{
if (CCC->logged_in)
snprintf(bounce_to, sizeof bounce_to, "%s@%s",
- CCC->user.fullname, CtdlGetConfigStr("c_nodename"));
+ CCC->user.fullname, config.c_nodename);
else
snprintf(bounce_to, sizeof bounce_to, "%s@%s",
msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
}
else {
MSG_syslog(LOG_DEBUG, "No user <%s>\n", recipient);
- CtdlSaveMsgPointerInRoom(CtdlGetConfigStr("c_aideroom"), newmsgid, 0, msg);
+ CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0, msg);
}
}
recps->recp_local = pch;
}
else {
if (recps == NULL) {
- qualified_for_journaling = CtdlGetConfigInt("c_journal_pubmsgs");
+ qualified_for_journaling = config.c_journal_pubmsgs;
}
else if (recps->num_local + recps->num_ignet + recps->num_internet > 0) {
- qualified_for_journaling = CtdlGetConfigInt("c_journal_email");
+ qualified_for_journaling = config.c_journal_email;
}
else {
- qualified_for_journaling = CtdlGetConfigInt("c_journal_pubmsgs");
+ qualified_for_journaling = config.c_journal_pubmsgs;
}
}
if (fromaddr != NULL) CM_SetField(msg, erFc822Addr, fromaddr, strlen(fromaddr));
if (room != NULL) CM_SetField(msg, eOriginalRoom, room, strlen(room));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
if (to != NULL) {
CM_SetField(msg, eRecipient, to, strlen(to));
recp = validate_recipients(to, NULL, 0);
CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname));
}
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
- CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
if (rcplen > 0) {
CM_SetField(msg, eRecipient, recipient, rcplen);
}
else {
StrBuf *MsgBody;
- MsgBody = CtdlReadMessageBodyBuf(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0);
+ MsgBody = CtdlReadMessageBodyBuf(HKEY("000"), config.c_maxmsglen, NULL, 0, 0);
if (MsgBody != NULL) {
CM_SetAsFieldSB(msg, eMesageText, &MsgBody);
}
msg->cm_format_type = 4;
CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname));
CM_SetField(msg, eOriginalRoom, req_room, strlen(req_room));
- CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
- CM_SetField(msg, eHumanNode, CtdlGetConfigStr("c_humannode"), strlen(CtdlGetConfigStr("c_humannode")));
+ CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
+ CM_SetField(msg, eHumanNode, CFG_KEY(c_humannode));
msg->cm_flags = flags;
CM_SetAsFieldSB(msg, eMesageText, &encoded_message);
else {
OutBuffer = NewStrBuf();
CfgIt = GetNewHashPos(CfgTypeHash, 1);
- fchown(TmpFD, ctdluid, 0);
+ fchown(TmpFD, config.c_ctdluid, 0);
for (eCfg = subpending; eCfg < maxRoomNetCfg; eCfg ++)
{
const CfgLineType *pCfg;
-/* A Bison parser, made by GNU Bison 3.0.2. */
+/* A Bison parser, made by GNU Bison 2.5. */
/* Bison implementation for Yacc-like parsers in C
-
- Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-
+
+ Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+
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, see <http://www.gnu.org/licenses/>. */
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
#define YYBISON 1
/* Bison version. */
-#define YYBISON_VERSION "3.0.2"
+#define YYBISON_VERSION "2.5"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
/* Pull parsers. */
#define YYPULL 1
+/* Using locations. */
+#define YYLSP_NEEDED 0
/* Copy the first part of user declarations. */
-#line 1 "parsedate.y" /* yacc.c:339 */
+
+/* Line 268 of yacc.c */
+#line 1 "parsedate.y"
/* $Revision$
**
static void date_error(char *);
-#line 179 "y.tab.c" /* yacc.c:339 */
-# ifndef YY_NULLPTR
-# if defined __cplusplus && 201103L <= __cplusplus
-# define YY_NULLPTR nullptr
-# else
-# define YY_NULLPTR 0
-# endif
-# endif
+/* Line 268 of yacc.c */
+#line 185 "y.tab.c"
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
/* Enabling verbose error messages. */
#ifdef YYERROR_VERBOSE
# define YYERROR_VERBOSE 0
#endif
-
-/* Debug traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int yydebug;
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
#endif
-/* Token type. */
+
+/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
- enum yytokentype
- {
- tDAY = 258,
- tDAYZONE = 259,
- tMERIDIAN = 260,
- tMONTH = 261,
- tMONTH_UNIT = 262,
- tSEC_UNIT = 263,
- tSNUMBER = 264,
- tUNUMBER = 265,
- tZONE = 266
- };
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tDAY = 258,
+ tDAYZONE = 259,
+ tMERIDIAN = 260,
+ tMONTH = 261,
+ tMONTH_UNIT = 262,
+ tSEC_UNIT = 263,
+ tSNUMBER = 264,
+ tUNUMBER = 265,
+ tZONE = 266
+ };
#endif
/* Tokens. */
#define tDAY 258
#define tUNUMBER 265
#define tZONE 266
-/* Value type. */
+
+
+
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE YYSTYPE;
-union YYSTYPE
+typedef union YYSTYPE
{
-#line 114 "parsedate.y" /* yacc.c:355 */
+
+/* Line 293 of yacc.c */
+#line 114 "parsedate.y"
time_t Number;
enum _MERIDIAN Meridian;
-#line 243 "y.tab.c" /* yacc.c:355 */
-};
+
+
+/* Line 293 of yacc.c */
+#line 250 "y.tab.c"
+} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif
-extern YYSTYPE yylval;
-
-int yyparse (void);
-
-
-
/* Copy the second part of user declarations. */
-#line 258 "y.tab.c" /* yacc.c:358 */
+
+/* Line 343 of yacc.c */
+#line 262 "y.tab.c"
#ifdef short
# undef short
#ifdef YYTYPE_INT8
typedef YYTYPE_INT8 yytype_int8;
-#else
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
#endif
#ifdef YYTYPE_UINT16
# define YYSIZE_T __SIZE_TYPE__
# elif defined size_t
# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
# define YYSIZE_T size_t
# else
# if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS
# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
# endif
# endif
# ifndef YY_
-# define YY_(Msgid) Msgid
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE
-# if (defined __GNUC__ \
- && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
- || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
-# else
-# define YY_ATTRIBUTE(Spec) /* empty */
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE_PURE
-# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
-#endif
-
-#ifndef YY_ATTRIBUTE_UNUSED
-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
-#endif
-
-#if !defined _Noreturn \
- && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-# define _Noreturn __declspec (noreturn)
-# else
-# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+# define YY_(msgid) msgid
# endif
#endif
/* Suppress unused-variable warnings by "using" E. */
#if ! defined lint || defined __GNUC__
-# define YYUSE(E) ((void) (E))
+# define YYUSE(e) ((void) (e))
#else
-# define YYUSE(E) /* empty */
+# define YYUSE(e) /* empty */
#endif
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
-/* Suppress an incorrect diagnostic about yylval being uninitialized. */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
- _Pragma ("GCC diagnostic push") \
- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
- _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
- _Pragma ("GCC diagnostic pop")
+/* Identity function, used to suppress warnings about constant conditions. */
+#ifndef lint
+# define YYID(n) (n)
#else
-# define YY_INITIAL_VALUE(Value) Value
-#endif
-#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+ int yyi;
#endif
-#ifndef YY_INITIAL_VALUE
-# define YY_INITIAL_VALUE(Value) /* Nothing. */
+{
+ return yyi;
+}
#endif
-
#if ! defined yyoverflow || YYERROR_VERBOSE
/* The parser invokes alloca or malloc; define the necessary symbols. */
# define alloca _alloca
# else
# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
- /* Use EXIT_SUCCESS as a witness for stdlib.h. */
# ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
# endif
# endif
# ifdef YYSTACK_ALLOC
- /* Pacify GCC's 'empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
# ifndef YYSTACK_ALLOC_MAXIMUM
/* The OS might guarantee only one guard page at the bottom of the stack,
and a page size can be as small as 4096 bytes. So we cannot safely
# endif
# if (defined __cplusplus && ! defined EXIT_SUCCESS \
&& ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
+ && (defined YYFREE || defined free)))
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
# ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
# endif
# ifndef YYMALLOC
# define YYMALLOC malloc
-# if ! defined malloc && ! defined EXIT_SUCCESS
+# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
# endif
# endif
# ifndef YYFREE
# define YYFREE free
-# if ! defined free && ! defined EXIT_SUCCESS
+# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
void free (void *); /* INFRINGES ON USER NAME SPACE */
# endif
# endif
#if (! defined yyoverflow \
&& (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
/* A type that is properly aligned for any stack member. */
union yyalloc
elements in the stack, and YYPTR gives the new location of the
stack. Advance YYPTR to a properly aligned location for the next
stack. */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
- Stack = &yyptr->Stack_alloc; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (0)
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (YYID (0))
#endif
#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from SRC to DST. The source and destination do
+/* Copy COUNT objects from FROM to TO. The source and destination do
not overlap. */
# ifndef YYCOPY
# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(Dst, Src, Count) \
- __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
# else
-# define YYCOPY(Dst, Src, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (Dst)[yyi] = (Src)[yyi]; \
- } \
- while (0)
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (YYID (0))
# endif
# endif
#endif /* !YYCOPY_NEEDED */
#define YYNNTS 9
/* YYNRULES -- Number of rules. */
#define YYNRULES 30
-/* YYNSTATES -- Number of states. */
+/* YYNRULES -- Number of states. */
#define YYNSTATES 44
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
- by yylex, with out-of-bounds checking. */
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
#define YYMAXUTOK 266
-#define YYTRANSLATE(YYX) \
+#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
- as returned by yylex, without out-of-bounds checking. */
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
static const yytype_uint8 yytranslate[] =
{
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
};
#if YYDEBUG
- /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const yytype_uint8 yyprhs[] =
+{
+ 0, 0, 3, 4, 7, 9, 12, 14, 16, 19,
+ 24, 29, 36, 43, 45, 47, 50, 52, 54, 58,
+ 64, 67, 72, 75, 79, 85, 88, 91, 94, 97,
+ 98
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yytype_int8 yyrhs[] =
+{
+ 16, 0, -1, -1, 16, 17, -1, 18, -1, 18,
+ 19, -1, 21, -1, 22, -1, 10, 23, -1, 10,
+ 12, 10, 23, -1, 10, 12, 10, 20, -1, 10,
+ 12, 10, 12, 10, 23, -1, 10, 12, 10, 12,
+ 10, 20, -1, 11, -1, 4, -1, 11, 20, -1,
+ 20, -1, 9, -1, 10, 13, 10, -1, 10, 13,
+ 10, 13, 10, -1, 6, 10, -1, 6, 10, 14,
+ 10, -1, 10, 6, -1, 10, 6, 10, -1, 3,
+ 14, 10, 6, 10, -1, 9, 8, -1, 10, 8,
+ -1, 9, 7, -1, 10, 7, -1, -1, 5, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
0, 128, 128, 129, 132, 141, 145, 148, 153, 165,
};
#endif
-#if YYDEBUG || YYERROR_VERBOSE || 0
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
static const char *const yytname[] =
"$end", "error", "$undefined", "tDAY", "tDAYZONE", "tMERIDIAN",
"tMONTH", "tMONTH_UNIT", "tSEC_UNIT", "tSNUMBER", "tUNUMBER", "tZONE",
"':'", "'/'", "','", "$accept", "spec", "item", "time", "zone",
- "numzone", "date", "rel", "o_merid", YY_NULLPTR
+ "numzone", "date", "rel", "o_merid", 0
};
#endif
# ifdef YYPRINT
-/* YYTOKNUM[NUM] -- (External) token number corresponding to the
- (internal) symbol number NUM (which must be that of a token). */
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
static const yytype_uint16 yytoknum[] =
{
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
};
# endif
-#define YYPACT_NINF -29
-
-#define yypact_value_is_default(Yystate) \
- (!!((Yystate) == (-29)))
-
-#define YYTABLE_NINF -1
-
-#define yytable_value_is_error(Yytable_value) \
- 0
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 15, 16, 16, 17, 17, 17, 17, 18, 18,
+ 18, 18, 18, 19, 19, 19, 19, 20, 21, 21,
+ 21, 21, 21, 21, 21, 22, 22, 22, 22, 23,
+ 23
+};
- /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-static const yytype_int8 yypact[] =
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
{
- -29, 1, -29, -11, 11, 20, 12, -29, 4, -29,
- -29, 13, 16, -29, -29, -29, 21, -29, -29, 22,
- 23, -29, -29, -29, 5, -29, -29, 28, 25, -29,
- 17, 24, -29, 26, -29, 29, -29, -29, 30, -29,
- 0, -29, -29, -29
+ 0, 2, 0, 2, 1, 2, 1, 1, 2, 4,
+ 4, 6, 6, 1, 1, 2, 1, 1, 3, 5,
+ 2, 4, 2, 3, 5, 2, 2, 2, 2, 0,
+ 1
};
- /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
- Performed when YYTABLE does not specify something else to do. Zero
- means the default is an error. */
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
static const yytype_uint8 yydefact[] =
{
2, 0, 1, 0, 0, 0, 29, 3, 4, 6,
29, 19, 12, 11
};
- /* YYPGOTO[NTERM-NUM]. */
-static const yytype_int8 yypgoto[] =
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
{
- -29, -29, -29, -29, -29, -24, -29, -29, -28
+ -1, 1, 7, 8, 25, 26, 9, 10, 21
};
- /* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int8 yydefgoto[] =
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -29
+static const yytype_int8 yypact[] =
{
- -1, 1, 7, 8, 25, 26, 9, 10, 21
+ -29, 1, -29, -11, 11, 20, 12, -29, 4, -29,
+ -29, 13, 16, -29, -29, -29, 21, -29, -29, 22,
+ 23, -29, -29, -29, 5, -29, -29, 28, 25, -29,
+ 17, 24, -29, 26, -29, 29, -29, -29, 30, -29,
+ 0, -29, -29, -29
};
- /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule whose
- number is the opposite. If YYTABLE_NINF, syntax error. */
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -29, -29, -29, -29, -29, -24, -29, -29, -28
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
static const yytype_uint8 yytable[] =
{
32, 2, 37, 11, 3, 15, 36, 4, 22, 23,
41
};
+#define yypact_value_is_default(yystate) \
+ ((yystate) == (-29))
+
+#define yytable_value_is_error(yytable_value) \
+ YYID (0)
+
static const yytype_int8 yycheck[] =
{
24, 0, 30, 14, 3, 5, 30, 6, 4, 9,
10
};
- /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
0, 16, 0, 3, 6, 9, 10, 17, 18, 21,
10, 10, 20, 23
};
- /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 15, 16, 16, 17, 17, 17, 17, 18, 18,
- 18, 18, 18, 19, 19, 19, 19, 20, 21, 21,
- 21, 21, 21, 21, 21, 22, 22, 22, 22, 23,
- 23
-};
-
- /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 0, 2, 1, 2, 1, 1, 2, 4,
- 4, 6, 6, 1, 1, 2, 1, 1, 3, 5,
- 2, 4, 2, 3, 5, 2, 2, 2, 2, 0,
- 1
-};
-
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. However,
+ YYFAIL appears to be in use. Nevertheless, it is formally deprecated
+ in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+ discussed. */
+
+#define YYFAIL goto yyerrlab
+#if defined YYFAIL
+ /* This is here to suppress warnings from the GCC cpp's
+ -Wunused-macros. Normally we don't worry about that warning, but
+ some users do, and we want to make it easy for users to remove
+ YYFAIL uses, which will produce warnings from Bison 2.5. */
+#endif
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
+#define YYRECOVERING() (!!yyerrstatus)
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (1); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (YYID (0))
+
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (YYID (N)) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (YYID (0))
+#endif
-#define YYRECOVERING() (!!yyerrstatus)
+/* This macro is provided for backward compatibility. */
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- YYPOPSTACK (yylen); \
- yystate = *yyssp; \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (0)
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
-/* Error token number */
-#define YYTERROR 1
-#define YYERRCODE 256
+/* YYLEX -- calling `yylex' with the right arguments. */
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
/* Enable debugging if requested. */
#if YYDEBUG
# define YYFPRINTF fprintf
# endif
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (0)
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (YYID (0))
-/* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (YYID (0))
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (0)
-
-
-/*----------------------------------------.
-| Print this symbol's value on YYOUTPUT. |
-`----------------------------------------*/
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static void
yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+#endif
{
- FILE *yyo = yyoutput;
- YYUSE (yyo);
if (!yyvaluep)
return;
# ifdef YYPRINT
if (yytype < YYNTOKENS)
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+ YYUSE (yyoutput);
# endif
- YYUSE (yytype);
+ switch (yytype)
+ {
+ default:
+ break;
+ }
}
| Print this symbol on YYOUTPUT. |
`--------------------------------*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static void
yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+#endif
{
- YYFPRINTF (yyoutput, "%s %s (",
- yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
yy_symbol_value_print (yyoutput, yytype, yyvaluep);
YYFPRINTF (yyoutput, ")");
| TOP (included). |
`------------------------------------------------------------------*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static void
yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+ yytype_int16 *yybottom;
+ yytype_int16 *yytop;
+#endif
{
YYFPRINTF (stderr, "Stack now");
for (; yybottom <= yytop; yybottom++)
YYFPRINTF (stderr, "\n");
}
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (0)
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (YYID (0))
/*------------------------------------------------.
| Report that the YYRULE is going to be reduced. |
`------------------------------------------------*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static void
-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+ YYSTYPE *yyvsp;
+ int yyrule;
+#endif
{
- unsigned long int yylno = yyrline[yyrule];
int yynrhs = yyr2[yyrule];
int yyi;
+ unsigned long int yylno = yyrline[yyrule];
YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
+ yyrule - 1, yylno);
/* The symbols being reduced. */
for (yyi = 0; yyi < yynrhs; yyi++)
{
YYFPRINTF (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr,
- yystos[yyssp[yyi + 1 - yynrhs]],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ );
YYFPRINTF (stderr, "\n");
}
}
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyssp, yyvsp, Rule); \
-} while (0)
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
/* Nonzero means print parse trace. It is left uninitialized so that
multiple parsers can coexist. */
/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
+#ifndef YYINITDEPTH
# define YYINITDEPTH 200
#endif
# define yystrlen strlen
# else
/* Return the length of YYSTR. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static YYSIZE_T
yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+ const char *yystr;
+#endif
{
YYSIZE_T yylen;
for (yylen = 0; yystr[yylen]; yylen++)
# else
/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
YYDEST. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static char *
yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+#endif
{
char *yyd = yydest;
const char *yys = yysrc;
char const *yyp = yystr;
for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
do_not_strip_quotes: ;
}
yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
yytype_int16 *yyssp, int yytoken)
{
- YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
/* Internationalized format string. */
- const char *yyformat = YY_NULLPTR;
+ const char *yyformat = 0;
/* Arguments of yyformat. */
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
/* Number of reported tokens (one for the "unexpected", one per
int yycount = 0;
/* There are many possibilities here to consider:
+ - Assume YYFAIL is not used. It's too flawed to consider. See
+ <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+ for details. YYERROR is fine as it does not invoke this
+ function.
- If this state is a consistent state with a default action, then
the only way this function was invoked is if the default action
is an error action. In that case, don't check for expected
break;
}
yyarg[yycount++] = yytname[yyx];
- {
- YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
- if (! (yysize <= yysize1
- && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
- return 2;
- yysize = yysize1;
- }
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ if (! (yysize <= yysize1
+ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
}
}
}
# undef YYCASE_
}
- {
- YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
- if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
- return 2;
- yysize = yysize1;
- }
+ yysize1 = yysize + yystrlen (yyformat);
+ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
if (*yymsg_alloc < yysize)
{
| Release the memory associated to this symbol. |
`-----------------------------------------------*/
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
static void
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+ const char *yymsg;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
{
YYUSE (yyvaluep);
+
if (!yymsg)
yymsg = "Deleting";
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- YYUSE (yytype);
- YY_IGNORE_MAYBE_UNINITIALIZED_END
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
}
+/* Prevent warnings from -Wmissing-prototypes. */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
/* The lookahead symbol. */
/* The semantic value of the lookahead symbol. */
YYSTYPE yylval;
+
/* Number of syntax errors so far. */
int yynerrs;
| yyparse. |
`----------*/
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
int
yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
{
int yystate;
/* Number of tokens to shift before error messages enabled. */
int yyerrstatus;
/* The stacks and their tools:
- 'yyss': related to states.
- 'yyvs': related to semantic values.
+ `yyss': related to states.
+ `yyvs': related to semantic values.
- Refer to the stacks through separate pointers, to allow yyoverflow
+ Refer to the stacks thru separate pointers, to allow yyoverflow
to reallocate them elsewhere. */
/* The state stack. */
int yyn;
int yyresult;
/* Lookahead token as an internal (translated) token number. */
- int yytoken = 0;
+ int yytoken;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;
Keep to zero when no symbol should be popped. */
int yylen = 0;
- yyssp = yyss = yyssa;
- yyvsp = yyvs = yyvsa;
+ yytoken = 0;
+ yyss = yyssa;
+ yyvs = yyvsa;
yystacksize = YYINITDEPTH;
YYDPRINTF ((stderr, "Starting parse\n"));
yyerrstatus = 0;
yynerrs = 0;
yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+ yyssp = yyss;
+ yyvsp = yyvs;
+
goto yysetstate;
/*------------------------------------------------------------.
#ifdef yyoverflow
{
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
}
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
# else
/* Extend the stack our own way. */
if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
+ goto yyexhaustedlab;
yystacksize *= 2;
if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
+ yystacksize = YYMAXDEPTH;
{
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss_alloc, yyss);
- YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
}
# endif
#endif /* no yyoverflow */
yyvsp = yyvs + yysize - 1;
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
+ (unsigned long int) yystacksize));
if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
+ YYABORT;
}
YYDPRINTF ((stderr, "Entering state %d\n", yystate));
if (yychar == YYEMPTY)
{
YYDPRINTF ((stderr, "Reading a token: "));
- yychar = yylex ();
+ yychar = YYLEX;
}
if (yychar <= YYEOF)
yychar = YYEMPTY;
yystate = yyn;
- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
*++yyvsp = yylval;
- YY_IGNORE_MAYBE_UNINITIALIZED_END
goto yynewstate;
yylen = yyr2[yyn];
/* If YYLEN is nonzero, implement the default value of the action:
- '$$ = $1'.
+ `$$ = $1'.
Otherwise, the following line sets YYVAL to garbage.
This behavior is undocumented and Bison
switch (yyn)
{
case 4:
-#line 132 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 132 "parsedate.y"
{
yyHaveTime++;
#ifdef lint
}
#endif /* lint */
}
-#line 1364 "y.tab.c" /* yacc.c:1646 */
break;
case 5:
-#line 141 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 141 "parsedate.y"
{
yyHaveTime++;
- yyTimezone = (yyvsp[0].Number);
+ yyTimezone = (yyvsp[(2) - (2)].Number);
}
-#line 1373 "y.tab.c" /* yacc.c:1646 */
break;
case 6:
-#line 145 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 145 "parsedate.y"
{
yyHaveDate++;
}
-#line 1381 "y.tab.c" /* yacc.c:1646 */
break;
case 7:
-#line 148 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 148 "parsedate.y"
{
yyHaveRel = 1;
}
-#line 1389 "y.tab.c" /* yacc.c:1646 */
break;
case 8:
-#line 153 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 153 "parsedate.y"
{
- if ((yyvsp[-1].Number) < 100) {
- yyHour = (yyvsp[-1].Number);
+ if ((yyvsp[(1) - (2)].Number) < 100) {
+ yyHour = (yyvsp[(1) - (2)].Number);
yyMinutes = 0;
}
else {
- yyHour = (yyvsp[-1].Number) / 100;
- yyMinutes = (yyvsp[-1].Number) % 100;
+ yyHour = (yyvsp[(1) - (2)].Number) / 100;
+ yyMinutes = (yyvsp[(1) - (2)].Number) % 100;
}
yySeconds = 0;
- yyMeridian = (yyvsp[0].Meridian);
+ yyMeridian = (yyvsp[(2) - (2)].Meridian);
}
-#line 1406 "y.tab.c" /* yacc.c:1646 */
break;
case 9:
-#line 165 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 165 "parsedate.y"
{
- yyHour = (yyvsp[-3].Number);
- yyMinutes = (yyvsp[-1].Number);
+ yyHour = (yyvsp[(1) - (4)].Number);
+ yyMinutes = (yyvsp[(3) - (4)].Number);
yySeconds = 0;
- yyMeridian = (yyvsp[0].Meridian);
+ yyMeridian = (yyvsp[(4) - (4)].Meridian);
}
-#line 1417 "y.tab.c" /* yacc.c:1646 */
break;
case 10:
-#line 171 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 171 "parsedate.y"
{
- yyHour = (yyvsp[-3].Number);
- yyMinutes = (yyvsp[-1].Number);
- yyTimezone = (yyvsp[0].Number);
+ yyHour = (yyvsp[(1) - (4)].Number);
+ yyMinutes = (yyvsp[(3) - (4)].Number);
+ yyTimezone = (yyvsp[(4) - (4)].Number);
yyMeridian = MER24;
yyDSTmode = DSToff;
}
-#line 1429 "y.tab.c" /* yacc.c:1646 */
break;
case 11:
-#line 178 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 178 "parsedate.y"
{
- yyHour = (yyvsp[-5].Number);
- yyMinutes = (yyvsp[-3].Number);
- yySeconds = (yyvsp[-1].Number);
- yyMeridian = (yyvsp[0].Meridian);
+ yyHour = (yyvsp[(1) - (6)].Number);
+ yyMinutes = (yyvsp[(3) - (6)].Number);
+ yySeconds = (yyvsp[(5) - (6)].Number);
+ yyMeridian = (yyvsp[(6) - (6)].Meridian);
}
-#line 1440 "y.tab.c" /* yacc.c:1646 */
break;
case 12:
-#line 184 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 184 "parsedate.y"
{
- yyHour = (yyvsp[-5].Number);
- yyMinutes = (yyvsp[-3].Number);
- yySeconds = (yyvsp[-1].Number);
- yyTimezone = (yyvsp[0].Number);
+ yyHour = (yyvsp[(1) - (6)].Number);
+ yyMinutes = (yyvsp[(3) - (6)].Number);
+ yySeconds = (yyvsp[(5) - (6)].Number);
+ yyTimezone = (yyvsp[(6) - (6)].Number);
yyMeridian = MER24;
yyDSTmode = DSToff;
}
-#line 1453 "y.tab.c" /* yacc.c:1646 */
break;
case 13:
-#line 194 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 194 "parsedate.y"
{
- (yyval.Number) = (yyvsp[0].Number);
+ (yyval.Number) = (yyvsp[(1) - (1)].Number);
yyDSTmode = DSToff;
}
-#line 1462 "y.tab.c" /* yacc.c:1646 */
break;
case 14:
-#line 198 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 198 "parsedate.y"
{
- (yyval.Number) = (yyvsp[0].Number);
+ (yyval.Number) = (yyvsp[(1) - (1)].Number);
yyDSTmode = DSTon;
}
-#line 1471 "y.tab.c" /* yacc.c:1646 */
break;
case 15:
-#line 202 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 202 "parsedate.y"
{
/* Only allow "GMT+300" and "GMT-0800" */
- if ((yyvsp[-1].Number) != 0) {
+ if ((yyvsp[(1) - (2)].Number) != 0) {
YYABORT;
}
- (yyval.Number) = (yyvsp[0].Number);
+ (yyval.Number) = (yyvsp[(2) - (2)].Number);
yyDSTmode = DSToff;
}
-#line 1484 "y.tab.c" /* yacc.c:1646 */
break;
case 16:
-#line 210 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 210 "parsedate.y"
{
- (yyval.Number) = (yyvsp[0].Number);
+ (yyval.Number) = (yyvsp[(1) - (1)].Number);
yyDSTmode = DSToff;
}
-#line 1493 "y.tab.c" /* yacc.c:1646 */
break;
case 17:
-#line 216 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 216 "parsedate.y"
{
int i;
/* Unix and GMT and numeric timezones -- a little confusing. */
- if ((yyvsp[0].Number) < 0) {
+ if ((yyvsp[(1) - (1)].Number) < 0) {
/* Don't work with negative modulus. */
- (yyvsp[0].Number) = -(yyvsp[0].Number);
- if ((yyvsp[0].Number) > 9999 || (i = (yyvsp[0].Number) % 100) >= 60) {
+ (yyvsp[(1) - (1)].Number) = -(yyvsp[(1) - (1)].Number);
+ if ((yyvsp[(1) - (1)].Number) > 9999 || (i = (yyvsp[(1) - (1)].Number) % 100) >= 60) {
YYABORT;
}
- (yyval.Number) = ((yyvsp[0].Number) / 100) * 60 + i;
+ (yyval.Number) = ((yyvsp[(1) - (1)].Number) / 100) * 60 + i;
}
else {
- if ((yyvsp[0].Number) > 9999 || (i = (yyvsp[0].Number) % 100) >= 60) {
+ if ((yyvsp[(1) - (1)].Number) > 9999 || (i = (yyvsp[(1) - (1)].Number) % 100) >= 60) {
YYABORT;
}
- (yyval.Number) = -(((yyvsp[0].Number) / 100) * 60 + i);
+ (yyval.Number) = -(((yyvsp[(1) - (1)].Number) / 100) * 60 + i);
}
}
-#line 1517 "y.tab.c" /* yacc.c:1646 */
break;
case 18:
-#line 237 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 237 "parsedate.y"
{
- yyMonth = (yyvsp[-2].Number);
- yyDay = (yyvsp[0].Number);
+ yyMonth = (yyvsp[(1) - (3)].Number);
+ yyDay = (yyvsp[(3) - (3)].Number);
}
-#line 1526 "y.tab.c" /* yacc.c:1646 */
break;
case 19:
-#line 241 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 241 "parsedate.y"
{
- if ((yyvsp[-4].Number) > 100) {
- yyYear = (yyvsp[-4].Number);
- yyMonth = (yyvsp[-2].Number);
- yyDay = (yyvsp[0].Number);
+ if ((yyvsp[(1) - (5)].Number) > 100) {
+ yyYear = (yyvsp[(1) - (5)].Number);
+ yyMonth = (yyvsp[(3) - (5)].Number);
+ yyDay = (yyvsp[(5) - (5)].Number);
}
else {
- yyMonth = (yyvsp[-4].Number);
- yyDay = (yyvsp[-2].Number);
- yyYear = (yyvsp[0].Number);
+ yyMonth = (yyvsp[(1) - (5)].Number);
+ yyDay = (yyvsp[(3) - (5)].Number);
+ yyYear = (yyvsp[(5) - (5)].Number);
}
}
-#line 1543 "y.tab.c" /* yacc.c:1646 */
break;
case 20:
-#line 253 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 253 "parsedate.y"
{
- yyMonth = (yyvsp[-1].Number);
- yyDay = (yyvsp[0].Number);
+ yyMonth = (yyvsp[(1) - (2)].Number);
+ yyDay = (yyvsp[(2) - (2)].Number);
}
-#line 1552 "y.tab.c" /* yacc.c:1646 */
break;
case 21:
-#line 257 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 257 "parsedate.y"
{
- yyMonth = (yyvsp[-3].Number);
- yyDay = (yyvsp[-2].Number);
- yyYear = (yyvsp[0].Number);
+ yyMonth = (yyvsp[(1) - (4)].Number);
+ yyDay = (yyvsp[(2) - (4)].Number);
+ yyYear = (yyvsp[(4) - (4)].Number);
}
-#line 1562 "y.tab.c" /* yacc.c:1646 */
break;
case 22:
-#line 262 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 262 "parsedate.y"
{
- yyDay = (yyvsp[-1].Number);
- yyMonth = (yyvsp[0].Number);
+ yyDay = (yyvsp[(1) - (2)].Number);
+ yyMonth = (yyvsp[(2) - (2)].Number);
}
-#line 1571 "y.tab.c" /* yacc.c:1646 */
break;
case 23:
-#line 266 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 266 "parsedate.y"
{
- yyDay = (yyvsp[-2].Number);
- yyMonth = (yyvsp[-1].Number);
- yyYear = (yyvsp[0].Number);
+ yyDay = (yyvsp[(1) - (3)].Number);
+ yyMonth = (yyvsp[(2) - (3)].Number);
+ yyYear = (yyvsp[(3) - (3)].Number);
}
-#line 1581 "y.tab.c" /* yacc.c:1646 */
break;
case 24:
-#line 271 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 271 "parsedate.y"
{
- yyDay = (yyvsp[-2].Number);
- yyMonth = (yyvsp[-1].Number);
- yyYear = (yyvsp[0].Number);
+ yyDay = (yyvsp[(3) - (5)].Number);
+ yyMonth = (yyvsp[(4) - (5)].Number);
+ yyYear = (yyvsp[(5) - (5)].Number);
}
-#line 1591 "y.tab.c" /* yacc.c:1646 */
break;
case 25:
-#line 278 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 278 "parsedate.y"
{
- yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number);
+ yyRelSeconds += (yyvsp[(1) - (2)].Number) * (yyvsp[(2) - (2)].Number);
}
-#line 1599 "y.tab.c" /* yacc.c:1646 */
break;
case 26:
-#line 281 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 281 "parsedate.y"
{
- yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number);
+ yyRelSeconds += (yyvsp[(1) - (2)].Number) * (yyvsp[(2) - (2)].Number);
}
-#line 1607 "y.tab.c" /* yacc.c:1646 */
break;
case 27:
-#line 284 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 284 "parsedate.y"
{
- yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
+ yyRelMonth += (yyvsp[(1) - (2)].Number) * (yyvsp[(2) - (2)].Number);
}
-#line 1615 "y.tab.c" /* yacc.c:1646 */
break;
case 28:
-#line 287 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 287 "parsedate.y"
{
- yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
+ yyRelMonth += (yyvsp[(1) - (2)].Number) * (yyvsp[(2) - (2)].Number);
}
-#line 1623 "y.tab.c" /* yacc.c:1646 */
break;
case 29:
-#line 292 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 292 "parsedate.y"
{
(yyval.Meridian) = MER24;
}
-#line 1631 "y.tab.c" /* yacc.c:1646 */
break;
case 30:
-#line 295 "parsedate.y" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 295 "parsedate.y"
{
- (yyval.Meridian) = (yyvsp[0].Meridian);
+ (yyval.Meridian) = (yyvsp[(1) - (1)].Meridian);
}
-#line 1639 "y.tab.c" /* yacc.c:1646 */
break;
-#line 1643 "y.tab.c" /* yacc.c:1646 */
+
+/* Line 1806 of yacc.c */
+#line 1832 "y.tab.c"
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
*++yyvsp = yyval;
- /* Now 'shift' the result of the reduction. Determine what state
+ /* Now `shift' the result of the reduction. Determine what state
that goes to, based on the state we popped back to and the rule
number reduced by. */
goto yynewstate;
-/*--------------------------------------.
-| yyerrlab -- here on detecting error. |
-`--------------------------------------*/
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
yyerrlab:
/* Make sure we have latest lookahead translation. See comments at
user semantic actions for why this is necessary. */
if (yyerrstatus == 3)
{
/* If just tried and failed to reuse lookahead token after an
- error, discard it. */
+ error, discard it. */
if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
}
/* Else will try to reuse lookahead token after shifting the error
if (/*CONSTCOND*/ 0)
goto yyerrorlab;
- /* Do not reclaim the symbols of the rule whose action triggered
+ /* Do not reclaim the symbols of the rule which action triggered
this YYERROR. */
YYPOPSTACK (yylen);
yylen = 0;
| yyerrlab1 -- common code for both syntax error and YYERROR. |
`-------------------------------------------------------------*/
yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
for (;;)
{
yyn = yypact[yystate];
if (!yypact_value_is_default (yyn))
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
/* Pop the current state because it cannot handle the error token. */
if (yyssp == yyss)
- YYABORT;
+ YYABORT;
yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
+ yystos[yystate], yyvsp);
YYPOPSTACK (1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
}
- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
*++yyvsp = yylval;
- YY_IGNORE_MAYBE_UNINITIALIZED_END
/* Shift the error token. */
yyresult = 1;
goto yyreturn;
-#if !defined yyoverflow || YYERROR_VERBOSE
+#if !defined(yyoverflow) || YYERROR_VERBOSE
/*-------------------------------------------------.
| yyexhaustedlab -- memory exhaustion comes here. |
`-------------------------------------------------*/
yydestruct ("Cleanup: discarding lookahead",
yytoken, &yylval);
}
- /* Do not reclaim the symbols of the rule whose action triggered
+ /* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */
YYPOPSTACK (yylen);
YY_STACK_PRINT (yyss, yyssp);
while (yyssp != yyss)
{
yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
+ yystos[*yyssp], yyvsp);
YYPOPSTACK (1);
}
#ifndef yyoverflow
if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
#endif
- return yyresult;
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
}
-#line 300 "parsedate.y" /* yacc.c:1906 */
+
+
+
+/* Line 2067 of yacc.c */
+#line 300 "parsedate.y"
/* Month and day table. */
/* NOTREACHED */
}
#endif /* TEST */
+
/*
* Server functions which perform operations on room objects.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
int CtdlDoIHavePermissionToReadMessagesInThisRoom(void) {
if ( (!(CC->logged_in))
&& (!(CC->internal_pgm))
- && (!CtdlGetConfigInt("c_guest_logins"))
+ && (!config.c_guest_logins)
) {
return(om_not_logged_in);
}
is_me = 1;
}
- if ((is_me) && (CtdlGetConfigInt("c_guest_logins")) && (!CC->logged_in)) {
+ if ((is_me) && (config.c_guest_logins) && (!CC->logged_in)) {
is_guest = 1;
}
}
/* Force the properties of the Aide room */
- if (!strcasecmp(roombuf->QRname, CtdlGetConfigStr("c_aideroom"))) {
+ if (!strcasecmp(roombuf->QRname, config.c_aideroom)) {
if (userbuf->axlevel >= AxAideU) {
retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
} else {
/* Listing order of 0 is illegal except for base rooms */
if (qrbuf->QRorder == 0)
if (!(qrbuf->QRflags & QR_MAILBOX) &&
- strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)
+ strncasecmp(qrbuf->QRname, config.c_baseroom, ROOMNAMELEN)
&&
- strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN))
+ strncasecmp(qrbuf->QRname, config.c_aideroom, ROOMNAMELEN))
qrbuf->QRorder = 64;
}
/* Know the room ... but not if it's the page log room, or if the
* caller specified that we're only entering this room transiently.
*/
- if ((strcasecmp(CCC->room.QRname, CtdlGetConfigStr("c_logpages")))
+ if ((strcasecmp(CCC->room.QRname, config.c_logpages))
&& (transiently == 0) ) {
vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
vbuf.v_flags = vbuf.v_flags | V_ACCESS;
*/
void convert_room_name_macros(char *towhere, size_t maxlen) {
if (!strcasecmp(towhere, "_BASEROOM_")) {
- safestrncpy(towhere, CtdlGetConfigStr("c_baseroom"), maxlen);
+ safestrncpy(towhere, config.c_baseroom, maxlen);
}
else if (!strcasecmp(towhere, "_MAIL_")) {
safestrncpy(towhere, MAILROOM, maxlen);
safestrncpy(towhere, USERDRAFTROOM, maxlen);
}
else if (!strcasecmp(towhere, "_BITBUCKET_")) {
- safestrncpy(towhere, CtdlGetConfigStr("c_twitroom"), maxlen);
+ safestrncpy(towhere, config.c_twitroom, maxlen);
}
else if (!strcasecmp(towhere, "_CALENDAR_")) {
safestrncpy(towhere, USERCALENDARROOM, maxlen);
}
/* Reject change of floor for baseroom/aideroom */
- if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN) ||
- !strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) {
+ if (!strncasecmp(old_name, config.c_baseroom, ROOMNAMELEN) ||
+ !strncasecmp(old_name, config.c_aideroom, ROOMNAMELEN)) {
new_floor = 0;
}
begin_critical_section(S_CONFIG);
/* If baseroom/aideroom name changes, update config */
- if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
- CtdlSetConfigStr("c_baseroom", new_name);
+ if (!strncasecmp(old_name, config.c_baseroom, ROOMNAMELEN)) {
+ safestrncpy(config.c_baseroom, new_name, ROOMNAMELEN);
+ put_config();
}
- if (!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) {
- CtdlSetConfigStr("c_aideroom", new_name);
+ if (!strncasecmp(old_name, config.c_aideroom, ROOMNAMELEN)) {
+ safestrncpy(config.c_aideroom, new_name, ROOMNAMELEN);
+ put_config();
}
end_critical_section(S_CONFIG);
/*
- * Citadel Extension Loader
+ * Citadel Dynamic Loading Module
* Written by Brian Costello <btx@calyx.net>
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "serv_extensions.h"
#include "ctdl_module.h"
-#include "config.h"
int DebugModules = 0;
newfcn->ServiceName = ServiceName;
if (sockpath != NULL) {
- newfcn->msock = ctdl_uds_server(sockpath, CtdlGetConfigInt("c_maxsessions"), error);
+ newfcn->msock = ctdl_uds_server(sockpath, config.c_maxsessions, error);
snprintf(message, SIZ, "Unix domain socket '%s': ", sockpath);
}
else if (tcp_port <= 0) { /* port -1 to disable */
return;
}
else {
- newfcn->msock = ctdl_tcp_server(CtdlGetConfigStr("c_ip_addr"),
+ newfcn->msock = ctdl_tcp_server(config.c_ip_addr,
tcp_port,
- CtdlGetConfigInt("c_maxsessions"),
+ config.c_maxsessions,
error);
snprintf(message, SIZ, "TCP port %s:%d: (%s) ",
- CtdlGetConfigStr("c_ip_addr"), tcp_port, ServiceName);
+ config.c_ip_addr, tcp_port, ServiceName);
}
if (newfcn->msock > 0) {
-/*
- * Main declarations file for the Citadel server
- *
- * Copyright (c) 1987-2015 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 3.
- *
- * 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.
- */
-
#ifndef SERVER_H
#define SERVER_H
#define CTDLEXIT_DB 105 /* Unable to initialize database */
#define CTDLEXIT_LIBCITADEL 106 /* Incorrect version of libcitadel */
#define CTDL_EXIT_UNSUP_AUTH 107 /* Unsupported auth mode configured */
-#define CTDLEXIT_UNUSER 108 /* Could not determine uid to run as */
/*
* Reasons why a session would be terminated (set CC->kill_me to these values)
unsigned MMflags; /* Global system flags */
long MMnextuser; /* highest user number on system */
long MMnextroom; /* highest room number on system */
- int MM_hosted_upgrade_level; /* Server-hosted upgrade level */
- int MM_fulltext_wordbreaker; /* ID of wordbreaker in use */
+ int version; /* Server-hosted upgrade level */
+ int fulltext_wordbreaker; /* ID of wordbreaker in use */
long MMfulltext; /* highest message number indexed */
int MMdbversion; /* Version of Berkeley DB used on previous server run */
};
extern int ScheduledShutdown;
extern struct CitControl CitControl;
-extern uid_t ctdluid;
struct ExpressMessage {
struct ExpressMessage *next;
CDB_EUIDINDEX, /* locate msgs by EUID */
CDB_USERSBYNUMBER, /* index of users by number */
CDB_OPENID, /* associates OpenIDs with users */
- CDB_CONFIG, /* system configuration database */
MAXCDB /* total number of CDB's defined */
};
#include "user_ops.h"
#include "ecrash.h"
-uid_t ctdluid = 0;
const char *CitadelServiceUDS="citadel-UDS";
const char *CitadelServiceTCP="citadel-TCP";
+
+
+
void go_threading(void);
/*
char ctdldir[PATH_MAX]=CTDLDIR;
int syslog_facility = LOG_DAEMON;
const char *eDebuglist[] = {NULL, NULL};
- uid_t u = 0;
- struct passwd *p = NULL;
#ifdef HAVE_RUN_DIR
struct stat filestats;
#endif
InitializeMasterTSD();
/* parse command-line arguments */
- while ((a=getopt(argc, argv, "l:dh:x:t:B:Dru:")) != EOF) switch(a) {
+ while ((a=getopt(argc, argv, "l:dh:x:t:B:Dr")) != EOF) switch(a) {
case 'l':
safestrncpy(facility, optarg, sizeof(facility));
drop_root_perms = 0;
break;
- /* -u tells the server what uid to run under... */
- case 'u':
- u = atoi(optarg);
- if (u > 0) {
- ctdluid = u;
- }
- else {
- p = getpwnam(optarg);
- if (p) {
- u = p->pw_uid;
- }
- }
- if (u > 0) {
- ctdluid = u;
- }
- break;
-
default:
/* any other parameter makes it crash and burn */
fprintf(stderr, "citserver: usage: "
"citserver "
"[-l LogFacility] "
"[-d] [-D] [-r] "
- "[-u user] "
"[-h HomeDir]\n"
);
exit(1);
}
-
- /* Last ditch effort to determine the user name ... if there's a user called "citadel" then use that */
- if (ctdluid == 0) {
- p = getpwnam("citadel");
- if (!p) {
- p = getpwnam("bbs");
- }
- if (!p) {
- p = getpwnam("guest");
- }
- if (p) {
- u = p->pw_uid;
- }
- if (u > 0) {
- ctdluid = u;
- }
- }
-
- if ((ctdluid == 0) && (drop_root_perms == 0)) {
- fprintf(stderr, "citserver: cannot determine user to run as; please specify -r or -u options\n");
- exit(CTDLEXIT_UNUSER);
- }
-
StartLibCitadel(basesize);
openlog("citserver",
( running_as_daemon ? (LOG_PID) : (LOG_PID | LOG_PERROR) ),
syslog(LOG_DEBUG, "Called as: %s", argv[0]);
syslog(LOG_INFO, "%s", libcitadel_version_string());
+ /* Load site-specific configuration */
+ syslog(LOG_INFO, "Loading citadel.config");
+ get_config();
+
+ /* get_control() MUST MUST MUST be called BEFORE the databases are opened!! */
+ syslog(LOG_INFO, "Acquiring control record");
+ get_control();
+
+ put_config();
+
#ifdef HAVE_RUN_DIR
/* on some dists rundir gets purged on startup. so we need to recreate it. */
if (stat(ctdl_run_dir, &filestats)==-1){
#ifdef HAVE_GETPWUID_R
#ifdef SOLARIS_GETPWUID
- pwp = getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf));
+ pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf));
#else // SOLARIS_GETPWUID
- getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
+ getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
#endif // SOLARIS_GETPWUID
#else // HAVE_GETPWUID_R
pwp = NULL;
"unable to create run directory [%s]: %s",
ctdl_run_dir, strerror(errno));
- if (chown(ctdl_run_dir, ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0)
+ if (chown(ctdl_run_dir, config.c_ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0)
syslog(LOG_EMERG,
"unable to set the access rights for [%s]: %s",
ctdl_run_dir, strerror(errno));
/*
* Bind the server to our favorite TCP port (usually 504).
*/
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_port_number"),
+ CtdlRegisterServiceHook(config.c_port_number,
NULL,
citproto_begin_session,
do_command_loop,
/*
* If we need host auth, start our chkpwd daemon.
*/
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
+ if (config.c_auth_mode == AUTHMODE_HOST) {
start_chkpwd_daemon();
}
#ifdef HAVE_GETPWUID_R
#ifdef SOLARIS_GETPWUID
- pwp = getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf));
+ pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf));
#else // SOLARIS_GETPWUID
- getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
+ getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
#endif // SOLARIS_GETPWUID
#else // HAVE_GETPWUID_R
pwp = NULL;
* If we ever port to a different platform and either have multiple
* variants of this file or simply load it up with #ifdefs.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include <libcitadel.h>
#include "citserver.h"
-#include "config.h"
#include "ctdl_module.h"
#include "sysdep_decls.h"
*/
INLINE int client_read(char *buf, int bytes)
{
- return(client_read_to(buf, bytes, CtdlGetConfigInt("c_sleeping")));
+ return(client_read_to(buf, bytes, config.c_sleeping));
}
int CtdlClientGetLine(StrBuf *Target)
pthread_mutex_lock(&ThreadCountMutex);
--active_workers;
- if ((active_workers + CtdlGetConfigInt("c_min_workers") < num_workers) &&
- (num_workers > CtdlGetConfigInt("c_min_workers")))
+ if ((active_workers + config.c_min_workers < num_workers) &&
+ (num_workers > config.c_min_workers))
{
num_workers--;
pthread_mutex_unlock(&ThreadCountMutex);
/*
* Thread handling stuff for Citadel server
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2011 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "modules_init.h"
#include "serv_extensions.h"
#include "ctdl_module.h"
-#include "config.h"
#include "context.h"
#include "threads.h"
* they are all in use.
*/
while (!server_shutting_down) {
- if ((active_workers == num_workers) && (num_workers < CtdlGetConfigInt("c_max_workers"))) {
+ if ((active_workers == num_workers) && (num_workers < config.c_max_workers)) {
CtdlThreadCreate(worker_thread);
}
usleep(1000000);
#include "control.h"
#include "support.h"
#include "citserver.h"
-#include "config.h"
#include "citadel_ldap.h"
#include "ctdl_module.h"
#include "user_ops.h"
if (who->axlevel <= AxProbU) return(0);
/* Globally enabled? */
- if (CtdlGetConfigInt("c_restrict") == 0) return(1);
+ if (config.c_restrict == 0) return(1);
/* User flagged ok? */
if (who->flags & US_INTERNET) return(2);
return(-1);
}
- if ((required_level >= ac_logged_in_or_guest) && (CC->logged_in == 0) && (CtdlGetConfigInt("c_guest_logins") == 0)) {
+ if ((required_level >= ac_logged_in_or_guest) && (CC->logged_in == 0) && (!config.c_guest_logins)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
return(-1);
}
/* If a "master user" is defined, handle its authentication if specified */
CC->is_master = 0;
- if ( (strlen(CtdlGetConfigStr("c_master_user")) > 0) &&
- (strlen(CtdlGetConfigStr("c_master_pass")) > 0) &&
- (authname != NULL) &&
- (!strcasecmp(authname, CtdlGetConfigStr("c_master_user"))) )
+ if ((configlen.c_master_user > 0) &&
+ (configlen.c_master_pass > 0) &&
+ (authname != NULL) &&
+ (!strcasecmp(authname, config.c_master_user)))
{
CC->is_master = 1;
}
return login_not_found;
}
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
+ if (config.c_auth_mode == AUTHMODE_HOST) {
/* host auth mode */
}
#ifdef HAVE_LDAP
- else if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
+ else if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
/* LDAP auth mode */
/* If this user's name is the name of the system administrator
* (as specified in setup), automatically assign access level 6.
*/
- if (!strcasecmp(CCC->user.fullname, CtdlGetConfigStr("c_sysadm"))) {
+ if (!strcasecmp(CCC->user.fullname, config.c_sysadm)) {
CCC->user.axlevel = AxAideU;
}
/* If we're authenticating off the host system, automatically give
* root the highest level of access.
*/
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
+ if (config.c_auth_mode == AUTHMODE_HOST) {
if (CCC->user.uid == 0) {
CCC->user.axlevel = AxAideU;
}
* the vCard module's login hook runs.
*/
snprintf(CCC->cs_inet_email, sizeof CCC->cs_inet_email, "%s@%s",
- CCC->user.fullname, CtdlGetConfigStr("c_fqdn"));
+ CCC->user.fullname, config.c_fqdn);
convert_spaces_to_underscores(CCC->cs_inet_email);
/* Create any personal rooms required by the system.
PerformSessionHooks(EVT_LOGIN);
/* Enter the lobby */
- CtdlUserGoto(CtdlGetConfigStr("c_baseroom"), 0, 0, NULL, NULL, NULL, NULL);
+ CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL, NULL, NULL);
}
}
if (CCC->is_master) {
- code = strcmp(password, CtdlGetConfigStr("c_master_pass"));
+ code = strcmp(password, config.c_master_pass);
}
- else if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
+ else if (config.c_auth_mode == AUTHMODE_HOST) {
/* host auth mode */
}
#ifdef HAVE_LDAP
- else if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
+ else if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
/* LDAP auth mode */
usbuf->timescalled = 0;
usbuf->posted = 0;
- usbuf->axlevel = CtdlGetConfigInt("c_initax");
+ usbuf->axlevel = config.c_initax;
usbuf->lastcall = time(NULL);
/* fetch a new user number */
strproc(username);
- if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
+ if (config.c_auth_mode == AUTHMODE_HOST) {
/* host auth mode */
}
#ifdef HAVE_LDAP
- if ((CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP) || (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_LDAP_AD)) {
+ if ((config.c_auth_mode == AUTHMODE_LDAP) || (config.c_auth_mode == AUTHMODE_LDAP_AD)) {
if (CtdlTryUserLDAP(username, NULL, 0, username, sizeof username, &uid, 0) != 0) {
return(ERROR + NO_SUCH_USER);
}
visit vbuf;
/* On some systems, Admins are not allowed to forget rooms */
- if (is_aide() && (CtdlGetConfigInt("c_aide_zap") == 0)
+ if (is_aide() && (config.c_aide_zap == 0)
&& ((CC->room.QRflags & QR_MAILBOX) == 0) ) {
return(1);
}
CtdlPutUserLock(&CC->user);
/* Return to the Lobby, so we don't end up in an undefined room */
- CtdlUserGoto(CtdlGetConfigStr("c_baseroom"), 0, 0, NULL, NULL, NULL, NULL);
+ CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL, NULL, NULL);
return(0);
}
activity = _("Setting file permissions");
progress(activity, 0, 2);
+ //chown(file_citadel_config, config.c_ctdluid, gid);
progress(activity, 1, 2);
chmod(file_citadel_config, S_IRUSR | S_IWUSR);
progress(activity, 2, 2);