summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac20
-rw-r--r--daemon/gdm-simple-slave.c27
-rw-r--r--daemon/gdm-static-display.c23
-rw-r--r--daemon/main.c14
4 files changed, 61 insertions, 23 deletions
diff --git a/configure.ac b/configure.ac
index 0531d198..b09c6f0d 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 9bc85226..8f5f0c6d 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -517,6 +517,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) {
@@ -730,6 +734,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;
@@ -830,6 +851,8 @@ create_new_session (GdmSimpleSlave *slave)
slave);
start_autologin_conversation_if_necessary (slave);
+
+ touch_marker_file (slave);
}
static void
@@ -1245,6 +1268,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 6d02ad36..834976b0 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -146,6 +146,12 @@ write_pid (void)
}
static void
+delete_first_run_marker (void)
+{
+ g_unlink (GDM_RAN_ONCE_MARKER_FILE);
+}
+
+static void
check_logdir (void)
{
struct stat statbuf;
@@ -162,6 +168,7 @@ check_logdir (void)
}
g_chmod (log_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
}
+
}
static void
@@ -486,6 +493,10 @@ main (int argc,
set_effective_user_group (0, 0);
check_logdir ();
+ /* Set up /var/run/gdm */
+ g_mkdir_with_parents (GDM_RAN_ONCE_MARKER_DIR, 0755);
+ g_chmod (GDM_RAN_ONCE_MARKER_DIR, S_IRWXU | S_IRWXG);
+
/* XDM compliant error message */
if (getuid () != 0) {
/* make sure the pid file doesn't get wiped */
@@ -500,6 +511,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);