/* * $Source: /v/ossp/cvs/ossp-pkg/petidomo/Attic/config.c,v $ * $Revision: 1.1 $ * $Date: 2000/12/13 13:19:22 $ * * Copyright (C) 1996 by CyberSolutions GmbH. * All rights reserved. */ #include #include #include #include #include #include #include static struct PD_Config * MasterConfig; List ListConfigs; /* These variables need to be static/global, so that the addresses as used in MasterCF are known at compile time. */ static char * fqdn = NULL; static char * master_password = NULL; static char * mta = "/usr/sbin/sendmail"; static char * mta_options = "-f%s"; static bool detach = FALSE; static bool show_stats = TRUE; int InitPetidomo(void) { struct passwd * pwd; char * basedir = "/usr/local/petidomo"; int rc; /* Format description of our global config file. */ struct ConfigFile MasterCF[] = { { "Hostname", CF_STRING, &fqdn }, { "AdminPassword", CF_STRING, &master_password }, { "MTA", CF_STRING, &mta }, { "MTA_Options", CF_STRING, &mta_options }, { "DetachImmediately", CF_YES_NO, &detach }, { "ShowStatistics", CF_YES_NO, &show_stats }, { NULL, 0, NULL} }; /* Allocate memory for the global config structure. */ MasterConfig = calloc(sizeof(struct PD_Config), 1); if (MasterConfig == NULL) { syslog(LOG_ERR, "Failed to allocate %d byte of memory.", sizeof(struct PD_Config)); return -1; } /* Init the list of read list configs. */ ListConfigs = InitList(NULL); /* First of all, determine the home directory of the "petidomo" user. This will be our base directory for all operations. */ debug((DEBUG_CONFIG, 9, "Looking for the home directory of user petidomo.")); pwd = getpwnam("petidomo"); if (pwd != NULL) { debug((DEBUG_CONFIG, 8, "Home directory of petidomo is \"%s\".", pwd->pw_dir)); if (strcmp(basedir, pwd->pw_dir) != 0) basedir = xstrdup(pwd->pw_dir); /* Replace the default above. */ endpwent(); } else syslog(LOG_WARNING, "User \"petidomo\" not found."); debug((DEBUG_CONFIG, 8, "Will use basedir \"%s\".", basedir)); /* chdir() into the base directory. */ rc = chdir(basedir); if (rc != 0) { syslog(LOG_ERR, "Failed to change current directory to \"%s\": %m", basedir); return -1; } /* Parse the config file. */ rc = ReadConfig("etc/petidomo.conf", MasterCF); if (rc != 0) { syslog(LOG_ERR, "Failed to parse the master config file \"petidomo.conf\""); return -1; } /* Do consistency checks. */ if (fqdn == NULL) { syslog(LOG_ERR, "The master config file \"petidomo.conf\" doesn't set the host name."); return -1; } if (master_password == NULL) { syslog(LOG_ERR, "The master config file \"petidomo.conf\" doesn't set the admin password."); return -1; } if (strstr(mta_options, "%s") == NULL) { syslog(LOG_ERR, "The argument to MTA_Options in the master config file is invalid."); return -1; } /* Copy the results to the structure. */ MasterConfig->basedir = basedir; MasterConfig->fqdn = fqdn; MasterConfig->master_password = master_password; MasterConfig->mta = mta; MasterConfig->mta_options = mta_options; MasterConfig->detach = detach; MasterConfig->show_stats = show_stats; return 0; } const struct PD_Config * getMasterConfig(void) { return MasterConfig; } static char * list_fqdn = NULL; static char * admin_password = NULL; static char * posting_password = NULL; static char * listtype = NULL; static char * reply_to = NULL; static char * postingfilter = NULL; static char * archivepath = NULL; static bool allowpubsub = TRUE; static bool allowaliensub = TRUE; static bool allowmembers = FALSE; static bool showonindex = TRUE; const struct List_Config * getListConfig(const char * listname) { const struct PD_Config * MasterConfig; struct List_Config * ListConfig; Node node; int rc; char buffer[4096]; /* Format description of our global config file. */ struct ConfigFile ListCF[] = { { "ListType", CF_STRING, &listtype }, { "AllowPublicSubscription", CF_YES_NO, &allowpubsub }, { "AllowAlienSubscription", CF_YES_NO, &allowaliensub }, { "AllowMembersCommand", CF_YES_NO, &allowmembers }, { "ShowOnIndex", CF_YES_NO, &showonindex }, { "ReplyTo", CF_STRING, &reply_to }, { "Hostname", CF_STRING, &list_fqdn }, { "AdminPassword", CF_STRING, &admin_password }, { "PostingPassword", CF_STRING, &posting_password }, { "PostingFilter", CF_STRING, &postingfilter }, { "Archive", CF_STRING, &archivepath }, { NULL, 0, NULL} }; /* Get the master configuration. */ MasterConfig = getMasterConfig(); /* Did we read this config file already? */ node = FindNodeByKey(ListConfigs, listname); if (node != NULL) return getNodeData(node); /* No? Then read the config file. */ sprintf(buffer, "lists/%s/config", listname); debug((DEBUG_CONFIG, 6, "getListConfig(): Loading config file \"%s\".", buffer)); rc = ReadConfig(buffer, ListCF); if (rc != 0) { syslog(LOG_ERR, "Failed to parse the list \"%s\"'s config file.", listname); exit(1); } /* Do consistency checks. */ if (listtype == NULL) { syslog(LOG_ERR, "List \"%s\" doesn't have a valid type in config file.", listname); exit(1); } /* Set up the list config structure. */ ListConfig = calloc(sizeof(struct List_Config), 1); if (ListConfig == NULL) { syslog(LOG_ERR, "Failed to allocate %d byte of memory.", sizeof(struct List_Config)); exit(1); } debug((DEBUG_CONFIG, 6, "Loaded config file successfully.")); debug((DEBUG_CONFIG, 4, "Read listtype is \"%s\".", listtype)); if (!strcasecmp(listtype, "open")) ListConfig->listtype = LIST_OPEN; else if (!strcasecmp(listtype, "closed")) ListConfig->listtype = LIST_CLOSED; else if (!strcasecmp(listtype, "moderated")) ListConfig->listtype = LIST_MODERATED; else { syslog(LOG_ERR, "List \"%s\" doesn't have a valid type in config file.", listname); exit(1); } ListConfig->allowpubsub = allowpubsub; ListConfig->allowaliensub = allowaliensub; ListConfig->allowmembers = allowmembers; ListConfig->showonindex = showonindex; ListConfig->fqdn = (list_fqdn) ? list_fqdn : MasterConfig->fqdn; ListConfig->reply_to = reply_to; if (reply_to != NULL && strcasecmp(reply_to, "none")) CanonizeAddress(&(ListConfig->reply_to), ListConfig->fqdn); ListConfig->admin_password = admin_password; ListConfig->posting_password = posting_password; ListConfig->postingfilter = postingfilter; ListConfig->archivepath = archivepath; AppendNode(ListConfigs, xstrdup(listname), ListConfig); return ListConfig; }