From 239bc98692187ca42dca7cf1a19800415afcf6cf Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 31 Mar 2017 15:01:06 -0400 Subject: [PATCH 05/13] launch-environment: implement hostname-selected signal We're connecting to a signal that isn't implemented. This commit adds the implementation. A slightly better fix might be to cut out some of the layers, of middle men passing around hostname-selected, but for now this is fine. --- daemon/gdm-launch-environment.c | 27 +++++++++++++++++++++++++++ daemon/gdm-launch-environment.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c index 4372ac29..a7ae6728 100644 --- a/daemon/gdm-launch-environment.c +++ b/daemon/gdm-launch-environment.c @@ -76,60 +76,61 @@ struct GdmLaunchEnvironmentPrivate char *x11_display_name; char *x11_display_seat_id; char *x11_display_device; char *x11_display_hostname; char *x11_authority_file; gboolean x11_display_is_local; }; enum { PROP_0, PROP_VERIFICATION_MODE, PROP_SESSION_TYPE, PROP_SESSION_MODE, PROP_X11_DISPLAY_NAME, PROP_X11_DISPLAY_SEAT_ID, PROP_X11_DISPLAY_DEVICE, PROP_X11_DISPLAY_HOSTNAME, PROP_X11_AUTHORITY_FILE, PROP_X11_DISPLAY_IS_LOCAL, PROP_USER_NAME, PROP_RUNTIME_DIR, PROP_COMMAND, }; enum { OPENED, STARTED, STOPPED, EXITED, DIED, + HOSTNAME_SELECTED, LAST_SIGNAL }; static guint signals [LAST_SIGNAL] = { 0, }; static void gdm_launch_environment_class_init (GdmLaunchEnvironmentClass *klass); static void gdm_launch_environment_init (GdmLaunchEnvironment *launch_environment); static void gdm_launch_environment_finalize (GObject *object); G_DEFINE_TYPE (GdmLaunchEnvironment, gdm_launch_environment, G_TYPE_OBJECT) static GHashTable * build_launch_environment (GdmLaunchEnvironment *launch_environment, gboolean start_session) { GHashTable *hash; struct passwd *pwent; static const char * const optional_environment[] = { "LANG", "LANGUAGE", "LC_CTYPE", "LC_NUMERIC", "LC_TIME", "LC_COLLATE", "LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION", "LC_ALL", "WINDOWPATH", "XCURSOR_PATH", "XDG_CONFIG_DIRS", NULL }; char *system_data_dirs; int i; /* create a hash table of current environment, then update keys has necessary */ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); @@ -237,60 +238,69 @@ static void on_session_started (GdmSession *session, const char *service_name, int pid, GdmLaunchEnvironment *launch_environment) { launch_environment->priv->pid = pid; g_signal_emit (G_OBJECT (launch_environment), signals [STARTED], 0); } static void on_session_exited (GdmSession *session, int exit_code, GdmLaunchEnvironment *launch_environment) { gdm_session_stop_conversation (launch_environment->priv->session, "gdm-launch-environment"); g_signal_emit (G_OBJECT (launch_environment), signals [EXITED], 0, exit_code); } static void on_session_died (GdmSession *session, int signal_number, GdmLaunchEnvironment *launch_environment) { gdm_session_stop_conversation (launch_environment->priv->session, "gdm-launch-environment"); g_signal_emit (G_OBJECT (launch_environment), signals [DIED], 0, signal_number); } static void +on_hostname_selected (GdmSession *session, + const char *hostname, + GdmLaunchEnvironment *launch_environment) +{ + g_debug ("GdmSession: hostname selected: %s", hostname); + g_signal_emit (launch_environment, signals [HOSTNAME_SELECTED], 0, hostname); +} + +static void on_conversation_started (GdmSession *session, const char *service_name, GdmLaunchEnvironment *launch_environment) { char *log_path; char *log_file; log_file = g_strdup_printf ("%s-greeter.log", launch_environment->priv->x11_display_name); log_path = g_build_filename (LOGDIR, log_file, NULL); g_free (log_file); gdm_session_setup_for_program (launch_environment->priv->session, "gdm-launch-environment", launch_environment->priv->user_name, log_path); g_free (log_path); } static void on_conversation_stopped (GdmSession *session, const char *service_name, GdmLaunchEnvironment *launch_environment) { GdmSession *conversation_session; conversation_session = launch_environment->priv->session; launch_environment->priv->session = NULL; g_debug ("GdmLaunchEnvironment: conversation stopped"); @@ -382,60 +392,65 @@ gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment) g_signal_connect_object (launch_environment->priv->session, "conversation-stopped", G_CALLBACK (on_conversation_stopped), launch_environment, 0); g_signal_connect_object (launch_environment->priv->session, "setup-complete", G_CALLBACK (on_session_setup_complete), launch_environment, 0); g_signal_connect_object (launch_environment->priv->session, "session-opened", G_CALLBACK (on_session_opened), launch_environment, 0); g_signal_connect_object (launch_environment->priv->session, "session-started", G_CALLBACK (on_session_started), launch_environment, 0); g_signal_connect_object (launch_environment->priv->session, "session-exited", G_CALLBACK (on_session_exited), launch_environment, 0); g_signal_connect_object (launch_environment->priv->session, "session-died", G_CALLBACK (on_session_died), launch_environment, 0); + g_signal_connect_object (launch_environment->priv->session, + "hostname-selected", + G_CALLBACK (on_hostname_selected), + launch_environment, + 0); gdm_session_start_conversation (launch_environment->priv->session, "gdm-launch-environment"); gdm_session_select_program (launch_environment->priv->session, launch_environment->priv->command); if (launch_environment->priv->session_type != NULL) { g_object_set (G_OBJECT (launch_environment->priv->session), "session-type", launch_environment->priv->session_type, NULL); } res = TRUE; out: if (local_error) { g_critical ("GdmLaunchEnvironment: %s", local_error->message); g_clear_error (&local_error); } return res; } gboolean gdm_launch_environment_stop (GdmLaunchEnvironment *launch_environment) { if (launch_environment->priv->pid > 1) { gdm_signal_pid (-launch_environment->priv->pid, SIGTERM); } if (launch_environment->priv->session != NULL) { gdm_session_close (launch_environment->priv->session); @@ -780,60 +795,72 @@ gdm_launch_environment_class_init (GdmLaunchEnvironmentClass *klass) G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, stopped), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); signals [EXITED] = g_signal_new ("exited", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, exited), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); signals [DIED] = g_signal_new ("died", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, died), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); + + signals [HOSTNAME_SELECTED] = + g_signal_new ("hostname-selected", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GdmLaunchEnvironmentClass, hostname_selected), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); } static void gdm_launch_environment_init (GdmLaunchEnvironment *launch_environment) { launch_environment->priv = GDM_LAUNCH_ENVIRONMENT_GET_PRIVATE (launch_environment); launch_environment->priv->command = NULL; launch_environment->priv->session = NULL; } static void gdm_launch_environment_finalize (GObject *object) { GdmLaunchEnvironment *launch_environment; g_return_if_fail (object != NULL); g_return_if_fail (GDM_IS_LAUNCH_ENVIRONMENT (object)); launch_environment = GDM_LAUNCH_ENVIRONMENT (object); g_return_if_fail (launch_environment->priv != NULL); gdm_launch_environment_stop (launch_environment); if (launch_environment->priv->session) { g_object_unref (launch_environment->priv->session); } diff --git a/daemon/gdm-launch-environment.h b/daemon/gdm-launch-environment.h index 3fd875c2..c2a09d1c 100644 --- a/daemon/gdm-launch-environment.h +++ b/daemon/gdm-launch-environment.h @@ -32,55 +32,57 @@ G_BEGIN_DECLS #define GDM_LAUNCH_ENVIRONMENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_LAUNCH_ENVIRONMENT, GdmLaunchEnvironmentClass)) #define GDM_IS_LAUNCH_ENVIRONMENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_LAUNCH_ENVIRONMENT)) #define GDM_IS_LAUNCH_ENVIRONMENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_LAUNCH_ENVIRONMENT)) #define GDM_LAUNCH_ENVIRONMENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_LAUNCH_ENVIRONMENT, GdmLaunchEnvironmentClass)) typedef struct GdmLaunchEnvironmentPrivate GdmLaunchEnvironmentPrivate; typedef struct { GObject parent; GdmLaunchEnvironmentPrivate *priv; } GdmLaunchEnvironment; typedef struct { GObjectClass parent_class; /* methods */ gboolean (*start) (GdmLaunchEnvironment *launch_environment); gboolean (*stop) (GdmLaunchEnvironment *launch_environment); /* signals */ void (* opened) (GdmLaunchEnvironment *launch_environment); void (* started) (GdmLaunchEnvironment *launch_environment); void (* stopped) (GdmLaunchEnvironment *launch_environment); void (* exited) (GdmLaunchEnvironment *launch_environment, int exit_code); void (* died) (GdmLaunchEnvironment *launch_environment, int signal_number); + void (* hostname_selected) (GdmLaunchEnvironment *launch_environment, + const char *hostname); } GdmLaunchEnvironmentClass; GType gdm_launch_environment_get_type (void); gboolean gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment); gboolean gdm_launch_environment_stop (GdmLaunchEnvironment *launch_environment); GdmSession * gdm_launch_environment_get_session (GdmLaunchEnvironment *launch_environment); char * gdm_launch_environment_get_session_id (GdmLaunchEnvironment *launch_environment); GdmLaunchEnvironment *gdm_create_greeter_launch_environment (const char *display_name, const char *seat_id, const char *session_type, const char *display_hostname, gboolean display_is_local); GdmLaunchEnvironment *gdm_create_initial_setup_launch_environment (const char *display_name, const char *seat_id, const char *display_hostname, gboolean display_is_local); GdmLaunchEnvironment *gdm_create_chooser_launch_environment (const char *display_name, const char *seat_id, const char *display_hostname); G_END_DECLS #endif /* __GDM_LAUNCH_ENVIRONMENT_H */ -- 2.12.0