Blame SOURCES/0001-Revert-session-forward-is-initial-from-display-to-wo.patch

2fc437
From 6df33bb3293d220bcdff7abc68f61ebad841ffe1 Mon Sep 17 00:00:00 2001
2fc437
From: Ray Strode <rstrode@redhat.com>
2fc437
Date: Fri, 12 May 2017 10:11:09 -0400
2fc437
Subject: [PATCH] Revert "session: forward is-initial from display to worker"
2fc437
MIME-Version: 1.0
2fc437
Content-Type: text/plain; charset=UTF-8
2fc437
Content-Transfer-Encoding: 8bit
2fc437
2fc437
This reverts commit 7a4e34049c79e907d1a027390c5d3a8dcdc11977.
2fc437
2fc437
It breaks login screen until reboot on 7.3→7.4 upgrade.
2fc437
---
2fc437
 daemon/gdm-display.c          |  6 ------
2fc437
 daemon/gdm-session-worker.c   | 21 +++++----------------
2fc437
 daemon/gdm-session-worker.xml |  3 ---
2fc437
 daemon/gdm-session.c          | 25 -------------------------
2fc437
 4 files changed, 5 insertions(+), 50 deletions(-)
2fc437
2fc437
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
2fc437
index 2af8e13e..c44e4941 100644
2fc437
--- a/daemon/gdm-display.c
2fc437
+++ b/daemon/gdm-display.c
2fc437
@@ -1488,119 +1488,113 @@ wants_initial_setup (GdmDisplay *self)
2fc437
         /* don't run initial-setup on remote displays
2fc437
          */
2fc437
         if (!self->priv->is_local) {
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
         /* don't run if the system has existing users */
2fc437
         if (self->priv->have_existing_user_accounts) {
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
         /* don't run if initial-setup is unavailable */
2fc437
         if (!can_create_environment ("gnome-initial-setup")) {
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
         if (!gdm_settings_direct_get_boolean (GDM_KEY_INITIAL_SETUP_ENABLE, &enabled)) {
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
         if (initial_setup_disabled_by_anaconda ()) {
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
         return enabled;
2fc437
 }
2fc437
 
2fc437
 void
2fc437
 gdm_display_start_greeter_session (GdmDisplay *self)
2fc437
 {
2fc437
-        GdmSession    *session;
2fc437
         char          *display_name;
2fc437
         char          *seat_id;
2fc437
         char          *hostname;
2fc437
         char          *auth_file = NULL;
2fc437
 
2fc437
         g_return_if_fail (g_strcmp0 (self->priv->session_class, "greeter") == 0);
2fc437
 
2fc437
         g_debug ("GdmDisplay: Running greeter");
2fc437
 
2fc437
         display_name = NULL;
2fc437
         seat_id = NULL;
2fc437
         hostname = NULL;
2fc437
 
2fc437
         g_object_get (self,
2fc437
                       "x11-display-name", &display_name,
2fc437
                       "seat-id", &seat_id,
2fc437
                       "remote-hostname", &hostname,
2fc437
                       NULL);
2fc437
         if (self->priv->access_file != NULL) {
2fc437
                 auth_file = gdm_display_access_file_get_path (self->priv->access_file);
2fc437
         }
2fc437
 
2fc437
         g_debug ("GdmDisplay: Creating greeter for %s %s", display_name, hostname);
2fc437
 
2fc437
         g_signal_connect_object (self->priv->launch_environment,
2fc437
                                  "opened",
2fc437
                                  G_CALLBACK (on_launch_environment_session_opened),
2fc437
                                  self, 0);
2fc437
         g_signal_connect_object (self->priv->launch_environment,
2fc437
                                  "started",
2fc437
                                  G_CALLBACK (on_launch_environment_session_started),
2fc437
                                  self, 0);
2fc437
         g_signal_connect_object (self->priv->launch_environment,
2fc437
                                  "stopped",
2fc437
                                  G_CALLBACK (on_launch_environment_session_stopped),
2fc437
                                  self, 0);
2fc437
         g_signal_connect_object (self->priv->launch_environment,
2fc437
                                  "exited",
2fc437
                                  G_CALLBACK (on_launch_environment_session_exited),
2fc437
                                  self, 0);
2fc437
         g_signal_connect_object (self->priv->launch_environment,
2fc437
                                  "died",
2fc437
                                  G_CALLBACK (on_launch_environment_session_died),
2fc437
                                  self, 0);
2fc437
 
2fc437
         if (auth_file != NULL) {
2fc437
                 g_object_set (self->priv->launch_environment,
2fc437
                               "x11-authority-file", auth_file,
2fc437
                               NULL);
2fc437
         }
2fc437
 
2fc437
         gdm_launch_environment_start (self->priv->launch_environment);
2fc437
 
2fc437
-        session = gdm_launch_environment_get_session (self->priv->launch_environment);
2fc437
-        g_object_set (G_OBJECT (session),
2fc437
-                      "display-is-initial", self->priv->is_initial,
2fc437
-                      NULL);
2fc437
-
2fc437
         g_free (display_name);
2fc437
         g_free (seat_id);
2fc437
         g_free (hostname);
2fc437
         g_free (auth_file);
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 chown_initial_setup_home_dir (void)
2fc437
 {
2fc437
         GFile *dir;
2fc437
         GError *error;
2fc437
         char *gis_dir_path;
2fc437
         char *gis_uid_path;
2fc437
         char *gis_uid_contents;
2fc437
         struct passwd *pwe;
2fc437
         uid_t uid;
2fc437
 
2fc437
         if (!gdm_get_pwent_for_name (INITIAL_SETUP_USERNAME, &pwe)) {
2fc437
                 g_warning ("Unknown user %s", INITIAL_SETUP_USERNAME);
2fc437
                 return;
2fc437
         }
2fc437
 
2fc437
         gis_dir_path = g_strdup (pwe->pw_dir);
2fc437
 
2fc437
         gis_uid_path = g_build_filename (gis_dir_path,
2fc437
                                          "gnome-initial-setup-uid",
2fc437
                                          NULL);
2fc437
         if (!g_file_get_contents (gis_uid_path, &gis_uid_contents, NULL, NULL)) {
2fc437
                 g_warning ("Unable to read %s", gis_uid_path);
2fc437
                 goto out;
2fc437
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
2fc437
index d97b02b5..dffc8917 100644
2fc437
--- a/daemon/gdm-session-worker.c
2fc437
+++ b/daemon/gdm-session-worker.c
2fc437
@@ -134,61 +134,60 @@ struct GdmSessionWorkerPrivate
2fc437
         pam_handle_t     *pam_handle;
2fc437
 
2fc437
         GPid              child_pid;
2fc437
         guint             child_watch_id;
2fc437
 
2fc437
         /* from Setup */
2fc437
         char             *service;
2fc437
         char             *x11_display_name;
2fc437
         char             *x11_authority_file;
2fc437
         char             *display_device;
2fc437
         char             *display_seat_id;
2fc437
         char             *hostname;
2fc437
         char             *username;
2fc437
         char             *log_file;
2fc437
         char             *session_id;
2fc437
         uid_t             uid;
2fc437
         gid_t             gid;
2fc437
         gboolean          password_is_required;
2fc437
 
2fc437
         int               cred_flags;
2fc437
         int               login_vt;
2fc437
         int               session_vt;
2fc437
         int               session_tty_fd;
2fc437
 
2fc437
         char            **arguments;
2fc437
         guint32           cancelled : 1;
2fc437
         guint32           timed_out : 1;
2fc437
         guint32           is_program_session : 1;
2fc437
         guint32           is_reauth_session : 1;
2fc437
         guint32           display_is_local : 1;
2fc437
-        guint32           display_is_initial : 1;
2fc437
         guint             state_change_idle_id;
2fc437
         GdmSessionDisplayMode display_mode;
2fc437
 
2fc437
         char                 *server_address;
2fc437
         GDBusConnection      *connection;
2fc437
         GdmDBusWorkerManager *manager;
2fc437
 
2fc437
         GHashTable         *reauthentication_requests;
2fc437
 
2fc437
         GdmSessionAuditor  *auditor;
2fc437
         GdmSessionSettings *user_settings;
2fc437
 
2fc437
         GDBusMethodInvocation *pending_invocation;
2fc437
 };
2fc437
 
2fc437
 enum {
2fc437
         PROP_0,
2fc437
         PROP_SERVER_ADDRESS,
2fc437
         PROP_IS_REAUTH_SESSION,
2fc437
 };
2fc437
 
2fc437
 static void     gdm_session_worker_class_init   (GdmSessionWorkerClass *klass);
2fc437
 static void     gdm_session_worker_init         (GdmSessionWorker      *session_worker);
2fc437
 static void     gdm_session_worker_finalize     (GObject               *object);
2fc437
 
2fc437
 static void     gdm_session_worker_set_environment_variable (GdmSessionWorker *worker,
2fc437
                                                              const char       *key,
2fc437
                                                              const char       *value);
2fc437
 
2fc437
 static void     queue_state_change              (GdmSessionWorker      *worker);
2fc437
@@ -2057,67 +2056,63 @@ gdm_session_worker_start_session (GdmSessionWorker  *worker,
2fc437
         g_assert (sizeof (GPid) <= sizeof (int));
2fc437
 
2fc437
         g_debug ("GdmSessionWorker: state SESSION_STARTED");
2fc437
         worker->priv->state = GDM_SESSION_WORKER_STATE_SESSION_STARTED;
2fc437
 
2fc437
         gdm_session_worker_watch_child (worker);
2fc437
 
2fc437
  out:
2fc437
         if (error_code != PAM_SUCCESS) {
2fc437
                 gdm_session_worker_uninitialize_pam (worker, error_code);
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
         return TRUE;
2fc437
 }
2fc437
 
2fc437
 static gboolean
2fc437
 set_up_for_new_vt (GdmSessionWorker *worker)
2fc437
 {
2fc437
         int fd;
2fc437
         char vt_string[256], tty_string[256];
2fc437
         int session_vt = 0;
2fc437
 
2fc437
         fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
2fc437
 
2fc437
         if (fd < 0) {
2fc437
                 g_debug ("GdmSessionWorker: couldn't open VT master: %m");
2fc437
                 return FALSE;
2fc437
         }
2fc437
 
2fc437
-        if (worker->priv->display_is_initial) {
2fc437
-                session_vt = atoi (GDM_INITIAL_VT);
2fc437
-        } else {
2fc437
-                if (ioctl(fd, VT_OPENQRY, &session_vt) < 0) {
2fc437
-                        g_debug ("GdmSessionWorker: couldn't open new VT: %m");
2fc437
-                        goto fail;
2fc437
-                }
2fc437
+        if (ioctl(fd, VT_OPENQRY, &session_vt) < 0) {
2fc437
+                g_debug ("GdmSessionWorker: couldn't open new VT: %m");
2fc437
+                goto fail;
2fc437
         }
2fc437
 
2fc437
         worker->priv->session_vt = session_vt;
2fc437
 
2fc437
         close (fd);
2fc437
         fd = -1;
2fc437
 
2fc437
         g_assert (session_vt > 0);
2fc437
 
2fc437
         g_snprintf (vt_string, sizeof (vt_string), "%d", session_vt);
2fc437
 
2fc437
         /* Set the VTNR. This is used by logind to configure a session in
2fc437
          * the logind-managed case, but it doesn't hurt to set it always.
2fc437
          * When logind gains support for XDG_VTNR=auto, we can make the
2fc437
          * OPENQRY and this whole path only used by the new VT code. */
2fc437
         gdm_session_worker_set_environment_variable (worker,
2fc437
                                                      "XDG_VTNR",
2fc437
                                                      vt_string);
2fc437
 
2fc437
         g_snprintf (tty_string, 256, "/dev/tty%d", session_vt);
2fc437
         worker->priv->session_tty_fd = open (tty_string, O_RDWR | O_NOCTTY);
2fc437
         pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string);
2fc437
 
2fc437
         return TRUE;
2fc437
 
2fc437
 fail:
2fc437
         close (fd);
2fc437
         return FALSE;
2fc437
 }
2fc437
 
2fc437
@@ -2795,166 +2790,160 @@ gdm_session_worker_handle_establish_credentials (GdmDBusWorker         *object,
2fc437
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
2fc437
         validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_ACCREDITED);
2fc437
 
2fc437
         if (!worker->priv->is_reauth_session) {
2fc437
                 worker->priv->cred_flags = PAM_ESTABLISH_CRED;
2fc437
         } else {
2fc437
                 worker->priv->cred_flags = PAM_REINITIALIZE_CRED;
2fc437
         }
2fc437
 
2fc437
         return TRUE;
2fc437
 }
2fc437
 
2fc437
 static gboolean
2fc437
 gdm_session_worker_handle_open (GdmDBusWorker         *object,
2fc437
                                 GDBusMethodInvocation *invocation)
2fc437
 {
2fc437
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
2fc437
         validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_ACCOUNT_DETAILS_SAVED);
2fc437
         return TRUE;
2fc437
 }
2fc437
 
2fc437
 static gboolean
2fc437
 gdm_session_worker_handle_setup (GdmDBusWorker         *object,
2fc437
                                  GDBusMethodInvocation *invocation,
2fc437
                                  const char            *service,
2fc437
                                  const char            *x11_display_name,
2fc437
                                  const char            *x11_authority_file,
2fc437
                                  const char            *console,
2fc437
                                  const char            *seat_id,
2fc437
                                  const char            *hostname,
2fc437
-                                 gboolean               display_is_local,
2fc437
-                                 gboolean               display_is_initial)
2fc437
+                                 gboolean               display_is_local)
2fc437
 {
2fc437
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
2fc437
         validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE);
2fc437
 
2fc437
         worker->priv->service = g_strdup (service);
2fc437
         worker->priv->x11_display_name = g_strdup (x11_display_name);
2fc437
         worker->priv->x11_authority_file = g_strdup (x11_authority_file);
2fc437
         worker->priv->display_device = g_strdup (console);
2fc437
         worker->priv->display_seat_id = g_strdup (seat_id);
2fc437
         worker->priv->hostname = g_strdup (hostname);
2fc437
         worker->priv->display_is_local = display_is_local;
2fc437
-        worker->priv->display_is_initial = display_is_initial;
2fc437
         worker->priv->username = NULL;
2fc437
 
2fc437
         g_signal_connect_swapped (worker->priv->user_settings,
2fc437
                                   "notify::language-name",
2fc437
                                   G_CALLBACK (on_saved_language_name_read),
2fc437
                                   worker);
2fc437
 
2fc437
         g_signal_connect_swapped (worker->priv->user_settings,
2fc437
                                   "notify::session-name",
2fc437
                                   G_CALLBACK (on_saved_session_name_read),
2fc437
                                   worker);
2fc437
         return TRUE;
2fc437
 }
2fc437
 
2fc437
 static gboolean
2fc437
 gdm_session_worker_handle_setup_for_user (GdmDBusWorker         *object,
2fc437
                                           GDBusMethodInvocation *invocation,
2fc437
                                           const char            *service,
2fc437
                                           const char            *username,
2fc437
                                           const char            *x11_display_name,
2fc437
                                           const char            *x11_authority_file,
2fc437
                                           const char            *console,
2fc437
                                           const char            *seat_id,
2fc437
                                           const char            *hostname,
2fc437
-                                          gboolean               display_is_local,
2fc437
-                                          gboolean               display_is_initial)
2fc437
+                                          gboolean               display_is_local)
2fc437
 {
2fc437
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
2fc437
 
2fc437
         if (!validate_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE))
2fc437
                 return TRUE;
2fc437
 
2fc437
         worker->priv->service = g_strdup (service);
2fc437
         worker->priv->x11_display_name = g_strdup (x11_display_name);
2fc437
         worker->priv->x11_authority_file = g_strdup (x11_authority_file);
2fc437
         worker->priv->display_device = g_strdup (console);
2fc437
         worker->priv->display_seat_id = g_strdup (seat_id);
2fc437
         worker->priv->hostname = g_strdup (hostname);
2fc437
         worker->priv->display_is_local = display_is_local;
2fc437
-        worker->priv->display_is_initial = display_is_initial;
2fc437
         worker->priv->username = g_strdup (username);
2fc437
 
2fc437
         g_signal_connect_swapped (worker->priv->user_settings,
2fc437
                                   "notify::language-name",
2fc437
                                   G_CALLBACK (on_saved_language_name_read),
2fc437
                                   worker);
2fc437
 
2fc437
         g_signal_connect_swapped (worker->priv->user_settings,
2fc437
                                   "notify::session-name",
2fc437
                                   G_CALLBACK (on_saved_session_name_read),
2fc437
                                   worker);
2fc437
 
2fc437
         /* Load settings from accounts daemon before continuing
2fc437
          */
2fc437
         worker->priv->pending_invocation = invocation;
2fc437
         if (gdm_session_settings_load (worker->priv->user_settings, username)) {
2fc437
                 queue_state_change (worker);
2fc437
         } else {
2fc437
                 g_signal_connect (G_OBJECT (worker->priv->user_settings),
2fc437
                                   "notify::is-loaded",
2fc437
                                   G_CALLBACK (on_settings_is_loaded_changed),
2fc437
                                   worker);
2fc437
         }
2fc437
 
2fc437
         return TRUE;
2fc437
 }
2fc437
 
2fc437
 static gboolean
2fc437
 gdm_session_worker_handle_setup_for_program (GdmDBusWorker         *object,
2fc437
                                              GDBusMethodInvocation *invocation,
2fc437
                                              const char            *service,
2fc437
                                              const char            *username,
2fc437
                                              const char            *x11_display_name,
2fc437
                                              const char            *x11_authority_file,
2fc437
                                              const char            *console,
2fc437
                                              const char            *seat_id,
2fc437
                                              const char            *hostname,
2fc437
                                              gboolean               display_is_local,
2fc437
-                                             gboolean               display_is_initial,
2fc437
                                              const char            *log_file)
2fc437
 {
2fc437
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
2fc437
         validate_and_queue_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE);
2fc437
 
2fc437
         worker->priv->service = g_strdup (service);
2fc437
         worker->priv->x11_display_name = g_strdup (x11_display_name);
2fc437
         worker->priv->x11_authority_file = g_strdup (x11_authority_file);
2fc437
         worker->priv->display_device = g_strdup (console);
2fc437
         worker->priv->display_seat_id = g_strdup (seat_id);
2fc437
         worker->priv->hostname = g_strdup (hostname);
2fc437
         worker->priv->display_is_local = display_is_local;
2fc437
-        worker->priv->display_is_initial = display_is_initial;
2fc437
         worker->priv->username = g_strdup (username);
2fc437
         worker->priv->log_file = g_strdup (log_file);
2fc437
         worker->priv->is_program_session = TRUE;
2fc437
 
2fc437
         return TRUE;
2fc437
 }
2fc437
 
2fc437
 static gboolean
2fc437
 gdm_session_worker_handle_start_program (GdmDBusWorker         *object,
2fc437
                                          GDBusMethodInvocation *invocation,
2fc437
                                          const char            *text)
2fc437
 {
2fc437
         GdmSessionWorker *worker = GDM_SESSION_WORKER (object);
2fc437
         GError *parse_error = NULL;
2fc437
         validate_state_change (worker, invocation, GDM_SESSION_WORKER_STATE_SESSION_STARTED);
2fc437
 
2fc437
         if (worker->priv->is_reauth_session) {
2fc437
                 g_dbus_method_invocation_return_error (invocation,
2fc437
                                                        GDM_SESSION_WORKER_ERROR,
2fc437
                                                        GDM_SESSION_WORKER_ERROR_IN_REAUTH_SESSION,
2fc437
                                                        "Cannot start a program while in a reauth session");
2fc437
                 return TRUE;
2fc437
         }
2fc437
 
2fc437
         g_debug ("GdmSessionWorker: start program: %s", text);
2fc437
 
2fc437
         g_clear_pointer (&worker->priv->arguments, (GDestroyNotify) g_strfreev);
2fc437
         if (! g_shell_parse_argv (text, NULL, &worker->priv->arguments, &parse_error)) {
2fc437
                 g_dbus_method_invocation_take_error (invocation, parse_error);
2fc437
                 return TRUE;
2fc437
diff --git a/daemon/gdm-session-worker.xml b/daemon/gdm-session-worker.xml
2fc437
index 9f6d8b35..f7d1dc2d 100644
2fc437
--- a/daemon/gdm-session-worker.xml
2fc437
+++ b/daemon/gdm-session-worker.xml
2fc437
@@ -5,83 +5,80 @@
2fc437
     <method name="Authorize" />
2fc437
     <method name="EstablishCredentials" />
2fc437
     <method name="Open">
2fc437
       <arg name="session_id" direction="out" type="s"/>
2fc437
     </method>
2fc437
     <method name="SetLanguageName">
2fc437
       <arg name="language" direction="in" type="s"/>
2fc437
     </method>
2fc437
     <method name="SetSessionName">
2fc437
       <arg name="session_name" direction="in" type="s" />
2fc437
     </method>
2fc437
     <method name="SetSessionDisplayMode">
2fc437
       <arg name="mode" direction="in" type="s"/>
2fc437
     </method>
2fc437
     <method name="SetEnvironmentVariable">
2fc437
       <arg name="name" direction="in" type="s"/>
2fc437
       <arg name="value" direction="in" type="s"/>
2fc437
     </method>
2fc437
     <method name="StartProgram">
2fc437
       <arg name="command" direction="in" type="s"/>
2fc437
       <arg name="child_pid" direction="out" type="i"/>
2fc437
     </method>
2fc437
     <method name="Setup">
2fc437
       <arg name="service_name" direction="in" type="s"/>
2fc437
       <arg name="x11_display_name" direction="in" type="s"/>
2fc437
       <arg name="x11_authority_file" direction="in" type="s"/>
2fc437
       <arg name="display_device" direction="in" type="s"/>
2fc437
       <arg name="display_seat" direction="in" type="s"/>
2fc437
       <arg name="hostname" direction="in" type="s"/>
2fc437
       <arg name="display_is_local" direction="in" type="b"/>
2fc437
-      <arg name="display_is_initial" direction="in" type="b"/>
2fc437
     </method>
2fc437
     <method name="SetupForUser">
2fc437
       <arg name="service_name" direction="in" type="s"/>
2fc437
       <arg name="user_name" direction="in" type="s"/>
2fc437
       <arg name="x11_display_name" direction="in" type="s"/>
2fc437
       <arg name="x11_authority_file" direction="in" type="s"/>
2fc437
       <arg name="display_device" direction="in" type="s"/>
2fc437
       <arg name="display_seat" direction="in" type="s"/>
2fc437
       <arg name="hostname" direction="in" type="s"/>
2fc437
       <arg name="display_is_local" direction="in" type="b"/>
2fc437
-      <arg name="display_is_initial" direction="in" type="b"/>
2fc437
     </method>
2fc437
     <method name="SetupForProgram">
2fc437
       <arg name="service_name" direction="in" type="s"/>
2fc437
       <arg name="user_name" direction="in" type="s"/>
2fc437
       <arg name="x11_display_name" direction="in" type="s"/>
2fc437
       <arg name="x11_authority_file" direction="in" type="s"/>
2fc437
       <arg name="display_device" direction="in" type="s"/>
2fc437
       <arg name="display_seat" direction="in" type="s"/>
2fc437
       <arg name="hostname" direction="in" type="s"/>
2fc437
       <arg name="display_is_local" direction="in" type="b"/>
2fc437
-      <arg name="display_is_initial" direction="in" type="b"/>
2fc437
       <arg name="log_file" direction="in" type="s"/>
2fc437
     </method>
2fc437
     <method name="StartReauthentication">
2fc437
       <arg name="pid_of_caller" direction="in" type="i"/>
2fc437
       <arg name="uid_of_caller" direction="in" type="i"/>
2fc437
       <arg name="address" direction="out" type="s"/>
2fc437
     </method>
2fc437
 
2fc437
     <signal name="SessionExited">
2fc437
       <arg name="service_name" type="s" />
2fc437
       
2fc437
            signal. Use macros in sys/wait.h to handle it. -->
2fc437
       <arg name="status" type="i" />
2fc437
     </signal>
2fc437
     <signal name="SavedLanguageNameRead">
2fc437
       <arg name="language_name" type="s"/>
2fc437
     </signal>
2fc437
     <signal name="SavedSessionNameRead">
2fc437
       <arg name="session_name" type="s"/>
2fc437
     </signal>
2fc437
     <signal name="UsernameChanged">
2fc437
       <arg name="new_username" type="s"/>
2fc437
     </signal>
2fc437
     <signal name="Reauthenticated">
2fc437
       <arg name="service_name" type="s"/>
2fc437
     </signal>
2fc437
     <signal name="CancelPendingQuery">
2fc437
     </signal>
2fc437
   </interface>
2fc437
 </node>
2fc437
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
2fc437
index e69291fb..1dfbef64 100644
2fc437
--- a/daemon/gdm-session.c
2fc437
+++ b/daemon/gdm-session.c
2fc437
@@ -103,74 +103,72 @@ struct _GdmSessionPrivate
2fc437
         GdmDBusUserVerifier   *user_verifier_interface;
2fc437
         GdmDBusGreeter        *greeter_interface;
2fc437
         GdmDBusRemoteGreeter  *remote_greeter_interface;
2fc437
         GdmDBusChooser        *chooser_interface;
2fc437
 
2fc437
         GList               *pending_worker_connections;
2fc437
         GList               *outside_connections;
2fc437
 
2fc437
         GPid                 session_pid;
2fc437
 
2fc437
         /* object lifetime scope */
2fc437
         char                *session_type;
2fc437
         char                *display_name;
2fc437
         char                *display_hostname;
2fc437
         char                *display_device;
2fc437
         char                *display_seat_id;
2fc437
         char                *display_x11_authority_file;
2fc437
         gboolean             display_is_local;
2fc437
 
2fc437
         GdmSessionVerificationMode verification_mode;
2fc437
 
2fc437
         uid_t                allowed_user;
2fc437
 
2fc437
         char                *fallback_session_name;
2fc437
 
2fc437
         GDBusServer         *worker_server;
2fc437
         GDBusServer         *outside_server;
2fc437
         GHashTable          *environment;
2fc437
 
2fc437
         guint32              is_program_session : 1;
2fc437
-        guint32              display_is_initial : 1;
2fc437
 #ifdef ENABLE_WAYLAND_SUPPORT
2fc437
         guint32              ignore_wayland : 1;
2fc437
 #endif
2fc437
 };
2fc437
 
2fc437
 enum {
2fc437
         PROP_0,
2fc437
         PROP_VERIFICATION_MODE,
2fc437
         PROP_ALLOWED_USER,
2fc437
         PROP_DISPLAY_NAME,
2fc437
         PROP_DISPLAY_HOSTNAME,
2fc437
         PROP_DISPLAY_IS_LOCAL,
2fc437
-        PROP_DISPLAY_IS_INITIAL,
2fc437
         PROP_SESSION_TYPE,
2fc437
         PROP_DISPLAY_DEVICE,
2fc437
         PROP_DISPLAY_SEAT_ID,
2fc437
         PROP_DISPLAY_X11_AUTHORITY_FILE,
2fc437
         PROP_USER_X11_AUTHORITY_FILE,
2fc437
         PROP_CONVERSATION_ENVIRONMENT,
2fc437
 #ifdef ENABLE_WAYLAND_SUPPORT
2fc437
         PROP_IGNORE_WAYLAND,
2fc437
 #endif
2fc437
 };
2fc437
 
2fc437
 enum {
2fc437
         CONVERSATION_STARTED = 0,
2fc437
         CONVERSATION_STOPPED,
2fc437
         SETUP_COMPLETE,
2fc437
         CANCELLED,
2fc437
         HOSTNAME_SELECTED,
2fc437
         CLIENT_REJECTED,
2fc437
         CLIENT_CONNECTED,
2fc437
         CLIENT_DISCONNECTED,
2fc437
         CLIENT_READY_FOR_SESSION_TO_START,
2fc437
         DISCONNECTED,
2fc437
         AUTHENTICATION_FAILED,
2fc437
         VERIFICATION_COMPLETE,
2fc437
         SESSION_OPENED,
2fc437
         SESSION_STARTED,
2fc437
         SESSION_START_FAILED,
2fc437
         SESSION_EXITED,
2fc437
         SESSION_DIED,
2fc437
         REAUTHENTICATION_STARTED,
2fc437
@@ -2118,61 +2116,60 @@ send_setup (GdmSession *self,
2fc437
                 display_hostname = "";
2fc437
         }
2fc437
         if (self->priv->display_device != NULL) {
2fc437
                 display_device = self->priv->display_device;
2fc437
         } else {
2fc437
                 display_device = "";
2fc437
         }
2fc437
         if (self->priv->display_seat_id != NULL) {
2fc437
                 display_seat_id = self->priv->display_seat_id;
2fc437
         } else {
2fc437
                 display_seat_id = "";
2fc437
         }
2fc437
         if (self->priv->display_x11_authority_file != NULL) {
2fc437
                 display_x11_authority_file = self->priv->display_x11_authority_file;
2fc437
         } else {
2fc437
                 display_x11_authority_file = "";
2fc437
         }
2fc437
 
2fc437
         g_debug ("GdmSession: Beginning setup");
2fc437
 
2fc437
         conversation = find_conversation_by_name (self, service_name);
2fc437
         if (conversation != NULL) {
2fc437
                 gdm_dbus_worker_call_setup (conversation->worker_proxy,
2fc437
                                             service_name,
2fc437
                                             display_name,
2fc437
                                             display_x11_authority_file,
2fc437
                                             display_device,
2fc437
                                             display_seat_id,
2fc437
                                             display_hostname,
2fc437
                                             self->priv->display_is_local,
2fc437
-                                            self->priv->display_is_initial,
2fc437
                                             conversation->worker_cancellable,
2fc437
                                             (GAsyncReadyCallback) on_setup_complete_cb,
2fc437
                                             conversation);
2fc437
         }
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 send_setup_for_user (GdmSession *self,
2fc437
                      const char *service_name)
2fc437
 {
2fc437
         const char     *display_name;
2fc437
         const char     *display_device;
2fc437
         const char     *display_seat_id;
2fc437
         const char     *display_hostname;
2fc437
         const char     *display_x11_authority_file;
2fc437
         const char     *selected_user;
2fc437
         GdmSessionConversation *conversation;
2fc437
 
2fc437
         g_assert (service_name != NULL);
2fc437
 
2fc437
         conversation = find_conversation_by_name (self, service_name);
2fc437
 
2fc437
         if (self->priv->display_name != NULL) {
2fc437
                 display_name = self->priv->display_name;
2fc437
         } else {
2fc437
                 display_name = "";
2fc437
         }
2fc437
         if (self->priv->display_hostname != NULL) {
2fc437
                 display_hostname = self->priv->display_hostname;
2fc437
         } else {
2fc437
@@ -2184,122 +2181,120 @@ send_setup_for_user (GdmSession *self,
2fc437
                 display_device = "";
2fc437
         }
2fc437
         if (self->priv->display_seat_id != NULL) {
2fc437
                 display_seat_id = self->priv->display_seat_id;
2fc437
         } else {
2fc437
                 display_seat_id = "";
2fc437
         }
2fc437
         if (self->priv->display_x11_authority_file != NULL) {
2fc437
                 display_x11_authority_file = self->priv->display_x11_authority_file;
2fc437
         } else {
2fc437
                 display_x11_authority_file = "";
2fc437
         }
2fc437
         if (self->priv->selected_user != NULL) {
2fc437
                 selected_user = self->priv->selected_user;
2fc437
         } else {
2fc437
                 selected_user = "";
2fc437
         }
2fc437
 
2fc437
         g_debug ("GdmSession: Beginning setup for user %s", self->priv->selected_user);
2fc437
 
2fc437
         if (conversation != NULL) {
2fc437
                 gdm_dbus_worker_call_setup_for_user (conversation->worker_proxy,
2fc437
                                                      service_name,
2fc437
                                                      selected_user,
2fc437
                                                      display_name,
2fc437
                                                      display_x11_authority_file,
2fc437
                                                      display_device,
2fc437
                                                      display_seat_id,
2fc437
                                                      display_hostname,
2fc437
                                                      self->priv->display_is_local,
2fc437
-                                                     self->priv->display_is_initial,
2fc437
                                                      conversation->worker_cancellable,
2fc437
                                                      (GAsyncReadyCallback) on_setup_complete_cb,
2fc437
                                                      conversation);
2fc437
         }
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 send_setup_for_program (GdmSession *self,
2fc437
                         const char *service_name,
2fc437
                         const char *username,
2fc437
                         const char *log_file)
2fc437
 {
2fc437
         const char     *display_name;
2fc437
         const char     *display_device;
2fc437
         const char     *display_seat_id;
2fc437
         const char     *display_hostname;
2fc437
         const char     *display_x11_authority_file;
2fc437
         GdmSessionConversation *conversation;
2fc437
 
2fc437
         g_assert (service_name != NULL);
2fc437
 
2fc437
         if (self->priv->display_name != NULL) {
2fc437
                 display_name = self->priv->display_name;
2fc437
         } else {
2fc437
                 display_name = "";
2fc437
         }
2fc437
         if (self->priv->display_hostname != NULL) {
2fc437
                 display_hostname = self->priv->display_hostname;
2fc437
         } else {
2fc437
                 display_hostname = "";
2fc437
         }
2fc437
         if (self->priv->display_device != NULL) {
2fc437
                 display_device = self->priv->display_device;
2fc437
         } else {
2fc437
                 display_device = "";
2fc437
         }
2fc437
         if (self->priv->display_seat_id != NULL) {
2fc437
                 display_seat_id = self->priv->display_seat_id;
2fc437
         } else {
2fc437
                 display_seat_id = "";
2fc437
         }
2fc437
         if (self->priv->display_x11_authority_file != NULL) {
2fc437
                 display_x11_authority_file = self->priv->display_x11_authority_file;
2fc437
         } else {
2fc437
                 display_x11_authority_file = "";
2fc437
         }
2fc437
 
2fc437
         g_debug ("GdmSession: Beginning setup for session for program using PAM service %s", service_name);
2fc437
 
2fc437
         conversation = find_conversation_by_name (self, service_name);
2fc437
         if (conversation != NULL) {
2fc437
                 gdm_dbus_worker_call_setup_for_program (conversation->worker_proxy,
2fc437
                                                         service_name,
2fc437
                                                         username,
2fc437
                                                         display_name,
2fc437
                                                         display_x11_authority_file,
2fc437
                                                         display_device,
2fc437
                                                         display_seat_id,
2fc437
                                                         display_hostname,
2fc437
                                                         self->priv->display_is_local,
2fc437
-                                                        self->priv->display_is_initial,
2fc437
                                                         log_file,
2fc437
                                                         conversation->worker_cancellable,
2fc437
                                                         (GAsyncReadyCallback) on_setup_complete_cb,
2fc437
                                                         conversation);
2fc437
         }
2fc437
 }
2fc437
 
2fc437
 void
2fc437
 gdm_session_setup (GdmSession *self,
2fc437
                    const char *service_name)
2fc437
 {
2fc437
 
2fc437
         g_return_if_fail (GDM_IS_SESSION (self));
2fc437
 
2fc437
         send_setup (self, service_name);
2fc437
         gdm_session_defaults_changed (self);
2fc437
 }
2fc437
 
2fc437
 
2fc437
 void
2fc437
 gdm_session_setup_for_user (GdmSession *self,
2fc437
                             const char *service_name,
2fc437
                             const char *username)
2fc437
 {
2fc437
 
2fc437
         g_return_if_fail (GDM_IS_SESSION (self));
2fc437
         g_return_if_fail (username != NULL);
2fc437
 
2fc437
         gdm_session_select_user (self, username);
2fc437
 
2fc437
@@ -3217,67 +3212,60 @@ set_display_seat_id (GdmSession *self,
2fc437
                      const char *name)
2fc437
 {
2fc437
         g_free (self->priv->display_seat_id);
2fc437
         self->priv->display_seat_id = g_strdup (name);
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 set_user_x11_authority_file (GdmSession *self,
2fc437
                              const char *name)
2fc437
 {
2fc437
         g_free (self->priv->user_x11_authority_file);
2fc437
         self->priv->user_x11_authority_file = g_strdup (name);
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 set_display_x11_authority_file (GdmSession *self,
2fc437
                                 const char *name)
2fc437
 {
2fc437
         g_free (self->priv->display_x11_authority_file);
2fc437
         self->priv->display_x11_authority_file = g_strdup (name);
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 set_display_is_local (GdmSession *self,
2fc437
                       gboolean    is_local)
2fc437
 {
2fc437
         self->priv->display_is_local = is_local;
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
-set_display_is_initial (GdmSession *self,
2fc437
-                        gboolean    is_initial)
2fc437
-{
2fc437
-        self->priv->display_is_initial = is_initial;
2fc437
-}
2fc437
-
2fc437
-static void
2fc437
 set_verification_mode (GdmSession                 *self,
2fc437
                        GdmSessionVerificationMode  verification_mode)
2fc437
 {
2fc437
         self->priv->verification_mode = verification_mode;
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 set_allowed_user (GdmSession *self,
2fc437
                   uid_t       allowed_user)
2fc437
 {
2fc437
         self->priv->allowed_user = allowed_user;
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 set_conversation_environment (GdmSession  *self,
2fc437
                               char       **environment)
2fc437
 {
2fc437
         g_strfreev (self->priv->conversation_environment);
2fc437
         self->priv->conversation_environment = g_strdupv (environment);
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 set_session_type (GdmSession *self,
2fc437
                   const char *session_type)
2fc437
 {
2fc437
 
2fc437
         if (g_strcmp0 (self->priv->session_type, session_type) != 0) {
2fc437
                 g_debug ("GdmSession: setting session to type '%s'", session_type? session_type : "");
2fc437
                 g_free (self->priv->session_type);
2fc437
                 self->priv->session_type = g_strdup (session_type);
2fc437
@@ -3292,121 +3280,115 @@ gdm_session_set_property (GObject      *object,
2fc437
 {
2fc437
         GdmSession *self;
2fc437
 
2fc437
         self = GDM_SESSION (object);
2fc437
 
2fc437
         switch (prop_id) {
2fc437
         case PROP_SESSION_TYPE:
2fc437
                 set_session_type (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_DISPLAY_NAME:
2fc437
                 set_display_name (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_DISPLAY_HOSTNAME:
2fc437
                 set_display_hostname (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_DISPLAY_DEVICE:
2fc437
                 set_display_device (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_DISPLAY_SEAT_ID:
2fc437
                 set_display_seat_id (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_USER_X11_AUTHORITY_FILE:
2fc437
                 set_user_x11_authority_file (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_DISPLAY_X11_AUTHORITY_FILE:
2fc437
                 set_display_x11_authority_file (self, g_value_get_string (value));
2fc437
                 break;
2fc437
         case PROP_DISPLAY_IS_LOCAL:
2fc437
                 set_display_is_local (self, g_value_get_boolean (value));
2fc437
                 break;
2fc437
-        case PROP_DISPLAY_IS_INITIAL:
2fc437
-                set_display_is_initial (self, g_value_get_boolean (value));
2fc437
-                break;
2fc437
         case PROP_VERIFICATION_MODE:
2fc437
                 set_verification_mode (self, g_value_get_enum (value));
2fc437
                 break;
2fc437
         case PROP_ALLOWED_USER:
2fc437
                 set_allowed_user (self, g_value_get_uint (value));
2fc437
                 break;
2fc437
         case PROP_CONVERSATION_ENVIRONMENT:
2fc437
                 set_conversation_environment (self, g_value_get_pointer (value));
2fc437
                 break;
2fc437
 #ifdef ENABLE_WAYLAND_SUPPORT
2fc437
         case PROP_IGNORE_WAYLAND:
2fc437
                 gdm_session_set_ignore_wayland (self, g_value_get_boolean (value));
2fc437
                 break;
2fc437
 #endif
2fc437
         default:
2fc437
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
2fc437
                 break;
2fc437
         }
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 gdm_session_get_property (GObject    *object,
2fc437
                           guint       prop_id,
2fc437
                           GValue     *value,
2fc437
                           GParamSpec *pspec)
2fc437
 {
2fc437
         GdmSession *self;
2fc437
 
2fc437
         self = GDM_SESSION (object);
2fc437
 
2fc437
         switch (prop_id) {
2fc437
         case PROP_SESSION_TYPE:
2fc437
                 g_value_set_string (value, self->priv->session_type);
2fc437
                 break;
2fc437
         case PROP_DISPLAY_NAME:
2fc437
                 g_value_set_string (value, self->priv->display_name);
2fc437
                 break;
2fc437
         case PROP_DISPLAY_HOSTNAME:
2fc437
                 g_value_set_string (value, self->priv->display_hostname);
2fc437
                 break;
2fc437
         case PROP_DISPLAY_DEVICE:
2fc437
                 g_value_set_string (value, self->priv->display_device);
2fc437
                 break;
2fc437
         case PROP_DISPLAY_SEAT_ID:
2fc437
                 g_value_set_string (value, self->priv->display_seat_id);
2fc437
                 break;
2fc437
         case PROP_USER_X11_AUTHORITY_FILE:
2fc437
                 g_value_set_string (value, self->priv->user_x11_authority_file);
2fc437
                 break;
2fc437
         case PROP_DISPLAY_X11_AUTHORITY_FILE:
2fc437
                 g_value_set_string (value, self->priv->display_x11_authority_file);
2fc437
                 break;
2fc437
         case PROP_DISPLAY_IS_LOCAL:
2fc437
                 g_value_set_boolean (value, self->priv->display_is_local);
2fc437
                 break;
2fc437
-        case PROP_DISPLAY_IS_INITIAL:
2fc437
-                g_value_set_boolean (value, self->priv->display_is_initial);
2fc437
-                break;
2fc437
         case PROP_VERIFICATION_MODE:
2fc437
                 g_value_set_enum (value, self->priv->verification_mode);
2fc437
                 break;
2fc437
         case PROP_ALLOWED_USER:
2fc437
                 g_value_set_uint (value, self->priv->allowed_user);
2fc437
                 break;
2fc437
         case PROP_CONVERSATION_ENVIRONMENT:
2fc437
                 g_value_set_pointer (value, self->priv->environment);
2fc437
                 break;
2fc437
 #ifdef ENABLE_WAYLAND_SUPPORT
2fc437
         case PROP_IGNORE_WAYLAND:
2fc437
                 g_value_set_boolean (value, self->priv->ignore_wayland);
2fc437
                 break;
2fc437
 #endif
2fc437
         default:
2fc437
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
2fc437
                 break;
2fc437
         }
2fc437
 }
2fc437
 
2fc437
 static void
2fc437
 gdm_session_dispose (GObject *object)
2fc437
 {
2fc437
         GdmSession *self;
2fc437
 
2fc437
         self = GDM_SESSION (object);
2fc437
 
2fc437
         g_debug ("GdmSession: Disposing session");
2fc437
 
2fc437
         gdm_session_close (self);
2fc437
@@ -3749,67 +3731,60 @@ gdm_session_class_init (GdmSessionClass *session_class)
2fc437
 
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_SESSION_TYPE,
2fc437
                                          g_param_spec_string ("session-type",
2fc437
                                                               NULL,
2fc437
                                                               NULL,
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE));
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_DISPLAY_NAME,
2fc437
                                          g_param_spec_string ("display-name",
2fc437
                                                               "display name",
2fc437
                                                               "display name",
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_DISPLAY_HOSTNAME,
2fc437
                                          g_param_spec_string ("display-hostname",
2fc437
                                                               "display hostname",
2fc437
                                                               "display hostname",
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_DISPLAY_IS_LOCAL,
2fc437
                                          g_param_spec_boolean ("display-is-local",
2fc437
                                                                "display is local",
2fc437
                                                                "display is local",
2fc437
                                                                TRUE,
2fc437
                                                                G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
2fc437
         g_object_class_install_property (object_class,
2fc437
-                                         PROP_DISPLAY_IS_INITIAL,
2fc437
-                                         g_param_spec_boolean ("display-is-initial",
2fc437
-                                                               "display is initial",
2fc437
-                                                               "display is initial",
2fc437
-                                                               FALSE,
2fc437
-                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
2fc437
-        g_object_class_install_property (object_class,
2fc437
                                          PROP_DISPLAY_X11_AUTHORITY_FILE,
2fc437
                                          g_param_spec_string ("display-x11-authority-file",
2fc437
                                                               "display x11 authority file",
2fc437
                                                               "display x11 authority file",
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
2fc437
         /* not construct only */
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_USER_X11_AUTHORITY_FILE,
2fc437
                                          g_param_spec_string ("user-x11-authority-file",
2fc437
                                                               "",
2fc437
                                                               "",
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_DISPLAY_DEVICE,
2fc437
                                          g_param_spec_string ("display-device",
2fc437
                                                               "display device",
2fc437
                                                               "display device",
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
2fc437
 
2fc437
         g_object_class_install_property (object_class,
2fc437
                                          PROP_DISPLAY_SEAT_ID,
2fc437
                                          g_param_spec_string ("display-seat-id",
2fc437
                                                               "display seat id",
2fc437
                                                               "display seat id",
2fc437
                                                               NULL,
2fc437
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
2fc437
 
2fc437
-- 
2fc437
2.12.2
2fc437