1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
4 * This file is part of tlm
6 * Copyright (C) 2014 Intel Corporation.
8 * Contact: Imran Zaman <imran.zaman@intel.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
31 #include <glib-unix.h>
34 #include <sys/prctl.h>
36 #include "common/tlm-log.h"
37 #include "tlm-session-daemon.h"
39 static TlmSessionDaemon *_daemon = NULL;
40 static guint _sig_source_id[3];
43 _on_daemon_closed (gpointer data, GObject *server)
46 DBG ("Daemon closed");
47 if (data) g_main_loop_quit ((GMainLoop *)data);
51 _handle_quit_signal (gpointer user_data)
53 GMainLoop *ml = (GMainLoop *) user_data;
55 g_return_val_if_fail (ml != NULL, FALSE);
56 DBG ("Received quit signal");
57 if (ml) g_main_loop_quit (ml);
63 _install_sighandlers (GMainLoop *main_loop)
65 GSource *source = NULL;
66 GMainContext *ctx = g_main_loop_get_context (main_loop);
68 source = g_unix_signal_source_new (SIGTERM);
69 g_source_set_callback (source,
73 _sig_source_id[0] = g_source_attach (source, ctx);
75 source = g_unix_signal_source_new (SIGINT);
76 g_source_set_callback (source,
80 _sig_source_id[1] = g_source_attach (source, ctx);
82 source = g_unix_signal_source_new (SIGHUP);
83 g_source_set_callback (source,
87 _sig_source_id[2] = g_source_attach (source, ctx);
89 if (prctl(PR_SET_PDEATHSIG, SIGHUP))
90 WARN ("failed to set parent death signal");
93 int main (int argc, char **argv)
95 GMainLoop *main_loop = NULL;
96 gint in_fd = 0, out_fd = 1;
98 /* Duplicates stdin and stdout descriptors and point the descriptors
99 * to /dev/null to avoid anyone writing to descriptors
103 WARN ("Failed to dup stdin : %s(%d)", strerror(errno), errno);
106 if (!freopen("/dev/null", "r+", stdin)) {
107 WARN ("Unable to redirect stdin to /dev/null");
112 WARN ("Failed to dup stdout : %s(%d)", strerror(errno), errno);
116 if (!freopen("/dev/null", "w+", stdout)) {
117 WARN ("Unable to redirect stdout to /dev/null");
120 /* Reattach stdout to stderr */
123 #if !GLIB_CHECK_VERSION (2, 36, 0)
127 DBG ("old pgid=%u", getpgrp ());
129 _daemon = tlm_session_daemon_new (in_fd, out_fd);
130 if (_daemon == NULL) {
134 main_loop = g_main_loop_new (NULL, FALSE);
135 g_object_weak_ref (G_OBJECT (_daemon), _on_daemon_closed, main_loop);
136 _install_sighandlers (main_loop);
138 tlm_log_init(G_LOG_DOMAIN);
140 DBG ("Entering main event loop");
142 g_main_loop_run (main_loop);
145 g_object_unref (_daemon);
149 g_main_loop_unref (main_loop);
151 tlm_log_close (NULL);