sudosrv.c revision 3f9e2c24dbc14b2eafbe4f5a5ee16fe9af3c3f75
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/*
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Authors:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Pavel Březina <pbrezina@redhat.com>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Copyright (C) 2011 Red Hat
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina This program is free software; you can redistribute it and/or modify
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina it under the terms of the GNU General Public License as published by
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina the Free Software Foundation; either version 3 of the License, or
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina (at your option) any later version.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina This program is distributed in the hope that it will be useful,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina GNU General Public License for more details.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina You should have received a copy of the GNU General Public License
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina*/
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <popt.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "util/util.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "confdb/confdb.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "monitor/monitor_interfaces.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "responder/common/responder.h"
e880949305cee3aca79441fe6113a9d79e7c98f2Jakub Hrozek#include "responder/common/responder_sbus.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "responder/sudo/sudosrv_private.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "providers/data_provider.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
769347ad4d35d43488eb98f980143495b0db415dStef Walterstruct mon_cli_iface monitor_sudo_methods = {
769347ad4d35d43488eb98f980143495b0db415dStef Walter { &mon_cli_iface_meta, 0 },
769347ad4d35d43488eb98f980143495b0db415dStef Walter .ping = monitor_common_pong,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .resInit = monitor_common_res_init,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .shutDown = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .goOffline = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .resetOffline = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .rotateLogs = responder_logrotate,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .clearMemcache = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .clearEnumCache = NULL,
b76419cf8830440b46c20a15585562343c7b1924Jakub Hrozek .sysbusReconnect = NULL,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina};
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
769347ad4d35d43488eb98f980143495b0db415dStef Walterstatic struct data_provider_iface sudo_dp_methods = {
769347ad4d35d43488eb98f980143495b0db415dStef Walter { &data_provider_iface_meta, 0 },
769347ad4d35d43488eb98f980143495b0db415dStef Walter .RegisterService = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .pamHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .sudoHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .autofsHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .hostHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .getDomains = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .getAccountInfo = NULL,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina};
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinastatic void sudo_dp_reconnect_init(struct sbus_connection *conn,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int status,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina void *pvt)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct be_conn *be_conn = talloc_get_type(pvt, struct be_conn);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int ret;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* Did we reconnect successfully? */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (status == SBUS_RECONNECT_SUCCESS) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "Reconnected to the Data Provider.\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* Identify ourselves to the data provider */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = dp_common_send_id(be_conn->conn,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina DATA_PROVIDER_VERSION,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina "SUDO");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* all fine */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret == EOK) {
65976ea5e9767bfaced81dfb97dc87d59f50b57eSimo Sorce handle_requests_after_reconnect(be_conn->rctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* Failed to reconnect */
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "Could not reconnect to %s provider.\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov be_conn->domain->name);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaint sudo_process_init(TALLOC_CTX *mem_ctx,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct tevent_context *ev,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct confdb_ctx *cdb)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina struct resp_ctx *rctx;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct sss_cmd_table *sudo_cmds;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct sudo_ctx *sudo_ctx;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct be_conn *iter;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int ret;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int max_retries;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina sudo_cmds = get_sudo_cmds();
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina ret = sss_process_init(mem_ctx, ev, cdb,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina sudo_cmds,
8bccd95e275fae760a991da394235e4e70e57bbdMichal Zidek SSS_SUDO_SOCKET_NAME, -1, NULL, -1,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina CONFDB_SUDO_CONF_ENTRY,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina SSS_SUDO_SBUS_SERVICE_NAME,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina SSS_SUDO_SBUS_SERVICE_VERSION,
07e941c1bbdc752142bbd3b838c540bc7ecd0ed7Stef Walter &monitor_sudo_methods,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina "SUDO",
07e941c1bbdc752142bbd3b838c540bc7ecd0ed7Stef Walter &sudo_dp_methods.vtable,
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina &rctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina return ret;
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina }
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina sudo_ctx = talloc_zero(rctx, struct sudo_ctx);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina if (!sudo_ctx) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "fatal error initializing sudo_ctx\n");
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina ret = ENOMEM;
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina goto fail;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina sudo_ctx->rctx = rctx;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina sudo_ctx->rctx->pvt_ctx = sudo_ctx;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* Enable automatic reconnection to the Data Provider */
3bea01f01d76e1e95a8239c0d3f67073992136a1Jan Zeleny ret = confdb_get_int(sudo_ctx->rctx->cdb,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina CONFDB_SUDO_CONF_ENTRY,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina CONFDB_SERVICE_RECON_RETRIES,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina 3, &max_retries);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Failed to set up automatic reconnection\n");
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina goto fail;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina for (iter = sudo_ctx->rctx->be_conns; iter; iter = iter->next) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina sbus_reconnect_init(iter->conn, max_retries,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina sudo_dp_reconnect_init, iter);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* Get sudo_timed option */
3bea01f01d76e1e95a8239c0d3f67073992136a1Jan Zeleny ret = confdb_get_bool(sudo_ctx->rctx->cdb,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina CONFDB_SUDO_CONF_ENTRY, CONFDB_SUDO_TIMED,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina CONFDB_DEFAULT_SUDO_TIMED,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina &sudo_ctx->timed);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "Error reading from confdb (%d) [%s]\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina goto fail;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina }
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose ret = schedule_get_domains_task(rctx, rctx->ev, rctx);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "schedule_get_domains_tasks failed.\n");
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose goto fail;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose }
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "SUDO Initialization complete\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return EOK;
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březinafail:
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina talloc_free(rctx);
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březina return ret;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaint main(int argc, const char *argv[])
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int opt;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina poptContext pc;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct main_context *main_ctx;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int ret;
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek uid_t uid;
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek gid_t gid;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina struct poptOption long_options[] = {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina POPT_AUTOHELP
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina SSSD_MAIN_OPTS
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek SSSD_SERVER_OPTS(uid, gid)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina POPT_TABLEEND
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina };
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* Set debug level to invalid value so we can deside if -d 0 was used. */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina debug_level = SSSDBG_INVALID;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina pc = poptGetContext(argv[0], argc, argv, long_options, 0);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina while((opt = poptGetNextOpt(pc)) != -1) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina switch(opt) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina default:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina fprintf(stderr, "\nInvalid option %s: %s\n\n",
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina poptBadOption(pc, 0), poptStrerror(opt));
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina poptPrintUsage(pc, stderr, 0);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return 1;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina poptFreeContext(pc);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
9e2c64c6d4f5560e27207193efea6536a566865eMichal Zidek DEBUG_INIT(debug_level);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* set up things like debug, signals, daemonization, etc... */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina debug_log_file = "sssd_sudo";
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
3f9e2c24dbc14b2eafbe4f5a5ee16fe9af3c3f75Jakub Hrozek ret = server_setup("sssd[sudo]", 0, uid, gid, CONFDB_SUDO_CONF_ENTRY,
ac40d2f2b2b2fc35c95389f5e28febd580bd2b7aJakub Hrozek &main_ctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return 2;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = die_if_parent_died();
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* This is not fatal, don't return */
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "Could not set up to exit "
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "when parent process does\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = sudo_process_init(main_ctx,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina main_ctx->event_ctx,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina main_ctx->confdb_ctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return 3;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* loop on main */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina server_loop(main_ctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return 0;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}