00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "config.h"
00042
00043 #include <sys/types.h>
00044 #include <sys/param.h>
00045 #include <syslog.h>
00046 #include <stdarg.h>
00047 #include <errno.h>
00048 #include <unistd.h>
00049 #include <fcntl.h>
00050 #include <stdlib.h>
00051 #include <string.h>
00052 #include <signal.h>
00053
00054 #include "daemon.h"
00055 #include "daemon_util.h"
00056 #include "privdrop.h"
00057
00058 #include "ksm/ksm.h"
00059 #include "ksm/dbsmsg.h"
00060 #include "ksm/dbsdef.h"
00061 #include "ksm/kmemsg.h"
00062 #include "ksm/kmedef.h"
00063 #include "ksm/message.h"
00064 #include "ksm/string_util.h"
00065
00066 #ifndef MAXPATHLEN
00067 # define MAXPATHLEN 4096
00068 #endif
00069
00070 extern int server_init(DAEMONCONFIG *config);
00071 extern void server_main(DAEMONCONFIG *config);
00072
00073 DAEMONCONFIG config;
00074
00075 void
00076 sig_handler (int sig)
00077 {
00078 switch (sig) {
00079 case SIGCHLD:
00080 return;
00081 case SIGHUP:
00082 return;
00083 case SIGALRM:
00084 break;
00085 case SIGILL:
00086 break;
00087 case SIGUSR1:
00088 break;
00089 case SIGINT:
00090 config.term = 2;
00091 break;
00092 case SIGTERM:
00093 config.term = 1;
00094 break;
00095 default:
00096 break;
00097 }
00098 }
00099
00100 void
00101 exit_function(void)
00102 {
00103 unlink(config.pidfile);
00104 }
00105
00106 int
00107 main(int argc, char *argv[]){
00108 int fd;
00109 struct sigaction action;
00110 const char* program;
00111
00112 config.debug = false;
00113 config.once = false;
00114
00115 config.pidfile = NULL;
00116 config.program = NULL;
00117 config.host = NULL;
00118 config.port = NULL;
00119 config.user = (unsigned char *)calloc(MAX_USER_LENGTH, sizeof(char));
00120 config.password = (unsigned char *)calloc(MAX_PASSWORD_LENGTH, sizeof(char));
00121 config.schema = (unsigned char *)calloc(MAX_SCHEMA_LENGTH, sizeof(char));
00122 config.DSSubmitCmd = (char *)calloc(MAXPATHLEN + 1024, sizeof(char));
00123
00124 if (config.user == NULL || config.password == NULL || config.schema == NULL) {
00125 log_msg(&config, LOG_ERR, "Malloc for config struct failed");
00126 exit(1);
00127 }
00128 config.term = 0;
00129
00130
00131
00132 if ((program = strrchr(argv[0], '/'))) {
00133 ++program;
00134 }
00135 else {
00136 program = argv[0];
00137 }
00138 config.program = program;
00139 config.log_user = DEFAULT_LOG_FACILITY;
00140
00141 log_init(config.log_user, config.program);
00142
00143
00144 log_msg(&config, LOG_INFO, "%s starting...", PACKAGE_NAME);
00145
00146 #ifdef ENFORCER_TIMESHIFT
00147 if (getenv("ENFORCER_TIMESHIFT")) {
00148 log_msg(&config, LOG_INFO, "Timeshift mode detected, running once only!");
00149 fprintf(stderr, "WARNING: Timeshift mode detected, running once only!\n");
00150 config.once = true;
00151 config.debug = true;
00152 }
00153 #endif
00154
00155
00156 cmdlParse(&config, &argc, argv);
00157 if(config.debug) log_msg(&config, LOG_INFO, "%s DEBUG ON.", PACKAGE_NAME);
00158
00159
00160 if(!config.debug){
00161
00162 switch ((config.pid = fork())) {
00163 case 0:
00164 break;
00165 case -1:
00166 log_msg(&config, LOG_ERR, "fork failed: %s", strerror(errno));
00167 unlink(config.pidfile);
00168 exit(1);
00169 default:
00170 fprintf(stdout, "OpenDNSSEC ods-enforcerd started (version %s), pid %d\n", PACKAGE_VERSION, (int) config.pid);
00171 log_msg(&config, LOG_INFO, "%s Parent exiting...", PACKAGE_NAME);
00172 exit(0);
00173 }
00174
00175
00176 if (setsid() == -1) {
00177 log_msg(&config, LOG_ERR, "setsid() failed: %s", strerror(errno));
00178 exit(1);
00179 }
00180
00181 if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
00182 (void)dup2(fd, STDIN_FILENO);
00183 (void)dup2(fd, STDOUT_FILENO);
00184 (void)dup2(fd, STDERR_FILENO);
00185 if (fd > 2)
00186 (void)close(fd);
00187 }
00188 log_msg(&config, LOG_INFO, "%s forked OK...", PACKAGE_NAME);
00189 } else {
00190 log_msg(&config, LOG_INFO, "%s in debug mode - not forking...", PACKAGE_NAME);
00191 }
00192
00193 action.sa_handler = sig_handler;
00194 sigfillset(&action.sa_mask);
00195 action.sa_flags = 0;
00196 sigaction(SIGTERM, &action, NULL);
00197 sigaction(SIGHUP, &action, NULL);
00198 sigaction(SIGINT, &action, NULL);
00199 sigaction(SIGILL, &action, NULL);
00200 sigaction(SIGUSR1, &action, NULL);
00201 sigaction(SIGALRM, &action, NULL);
00202 sigaction(SIGCHLD, &action, NULL);
00203 action.sa_handler = SIG_IGN;
00204 sigaction(SIGPIPE, &action, NULL);
00205
00206
00207 if (getPermsForDrop(&config) != 0) {
00208 exit(1);
00209 }
00210
00211
00212
00213 if (server_init(&config) != 0) {
00214 exit(1);
00215 }
00216
00217
00218
00219 if (createPidDir(&config) != 0) {
00220 exit(1);
00221 }
00222
00223
00224
00225
00226
00227 privdrop(config.username, config.groupname, NULL);
00228
00229 config.uid = geteuid();
00230 config.gid = getegid();
00231
00232
00233 config.pid = getpid();
00234 if (writepid(&config) == -1) {
00235 log_msg(&config, LOG_ERR, "cannot write the pidfile %s: %s",
00236 config.pidfile, strerror(errno));
00237 exit(1);
00238 }
00239
00240 atexit(exit_function);
00241
00242 log_msg(&config, LOG_NOTICE, "%s started (version %s), pid %d", PACKAGE_NAME, PACKAGE_VERSION,
00243 (int) config.pid);
00244
00245 MsgInit();
00246 MsgRegister(KME_MIN_VALUE, KME_MAX_VALUE, m_messages, ksm_log_msg);
00247 MsgRegister(DBS_MIN_VALUE, DBS_MAX_VALUE, d_messages, ksm_log_msg);
00248
00249
00250 server_main(&config);
00251
00252
00253 MsgRundown();
00254 if (config.host) free(config.host);
00255 if (config.port) free(config.port);
00256 free(config.user);
00257 free(config.password);
00258 free(config.schema);
00259 free(config.DSSubmitCmd);
00260
00261 StrFree(config.username);
00262 StrFree(config.groupname);
00263 #if 0
00264 StrFree(config.chrootdir);
00265 #endif
00266
00267 exit(0);
00268
00269 }
00270