• Main Page
  • Data Structures
  • Files
  • File List
  • Globals

/build/buildd-opendnssec_1.3.2-1~bpo60+1-s390-eF9Mr1/opendnssec-1.3.2/signer/src/daemon/cfg.c

Go to the documentation of this file.
00001 /*
00002  * $Id: cfg.c 5432 2011-08-22 12:55:04Z matthijs $
00003  *
00004  * Copyright (c) 2009 NLNet Labs. All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions
00008  * are met:
00009  * 1. Redistributions of source code must retain the above copyright
00010  *    notice, this list of conditions and the following disclaimer.
00011  * 2. Redistributions in binary form must reproduce the above copyright
00012  *    notice, this list of conditions and the following disclaimer in the
00013  *    documentation and/or other materials provided with the distribution.
00014  *
00015  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00016  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00017  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00018  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
00019  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00020  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
00021  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
00023  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
00024  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
00025  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00026  *
00027  */
00028 
00034 #include "config.h"
00035 #include "daemon/cfg.h"
00036 #include "parser/confparser.h"
00037 #include "shared/allocator.h"
00038 #include "shared/file.h"
00039 #include "shared/log.h"
00040 #include "shared/status.h"
00041 
00042 #include <errno.h>
00043 #include <stdio.h>
00044 #include <string.h>
00045 
00046 static const char* conf_str = "config";
00047 
00048 
00053 engineconfig_type*
00054 engine_config(allocator_type* allocator, const char* cfgfile,
00055     int cmdline_verbosity)
00056 {
00057     engineconfig_type* ecfg;
00058     const char* rngfile = ODS_SE_RNGDIR "/conf.rng";
00059     FILE* cfgfd = NULL;
00060 
00061     if (!allocator) {
00062         ods_log_error("[%s] failed to read: no allocator available",
00063             conf_str);
00064         return NULL;
00065     }
00066     ods_log_assert(allocator);
00067     if (!cfgfile) {
00068         ods_log_error("[%s] failed to read: no filename given", conf_str);
00069         return NULL;
00070     }
00071     ods_log_assert(cfgfile);
00072     ods_log_verbose("[%s] read cfgfile: %s", conf_str, cfgfile);
00073 
00074     ecfg = (engineconfig_type*) allocator_alloc(allocator,
00075         sizeof(engineconfig_type));
00076     if (!ecfg) {
00077         ods_log_error("[%s] failed to read: allocator failed", conf_str);
00078         return NULL;
00079     }
00080 
00081     ecfg->allocator = allocator;
00082 
00083     /* check syntax (slows down parsing configuration file) */
00084     if (parse_file_check(cfgfile, rngfile) != ODS_STATUS_OK) {
00085         ods_log_error("[%s] failed to read: unable to parse file %s",
00086             conf_str, cfgfile);
00087         return NULL;
00088     }
00089 
00090     /* open cfgfile */
00091     cfgfd = ods_fopen(cfgfile, NULL, "r");
00092     if (cfgfd) {
00093         /* get values */
00094         ecfg->cfg_filename = allocator_strdup(allocator, cfgfile);
00095         ecfg->zonelist_filename = parse_conf_zonelist_filename(allocator,
00096             cfgfile);
00097         ecfg->zonefetch_filename = parse_conf_zonefetch_filename(allocator,
00098             cfgfile);
00099         ecfg->log_filename = parse_conf_log_filename(allocator, cfgfile);
00100         ecfg->pid_filename = parse_conf_pid_filename(allocator, cfgfile);
00101         ecfg->notify_command = parse_conf_notify_command(allocator, cfgfile);
00102         ecfg->clisock_filename = parse_conf_clisock_filename(allocator,
00103             cfgfile);
00104         ecfg->working_dir = parse_conf_working_dir(allocator, cfgfile);
00105         ecfg->username = parse_conf_username(allocator, cfgfile);
00106         ecfg->group = parse_conf_group(allocator, cfgfile);
00107         ecfg->chroot = parse_conf_chroot(allocator, cfgfile);
00108         ecfg->use_syslog = parse_conf_use_syslog(cfgfile);
00109         ecfg->num_worker_threads = parse_conf_worker_threads(cfgfile);
00110         ecfg->num_signer_threads = parse_conf_signer_threads(cfgfile);
00111         ecfg->verbosity = cmdline_verbosity;
00112         ecfg->num_adapters = 0;
00113 
00114         /* done */
00115         ods_fclose(cfgfd);
00116         return ecfg;
00117     }
00118 
00119     ods_log_error("[%s] failed to read: unable to open file %s", conf_str,
00120         cfgfile);
00121     return NULL;
00122 }
00123 
00124 
00129 ods_status
00130 engine_config_check(engineconfig_type* config)
00131 {
00132     if (!config) {
00133         ods_log_error("[%s] check failed: config does not exist", conf_str);
00134         return ODS_STATUS_CFG_ERR;
00135     }
00136     if (!config->zonelist_filename) {
00137         ods_log_error("[%s] check failed: no zonelist filename", conf_str);
00138         return ODS_STATUS_CFG_ERR;
00139     }
00140     if (!config->clisock_filename) {
00141         ods_log_error("[%s] check failed: no socket filename", conf_str);
00142         return ODS_STATUS_CFG_ERR;
00143     }
00144 
00145     /*  [TODO] room for more checks here */
00146 
00147     return ODS_STATUS_OK;
00148 }
00149 
00150 
00155 void
00156 engine_config_print(FILE* out, engineconfig_type* config)
00157 {
00158     if (!out) {
00159         return;
00160     }
00161 
00162     fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
00163     if (config) {
00164         fprintf(out, "<Configuration>\n");
00165 
00166         /* Common */
00167         fprintf(out, "\t<Common>\n");
00168         if (config->use_syslog && config->log_filename) {
00169                 fprintf(out, "\t\t<Logging>\n");
00170                 fprintf(out, "\t\t\t<Syslog>\n");
00171                 fprintf(out, "\t\t\t\t<Facility>%s</Facility>\n",
00172                 config->log_filename);
00173                 fprintf(out, "\t\t\t</Syslog>\n");
00174                 fprintf(out, "\t\t</Logging>\n");
00175                 } else if (config->log_filename) {
00176                 fprintf(out, "\t\t<Logging>\n");
00177                 fprintf(out, "\t\t\t<File>\n");
00178                 fprintf(out, "\t\t\t\t<Filename>%s</Filename>\n",
00179                 config->log_filename);
00180                 fprintf(out, "\t\t\t</File>\n");
00181                 fprintf(out, "\t\t</Logging>\n");
00182         }
00183 
00184         fprintf(out, "\t\t<ZoneListFile>%s</ZoneListFile>\n",
00185             config->zonelist_filename);
00186         if (config->zonefetch_filename) {
00187             fprintf(out, "\t\t<ZoneFetchFile>%s</ZoneFetchFile>\n",
00188                 config->zonefetch_filename);
00189         }
00190 
00191         fprintf(out, "\t</Common>\n");
00192 
00193         /* Signer */
00194         fprintf(out, "\t<Signer>\n");
00195         if (config->username || config->group || config->chroot) {
00196             fprintf(out, "\t\t<Privileges>\n");
00197             if (config->username) {
00198                 fprintf(out, "\t\t<User>%s</User>\n", config->username);
00199             }
00200             if (config->group) {
00201                 fprintf(out, "\t\t<Group>%s</Group>\n", config->group);
00202             }
00203             if (config->chroot) {
00204                 fprintf(out, "\t\t<Directory>%s</Directory>\n",
00205                     config->chroot);
00206             }
00207             fprintf(out, "\t\t</Privileges>\n");
00208         }
00209         fprintf(out, "\t\t<WorkingDirectory>%s</WorkingDirectory>\n",
00210             config->working_dir);
00211         fprintf(out, "\t\t<WorkerThreads>%i</WorkerThreads>\n",
00212             config->num_worker_threads);
00213         fprintf(out, "\t\t<SignerThreads>%i</SignerThreads>\n",
00214             config->num_signer_threads);
00215         if (config->notify_command) {
00216             fprintf(out, "\t\t<NotifyCommand>%s</NotifyCommand>\n",
00217                 config->notify_command);
00218         }
00219         fprintf(out, "\t</Signer>\n");
00220 
00221         fprintf(out, "</Configuration>\n");
00222 
00223         /* make configurable:
00224            - pid_filename
00225            - clisock_filename
00226          */
00227     }
00228     return;
00229 }
00230 
00231 
00236 void
00237 engine_config_cleanup(engineconfig_type* config)
00238 {
00239     allocator_type* allocator;
00240     if (!config) {
00241         return;
00242     }
00243     allocator = config->allocator;
00244     allocator_deallocate(allocator, (void*) config->cfg_filename);
00245     allocator_deallocate(allocator, (void*) config->zonelist_filename);
00246     allocator_deallocate(allocator, (void*) config->zonefetch_filename);
00247     allocator_deallocate(allocator, (void*) config->log_filename);
00248     allocator_deallocate(allocator, (void*) config->pid_filename);
00249     allocator_deallocate(allocator, (void*) config->notify_command);
00250     allocator_deallocate(allocator, (void*) config->clisock_filename);
00251     allocator_deallocate(allocator, (void*) config->working_dir);
00252     allocator_deallocate(allocator, (void*) config->username);
00253     allocator_deallocate(allocator, (void*) config->group);
00254     allocator_deallocate(allocator, (void*) config->chroot);
00255     allocator_deallocate(allocator, (void*) config);
00256     return;
00257 }
00258 

Generated on Sat Dec 17 2011 09:57:56 for OpenDNSSEC-signer by  doxygen 1.7.1