38 #include "clientpipe.h" 56 #include <libxml/parser.h> 62 #include <sys/socket.h> 63 #include <sys/types.h> 69 static const char* engine_str =
"engine";
80 if (!engine)
return NULL;
114 cmdhandler_thread_start(
void* arg)
121 if((err=pthread_sigmask(SIG_SETMASK, &sigset, NULL)))
122 ods_fatal_exit(
"[%s] pthread_sigmask: %s", engine_str, strerror(err));
131 ods_log_assert(engine);
145 ods_status status = ODS_STATUS_OK;
149 ods_log_assert(engine);
150 ods_log_assert(engine->
config);
183 ods_log_assert(engine);
184 ods_log_assert(engine->
config);
193 worker_thread_start(
void* arg)
200 if((err=pthread_sigmask(SIG_SETMASK, &sigset, NULL)))
201 ods_fatal_exit(
"[%s] pthread_sigmask: %s", engine_str, strerror(err));
205 ods_log_crit(
"Failed to start worker, could not connect to database");
218 ods_log_assert(engine);
219 ods_log_assert(engine->
config);
225 worker_thread_start, engine->
workers[i]);
234 ods_log_assert(engine);
235 ods_log_assert(engine->
config);
257 ods_log_assert(engine);
310 fprintf(stderr,
"db_configuraiton_list_new failed\n");
322 fprintf(stderr,
"setup configuration backend failed\n");
333 fprintf(stderr,
"setup configuration file failed\n");
347 fprintf(stderr,
"setup configuration backend failed\n");
358 fprintf(stderr,
"setup configuration file failed\n");
364 if (snprintf(&str[0],
sizeof(str),
"%d", engine->
config->
db_port) >= (
int)
sizeof(str)) {
367 fprintf(stderr,
"setup configuration file failed\n");
378 fprintf(stderr,
"setup configuration file failed\n");
391 fprintf(stderr,
"setup configuration file failed\n");
403 fprintf(stderr,
"setup configuration file failed\n");
415 fprintf(stderr,
"setup configuration file failed\n");
451 engine->
pid = getpid();
454 ods_log_error(
"[%s] Pidfile exists and process with PID is running", engine_str);
455 return ODS_STATUS_WRITE_PIDFILE_ERR;
458 if (setup_database(engine))
return ODS_STATUS_DB_ERR;
461 ods_log_crit(
"Could not connect to database or database not set" 463 return ODS_STATUS_DB_ERR;
471 return ODS_STATUS_CMDHANDLER_ERR;
490 return ODS_STATUS_CHDIR_ERR;
492 if (engine_privdrop(engine) != ODS_STATUS_OK) {
494 return ODS_STATUS_PRIVDROP_ERR;
502 engine_str, strerror(errno));
503 return ODS_STATUS_FORK_ERR;
505 if ((fd = open(
"/dev/null", O_RDWR, 0)) != -1) {
506 (void)dup2(fd, STDIN_FILENO);
507 (void)dup2(fd, STDOUT_FILENO);
508 (void)dup2(fd, STDERR_FILENO);
509 if (fd > 2) (void)close(fd);
516 if (setsid() == -1) {
518 engine_str, strerror(errno));
519 return ODS_STATUS_SETSID_ERR;
525 engine->
pid = getpid();
527 (
unsigned long) engine->
pid);
530 engine_create_workers(engine);
539 return ODS_STATUS_WRITE_PIDFILE_ERR;
542 return ODS_STATUS_OK;
574 desetup_database(engine);
580 struct sigaction action;
587 engine->
pid = getpid();
596 sigfillset(&action.sa_mask);
598 sigaction(SIGHUP, &action, NULL);
599 sigaction(SIGTERM, &action, NULL);
600 sigaction(SIGINT, &action, NULL);
612 ods_log_assert(engine);
616 if (error != HSM_OK) {
617 char* errorstr = hsm_get_error(NULL);
618 if (errorstr != NULL) {
622 ods_log_crit(
"[%s] error opening libhsm (errno %i)", engine_str,
629 engine_start_cmdhandler(engine);
void engine_wakeup_workers(engine_type *engine)
void cmdhandler_stop(struct engine_struct *engine)
schedule_type * schedule_create()
void engine_teardown(engine_type *engine)
void ods_log_debug(const char *format,...)
int db_connection_setup(db_connection_t *connection)
void engine_start_workers(engine_type *engine)
db_configuration_t * db_configuration_new(void)
worker_type * worker_create(int num)
struct engine_struct * engine
ods_status engine_setup(engine_type *engine)
void ods_fatal_exit(const char *format,...)
int db_configuration_set_name(db_configuration_t *configuration, const char *name)
void ods_log_info(const char *format,...)
void worker_start(worker_type *worker)
void schedule_purge(schedule_type *schedule)
void ods_log_error(const char *format,...)
void cmdhandler_start(cmdhandler_type *cmdhandler)
void worker_cleanup(worker_type *worker)
pthread_cond_t signal_cond
struct engine_struct * engine
void engine_stop_workers(engine_type *engine)
int db_configuration_list_add(db_configuration_list_t *configuration_list, db_configuration_t *configuration)
db_configuration_list_t * dbcfg_list
int engine_run(engine_type *engine, start_cb_t start, int single_run)
void ods_log_crit(const char *format,...)
const char * log_filename
const char * clisock_filename
void hsm_key_factory_deinit(void)
engineconfig_type * config
void engine_init(engine_type *engine, int daemonize)
void schedule_release_all(schedule_type *schedule)
void db_configuration_free(db_configuration_t *configuration)
hsm_repository_t * repositories
engine_type * engine_alloc(void)
int database_version_get_version(db_connection_t *connection)
cmdhandler_type * cmdhandler
void signal_set_engine(struct engine_struct *engine)
db_connection_t * get_database_connection(db_configuration_list_t *dbcfg_list)
pthread_mutex_t enforce_lock
pthread_mutex_t signal_lock
db_configuration_list_t * db_configuration_list_new(void)
void ods_log_verbose(const char *format,...)
int db_connection_set_configuration_list(db_connection_t *connection, const db_configuration_list_t *configuration_list)
cmdhandler_type * cmdhandler_create(const char *filename)
void db_connection_free(db_connection_t *connection)
void * signal_handler(sig_atomic_t sig)
void schedule_cleanup(schedule_type *schedule)
int db_configuration_set_value(db_configuration_t *configuration, const char *value)
engineconfig_database_type_t db_type
const char * pid_filename
void engine_dealloc(engine_type *engine)
int db_connection_connect(const db_connection_t *connection)
void(* start_cb_t)(engine_type *engine)
void cmdhandler_cleanup(cmdhandler_type *cmdhandler)
db_connection_t * db_connection_new(void)
void db_configuration_list_free(db_configuration_list_t *configuration_list)