diff options
-rw-r--r-- | configure.ac | 20 | ||||
-rw-r--r-- | daemon/gdm-simple-slave.c | 27 | ||||
-rw-r--r-- | daemon/gdm-static-display.c | 23 | ||||
-rw-r--r-- | daemon/main.c | 15 |
4 files changed, 62 insertions, 23 deletions
diff --git a/configure.ac b/configure.ac index d3635cf4..caa2bc25 100644 --- a/configure.ac +++ b/configure.ac @@ -1333,6 +1333,26 @@ AC_SUBST(GDM_PID_FILE) AC_DEFINE_UNQUOTED(GDM_PID_FILE, "$GDM_PID_FILE", [pid file]) dnl --------------------------------------------------------------------------- +dnl - ran once marker +dnl --------------------------------------------------------------------------- + +AC_ARG_WITH(ran-once-marker-directory, + AS_HELP_STRING([--with-ran-once-marker-directory=<dir>], + [ran once marker directory])) + +if ! test -z "$with_ran_once_marker_directory"; then + GDM_RAN_ONCE_MARKER_DIR=$with_ran_once_marker_directory +else + GDM_RAN_ONCE_MARKER_DIR=${localstatedir}/run/gdm +fi +AC_SUBST(GDM_RAN_ONCE_MARKER_DIR) +AC_DEFINE_UNQUOTED(GDM_RAN_ONCE_MARKER_DIR, "$GDM_RAN_ONCE_MARKER_DIR", [ran once marker dir]) + +GDM_RAN_ONCE_MARKER_FILE="$GDM_RAN_ONCE_MARKER_DIR/ran-once-marker" +AC_SUBST(GDM_RAN_ONCE_MARKER_FILE) +AC_DEFINE_UNQUOTED(GDM_RAN_ONCE_MARKER_FILE, "$GDM_RAN_ONCE_MARKER_FILE", [ran once marker file]) + +dnl --------------------------------------------------------------------------- dnl - GREETER WORKING DIRECTORY dnl --------------------------------------------------------------------------- diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c index 4bbf503c..8838a2a6 100644 --- a/daemon/gdm-simple-slave.c +++ b/daemon/gdm-simple-slave.c @@ -521,6 +521,10 @@ start_autologin_conversation_if_necessary (GdmSimpleSlave *slave) { gboolean enabled; + if (g_file_test (GDM_RAN_ONCE_MARKER_FILE, G_FILE_TEST_EXISTS)) { + return; + } + gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, NULL); if (!enabled) { @@ -734,6 +738,23 @@ on_session_cancelled (GdmSession *session, } static void +touch_marker_file (GdmSimpleSlave *slave) +{ + int fd; + + fd = g_creat (GDM_RAN_ONCE_MARKER_FILE, 0644); + + if (fd < 0 && errno != EEXIST) { + g_warning ("could not create %s to mark run, this may cause auto login " + "to repeat: %m", GDM_RAN_ONCE_MARKER_FILE); + return; + } + + fsync (fd); + close (fd); +} + +static void create_new_session (GdmSimpleSlave *slave) { gboolean display_is_local; @@ -834,6 +855,8 @@ create_new_session (GdmSimpleSlave *slave) slave); start_autologin_conversation_if_necessary (slave); + + touch_marker_file (slave); } static void @@ -1249,6 +1272,10 @@ wants_autologin (GdmSimpleSlave *slave) int delay = 0; /* FIXME: handle wait-for-go */ + if (g_file_test (GDM_RAN_ONCE_MARKER_FILE, G_FILE_TEST_EXISTS)) { + return FALSE; + } + gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, &delay); return enabled && delay == 0; } diff --git a/daemon/gdm-static-display.c b/daemon/gdm-static-display.c index 1806be94..8e7254da 100644 --- a/daemon/gdm-static-display.c +++ b/daemon/gdm-static-display.c @@ -46,7 +46,6 @@ struct GdmStaticDisplayPrivate { GdmDBusStaticDisplay *skeleton; - gboolean first_login; }; static void gdm_static_display_class_init (GdmStaticDisplayClass *klass); @@ -117,30 +116,11 @@ gdm_static_display_unmanage (GdmDisplay *display) { g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); - GDM_STATIC_DISPLAY (display)->priv->first_login = FALSE; - GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->unmanage (display); return TRUE; } -static void -gdm_static_display_get_timed_login_details (GdmDisplay *display, - gboolean *enabledp, - char **usernamep, - int *delayp) -{ - GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->get_timed_login_details (display, enabledp, usernamep, delayp); - - if (!GDM_STATIC_DISPLAY (display)->priv->first_login) { - /* if this is autologin but not timed login, then disable - * autologin after the first one */ - if (*enabledp && *delayp == 0) { - *enabledp = FALSE; - } - } -} - static GObject * gdm_static_display_constructor (GType type, guint n_construct_properties, @@ -185,7 +165,6 @@ gdm_static_display_class_init (GdmStaticDisplayClass *klass) display_class->manage = gdm_static_display_manage; display_class->finish = gdm_static_display_finish; display_class->unmanage = gdm_static_display_unmanage; - display_class->get_timed_login_details = gdm_static_display_get_timed_login_details; g_type_class_add_private (klass, sizeof (GdmStaticDisplayPrivate)); } @@ -195,8 +174,6 @@ gdm_static_display_init (GdmStaticDisplay *static_display) { static_display->priv = GDM_STATIC_DISPLAY_GET_PRIVATE (static_display); - - static_display->priv->first_login = TRUE; } GdmDisplay * diff --git a/daemon/main.c b/daemon/main.c index c9b39899..b1c644f3 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -145,6 +145,12 @@ write_pid (void) atexit (delete_pid); } +static void +delete_first_run_marker (void) +{ + g_unlink (GDM_RAN_ONCE_MARKER_FILE); +} + static gboolean ensure_dir_with_perms (const char *path, uid_t uid, @@ -178,6 +184,12 @@ gdm_daemon_ensure_dirs (uid_t uid, { GError *error = NULL; + /* Set up /var/run/gdm */ + if (!ensure_dir_with_perms (GDM_RAN_ONCE_MARKER_DIR, 0, gid, (S_IRWXU | S_IRWXG), &error)) { + gdm_fail (_("Failed to create ran once marker dir %s: %s"), + GDM_RAN_ONCE_MARKER_DIR, error->message); + } + /* Set up /var/gdm */ if (!ensure_dir_with_perms (AUTHDIR, uid, gid, (S_IRWXU | S_IRWXG | S_ISVTX), &error)) { gdm_fail (_("Failed to create AuthDir %s: %s"), @@ -421,6 +433,9 @@ main (int argc, delete_pid (); write_pid (); + /* clean up any stale ran once marker file that may be lingering */ + delete_first_run_marker (); + g_chdir (AUTHDIR); main_loop = g_main_loop_new (NULL, FALSE); |