diff --git a/src/daemon/sysdbd.c b/src/daemon/sysdbd.c
index 8b7ebd49131262cf8e835a87ab3be9a06b80fba9..2f2afa249505b79bcfc76d10169272e6b7fcef06 100644 (file)
--- a/src/daemon/sysdbd.c
+++ b/src/daemon/sysdbd.c
#include "sysdb.h"
#include "core/plugin.h"
#include "core/store.h"
-#include "utils/string.h"
+#include "core/error.h"
+
+#include "frontend/sock.h"
#include "daemon/config.h"
#include <unistd.h>
+#include <pthread.h>
+
#ifndef CONFIGFILE
# define CONFIGFILE SYSCONFDIR"/sysdb/sysdbd.conf"
#endif
+#ifndef DEFAULT_SOCKET
+# define DEFAULT_SOCKET "unix:"LOCALSTATEDIR"/run/sysdbd.sock"
+#endif
+
static sdb_plugin_loop_t plugin_main_loop = SDB_PLUGIN_LOOP_INIT;
+static sdb_fe_loop_t frontend_main_loop = SDB_FE_LOOP_INIT;
+
+static char *default_listen_addresses[] = {
+ DEFAULT_SOCKET,
+};
static void
sigintterm_handler(int __attribute__((unused)) signo)
{
- plugin_main_loop.do_loop = 0;
+ frontend_main_loop.do_loop = 0;
} /* sigintterm_handler */
static void
{
printf("SysDBd version "SDB_VERSION_STRING SDB_VERSION_EXTRA", "
"built "BUILD_DATE"\n"
- "using libsysdb verion %s%s\n"
+ "using libsysdb version %s%s\n"
"Copyright (C) 2012 "PACKAGE_MAINTAINER"\n"
"\nThis is free software under the terms of the BSD license, see "
if ((pid = fork()) < 0) {
char errbuf[1024];
- fprintf(stderr, "Failed to fork to background: %s\n",
+ sdb_log(SDB_LOG_ERR, "Failed to fork to background: %s",
sdb_strerror(errno, errbuf, sizeof(errbuf)));
return errno;
}
if (chdir("/")) {
char errbuf[1024];
- fprintf(stderr, "Failed to change working directory to /: %s\n",
+ sdb_log(SDB_LOG_ERR, "Failed to change working directory to "
+ "the root directory: %s",
sdb_strerror(errno, errbuf, sizeof(errbuf)));
return errno;
}
close(0);
if (open("/dev/null", O_RDWR)) {
char errbuf[1024];
- fprintf(stderr, "Failed to connect stdin to '/dev/null': %s\n",
+ sdb_log(SDB_LOG_ERR, "Failed to connect stdin to '/dev/null': %s",
sdb_strerror(errno, errbuf, sizeof(errbuf)));
return errno;
}
close(1);
if (dup(0) != 1) {
char errbuf[1024];
- fprintf(stderr, "Could not connect stdout to '/dev/null': %s\n",
+ sdb_log(SDB_LOG_ERR, "Could not connect stdout to '/dev/null': %s",
sdb_strerror(errno, errbuf, sizeof(errbuf)));
return errno;
}
close(2);
if (dup(0) != 2) {
char errbuf[1024];
- fprintf(stdout, "Could not connect stderr to '/dev/null': %s\n",
+ sdb_log(SDB_LOG_ERR, "Could not connect stderr to '/dev/null': %s",
sdb_strerror(errno, errbuf, sizeof(errbuf)));
return errno;
}
return 0;
} /* daemonize */
+static void *
+backend_handler(void __attribute__((unused)) *data)
+{
+ sdb_plugin_collector_loop(&plugin_main_loop);
+ return NULL;
+} /* backend_handler */
+
int
main(int argc, char **argv)
{
char *config_filename = NULL;
- _Bool daemon = 0;
+ _Bool do_daemonize = 0;
+
+ pthread_t backend_thread;
struct sigaction sa_intterm;
+ int status;
while (42) {
int opt = getopt(argc, argv, "C:dhV");
config_filename = optarg;
break;
case 'd':
- daemon = 1;
+ do_daemonize = 1;
break;
case 'h':
if (! config_filename)
config_filename = CONFIGFILE;
- if (daemon_parse_config(config_filename)) {
- fprintf(stderr, "Failed to parse configuration file.\n");
+ if ((status = daemon_parse_config(config_filename))) {
+ if (status > 0)
+ sdb_log(SDB_LOG_ERR, "Failed to parse configuration file.");
+ else
+ sdb_log(SDB_LOG_ERR, "Failed to load configuration file.\n"
+ "\tCheck other error messages for details.");
exit(1);
}
+ if (! listen_addresses) {
+ listen_addresses = default_listen_addresses;
+ listen_addresses_num = SDB_STATIC_ARRAY_LEN(default_listen_addresses);
+ }
+
memset(&sa_intterm, 0, sizeof(sa_intterm));
sa_intterm.sa_handler = sigintterm_handler;
sa_intterm.sa_flags = 0;
if (sigaction(SIGINT, &sa_intterm, /* old action */ NULL)) {
char errbuf[1024];
- fprintf(stderr, "Failed to install signal handler for SIGINT: %s\n",
- sdb_strerror(errno, errbuf, sizeof(errbuf)));
+ sdb_log(SDB_LOG_ERR, "Failed to install signal handler for "
+ "SIGINT: %s", sdb_strerror(errno, errbuf, sizeof(errbuf)));
exit(1);
}
if (sigaction(SIGTERM, &sa_intterm, /* old action */ NULL)) {
char errbuf[1024];
- fprintf(stderr, "Failed to install signal handler for SIGTERM: %s\n",
- sdb_strerror(errno, errbuf, sizeof(errbuf)));
+ sdb_log(SDB_LOG_ERR, "Failed to install signal handler for "
+ "SIGTERM: %s", sdb_strerror(errno, errbuf, sizeof(errbuf)));
exit(1);
}
- if (daemon)
+ if (do_daemonize)
if (daemonize())
exit(1);
- fprintf(stderr, "SysDB daemon "SDB_VERSION_STRING SDB_VERSION_EXTRA
- " (pid %i) initialized successfully\n", (int)getpid());
+ sdb_log(SDB_LOG_INFO, "SysDB daemon "SDB_VERSION_STRING
+ SDB_VERSION_EXTRA " (pid %i) initialized successfully",
+ (int)getpid());
sdb_plugin_init_all();
- sdb_plugin_collector_loop(&plugin_main_loop);
+ plugin_main_loop.default_interval = SECS_TO_SDB_TIME(60);
+
+ memset(&backend_thread, 0, sizeof(backend_thread));
+ if (pthread_create(&backend_thread, /* attr = */ NULL,
+ backend_handler, /* arg = */ NULL)) {
+ char buf[1024];
+ sdb_log(SDB_LOG_ERR, "Failed to create backend handler thread: %s",
+ sdb_strerror(errno, buf, sizeof(buf)));
+
+ plugin_main_loop.do_loop = 0;
+ }
+ else {
+ size_t i;
+
+ sdb_fe_socket_t *sock = sdb_fe_sock_create();
+ for (i = 0; i < listen_addresses_num; ++i)
+ if (sdb_fe_sock_add_listener(sock, listen_addresses[i]))
+ break;
- fprintf(stderr, "Shutting down SysDB daemon "SDB_VERSION_STRING
- SDB_VERSION_EXTRA" (pid %i)\n", (int)getpid());
+ /* break on error */
+ if (i >= listen_addresses_num)
+ sdb_fe_sock_listen_and_serve(sock, &frontend_main_loop);
+
+ sdb_log(SDB_LOG_INFO, "Waiting for backend thread to terminate");
+ plugin_main_loop.do_loop = 0;
+ pthread_join(backend_thread, NULL);
+ sdb_fe_sock_destroy(sock);
+ }
- fprintf(stderr, "Store dump:\n");
- sdb_store_dump(stderr);
+ sdb_log(SDB_LOG_INFO, "Shutting down SysDB daemon "SDB_VERSION_STRING
+ SDB_VERSION_EXTRA" (pid %i)", (int)getpid());
return 0;
} /* main */