|
Packit Service |
c6b9b0 |
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
Packit Service |
c6b9b0 |
/*
|
|
Packit Service |
c6b9b0 |
* Copyright © 2011 – 2017 Red Hat, Inc.
|
|
Packit Service |
c6b9b0 |
*
|
|
Packit Service |
c6b9b0 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
c6b9b0 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
c6b9b0 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
c6b9b0 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit Service |
c6b9b0 |
*
|
|
Packit Service |
c6b9b0 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
c6b9b0 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c6b9b0 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
c6b9b0 |
* Lesser General Public License for more details.
|
|
Packit Service |
c6b9b0 |
*
|
|
Packit Service |
c6b9b0 |
* You should have received a copy of the GNU Lesser General
|
|
Packit Service |
c6b9b0 |
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
c6b9b0 |
*/
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
#include "config.h"
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
#include <glib-unix.h>
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
#include <locale.h>
|
|
Packit Service |
c6b9b0 |
#include <signal.h>
|
|
Packit Service |
c6b9b0 |
#include <gio/gio.h>
|
|
Packit Service |
c6b9b0 |
#include <libintl.h>
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
#include "goadaemon.h"
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static GMainLoop *loop = NULL;
|
|
Packit Service |
c6b9b0 |
static gboolean opt_replace = FALSE;
|
|
Packit Service |
c6b9b0 |
static gboolean opt_no_sigint = FALSE;
|
|
Packit Service |
c6b9b0 |
static GOptionEntry opt_entries[] =
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
{"replace", 0, 0, G_OPTION_ARG_NONE, &opt_replace, "Replace existing daemon", NULL},
|
|
Packit Service |
c6b9b0 |
{"no-sigint", 0, 0, G_OPTION_ARG_NONE, &opt_no_sigint, "Do not handle SIGINT for controlled shutdown", NULL},
|
|
Packit Service |
c6b9b0 |
{NULL }
|
|
Packit Service |
c6b9b0 |
};
|
|
Packit Service |
c6b9b0 |
static GoaDaemon *the_daemon = NULL;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
on_bus_acquired (GDBusConnection *connection,
|
|
Packit Service |
c6b9b0 |
const gchar *name,
|
|
Packit Service |
c6b9b0 |
gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
|
|
Packit Service |
c6b9b0 |
g_return_if_fail (name != NULL && name[0] != '\0');
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
the_daemon = goa_daemon_new (connection);
|
|
Packit Service |
c6b9b0 |
g_debug ("Connected to the session bus");
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
on_name_lost (GDBusConnection *connection,
|
|
Packit Service |
c6b9b0 |
const gchar *name,
|
|
Packit Service |
c6b9b0 |
gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_return_if_fail (connection == NULL || G_IS_DBUS_CONNECTION (connection));
|
|
Packit Service |
c6b9b0 |
g_return_if_fail (name != NULL && name[0] != '\0');
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_info ("Lost (or failed to acquire) the name %s on the session message bus", name);
|
|
Packit Service |
c6b9b0 |
g_main_loop_quit (loop);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static void
|
|
Packit Service |
c6b9b0 |
on_name_acquired (GDBusConnection *connection,
|
|
Packit Service |
c6b9b0 |
const gchar *name,
|
|
Packit Service |
c6b9b0 |
gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
|
|
Packit Service |
c6b9b0 |
g_return_if_fail (name != NULL && name[0] != '\0');
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_debug ("Acquired the name %s on the session message bus", name);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
static gboolean
|
|
Packit Service |
c6b9b0 |
on_sigint (gpointer user_data)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_info ("Caught SIGINT. Initiating shutdown.");
|
|
Packit Service |
c6b9b0 |
g_main_loop_quit (loop);
|
|
Packit Service |
c6b9b0 |
return FALSE;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
int
|
|
Packit Service |
c6b9b0 |
main (int argc,
|
|
Packit Service |
c6b9b0 |
char **argv)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
GError *error;
|
|
Packit Service |
c6b9b0 |
GOptionContext *opt_context = NULL;
|
|
Packit Service |
c6b9b0 |
gint ret = 1;
|
|
Packit Service |
c6b9b0 |
guint name_owner_id = 0;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
setlocale (LC_ALL, "");
|
|
Packit Service |
c6b9b0 |
bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
|
|
Packit Service |
c6b9b0 |
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
|
Packit Service |
c6b9b0 |
textdomain (GETTEXT_PACKAGE);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
opt_context = g_option_context_new ("GNOME Online Accounts daemon");
|
|
Packit Service |
c6b9b0 |
g_option_context_add_main_entries (opt_context, opt_entries, NULL);
|
|
Packit Service |
c6b9b0 |
error = NULL;
|
|
Packit Service |
c6b9b0 |
if (!g_option_context_parse (opt_context, &argc, &argv, &error))
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_critical ("Error parsing options: %s", error->message);
|
|
Packit Service |
c6b9b0 |
g_error_free (error);
|
|
Packit Service |
c6b9b0 |
goto out;
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_message ("goa-daemon version %s starting", PACKAGE_VERSION);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
loop = g_main_loop_new (NULL, FALSE);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if (!opt_no_sigint)
|
|
Packit Service |
c6b9b0 |
{
|
|
Packit Service |
c6b9b0 |
g_unix_signal_add (SIGINT, on_sigint, NULL);
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
|
|
Packit Service |
c6b9b0 |
"org.gnome.OnlineAccounts",
|
|
Packit Service |
c6b9b0 |
G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
|
|
Packit Service |
c6b9b0 |
(opt_replace ? G_BUS_NAME_OWNER_FLAGS_REPLACE : 0),
|
|
Packit Service |
c6b9b0 |
on_bus_acquired,
|
|
Packit Service |
c6b9b0 |
on_name_acquired,
|
|
Packit Service |
c6b9b0 |
on_name_lost,
|
|
Packit Service |
c6b9b0 |
NULL,
|
|
Packit Service |
c6b9b0 |
NULL);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_debug ("Entering main event loop");
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_main_loop_run (loop);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
ret = 0;
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
out:
|
|
Packit Service |
c6b9b0 |
g_clear_object (&the_daemon);
|
|
Packit Service |
c6b9b0 |
if (name_owner_id != 0)
|
|
Packit Service |
c6b9b0 |
g_bus_unown_name (name_owner_id);
|
|
Packit Service |
c6b9b0 |
g_clear_pointer (&loop, (GDestroyNotify) g_main_loop_unref);
|
|
Packit Service |
c6b9b0 |
g_clear_pointer (&opt_context, (GDestroyNotify) g_option_context_free);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
g_message ("goa-daemon version %s exiting", PACKAGE_VERSION);
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
return ret;
|
|
Packit Service |
c6b9b0 |
}
|