...
 
Commits (85)
...@@ -102,7 +102,6 @@ daemon/test-session-client ...@@ -102,7 +102,6 @@ daemon/test-session-client
daemon/test-external-greeter daemon/test-external-greeter
daemon/gdm-session-enum-types.c daemon/gdm-session-enum-types.c
daemon/gdm-session-enum-types.h daemon/gdm-session-enum-types.h
data/gdm.schemas.in
data/applications/gnome-mag.desktop data/applications/gnome-mag.desktop
data/applications/gnome-shell.desktop data/applications/gnome-shell.desktop
data/applications/gnome-shell-wayland.desktop data/applications/gnome-shell-wayland.desktop
......
stages:
- build
build-fedora:
image: fedora:28
stage: build
before_script:
- dnf -y install
accountsservice-devel
audit-libs-devel
autoconf
automake
check-devel
dconf
desktop-file-utils
gettext-devel
gobject-introspection-devel
gtk3-devel
iso-codes-devel
keyutils-libs-devel
libXau-devel
libXdmcp-devel
libattr-devel
libcanberra-devel
libdmx-devel
libselinux-devel
libtool
make
nss-devel
pam-devel
plymouth-devel
redhat-rpm-config
systemd
systemd-devel
which
xorg-x11-server-Xorg
xorg-x11-server-devel
yelp-devel
yelp-tools
script:
- ./autogen.sh
- make -j
- make -j check
- make -j distcheck
except:
- tags
To see the development history of this module, please visit:
http://git.gnome.org/cgit/gdm
or run
git clone git://git.gnome.org/gdm
followed by
git log
Building
========
Dependencies
* glib 2.12 or later
* D-Bus 1.0 and Glib bindings
* PAM
* ConsoleKit 0.2.3
* gnome-vfs (for file monitoring in greeter)
Getting From SVN
To get the very latest copy you'll need to pull it from SVN. Here's
how you'll do it.
svn co http://svn.gnome.org/svn/gdm/trunk gdm
Browse the code in SVN: http://svn.gnome.org/viewcvs/gdm/trunk/
Making Changes
==============
* Patches must be submitted in unified diff form. Using the "-p"
option is strongly preferred.
See:
http://www.xenomai.org/index.php/Teaching_-p_to_svn_diff
* All but the most trivial patches must be submitted to GNOME
bugzilla or the GDM mailing list <gdm-list@gnome.org> for approval.
* Patches must apply cleanly to SVN trunk.
* Patches should not introduce additional compilation warnings.
* Patches must use the GDM Coding Style.
Coding Style Coding Style
============ ============
...@@ -83,4 +43,4 @@ Coding Style ...@@ -83,4 +43,4 @@ Coding Style
* Prefer glib functions over native ones when available. * Prefer glib functions over native ones when available.
* Use glib string handling functions when possible. * Use glib string handling functions when possible.
* When in doubt copy the style of the rest of the file. * When in doubt copy the style of the rest of the file.
\ No newline at end of file
...@@ -24,8 +24,7 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} ...@@ -24,8 +24,7 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
EXTRA_DIST = \ EXTRA_DIST = \
MAINTAINERS \ MAINTAINERS \
ChangeLog \ README.md \
README \
$(NULL) $(NULL)
DISTCLEANFILES = \ DISTCLEANFILES = \
......
===============
Version 3.29.91
===============
- CVE-2018-14424 - double free fix
- follow up fixes dealing with login screen reaping form last release
- add more debug logging
- Translation updates
===============
Version 3.29.90
===============
- display wayland on certain server machines
- lifecycle fixes to libgdm/GdmClient
- drop intltool
- build goo clean ups
- kill login screen when not in use
- clean up stale utmp entries
- misc fixes
- Translation updates
============== ==============
Version 3.29.1 Version 3.29.1
============== ==============
......
GDM - GNOME Display Manager
http://wiki.gnome.org/Projects/GDM/
The GNOME Display Manager is a system service that is responsible for
providing graphical log-ins and managing local and remote displays.
Installation
============
See the file 'INSTALL'.
How to report bugs
==================
Bugs should be reported to the GNOME bug tracking
system:
http://bugzilla.gnome.org/enter_bug.cgi?product=gdm
You will need to create an account if you don't have one already.
Please read the following page on how to prepare a useful
bug report:
https://bugzilla.gnome.org/page.cgi?id=bug-writing.html
How to submit patches
=====================
See the file 'HACKING'.
GDM - GNOME Display Manager
===========================
http://wiki.gnome.org/Projects/GDM/
The GNOME Display Manager is a system service that is responsible for
providing graphical log-ins and managing local and remote displays.
## Building and installing
To build and install GDM from source, just execute the following commands:
```
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```
## Contributing
You can browse the code, issues and more at GDM's [GitLab repository].
If you find a bug in GDM, please file an issue on the [issue tracker]. Please
try to add reproducible steps and the relevant version of GDM.
If you want to contribute functionality or bug fixes, please open a Merge
Request (MR). For more info on how to do this, see GitLab's [help pages on
MR's]. Please also follow the GDM coding style, which is documented in
`HACKING`.
If GDM is not translated in your language or you believe that the
current translation has errors, you can join one of the various translation
teams in GNOME. Translators do not commit directly to Git, but are advised to
use our separate translation infrastructure instead. More info can be found at
the [translation project wiki page].
## Licensing
GDM is licensed under the GNU General Public License v2.0. For more info, see
the `COPYING` file.
[help pages on MR's]: https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html
[GitLab repository]: https://gitlab.gnome.org/GNOME/gdm
[issue tracker]: https://gitlab.gnome.org/GNOME/gdm/issues
[translation project wiki page]: https://wiki.gnome.org/TranslationProject/
...@@ -13,15 +13,8 @@ if test -z $AUTORECONF; then ...@@ -13,15 +13,8 @@ if test -z $AUTORECONF; then
exit 1 exit 1
fi fi
INTLTOOLIZE=`which intltoolize`
if test -z $INTLTOOLIZE; then
echo "*** No intltoolize found, please install the intltool package ***"
exit 1
fi
set -e set -e
intltoolize --force --copy --automake
autoreconf --force --install --verbose autoreconf --force --install --verbose
cd $olddir cd $olddir
......
...@@ -33,12 +33,6 @@ noinst_LTLIBRARIES = \ ...@@ -33,12 +33,6 @@ noinst_LTLIBRARIES = \
gdmdir = $(datadir)/gdm gdmdir = $(datadir)/gdm
gdm_DATA = gdb-cmd gdm_DATA = gdb-cmd
if MKDTEMP_MISSING
MKDTEMP_FILES = mkdtemp.c mkdtemp.h
else
MKDTEMP_FILES =
endif
libgdmcommon_la_SOURCES = \ libgdmcommon_la_SOURCES = \
gdm-address.h \ gdm-address.h \
gdm-address.c \ gdm-address.c \
...@@ -59,7 +53,6 @@ libgdmcommon_la_SOURCES = \ ...@@ -59,7 +53,6 @@ libgdmcommon_la_SOURCES = \
gdm-settings-direct.h \ gdm-settings-direct.h \
gdm-log.h \ gdm-log.h \
gdm-log.c \ gdm-log.c \
$(MKDTEMP_FILES) \
$(NULL) $(NULL)
libgdmcommon_la_CPPFLAGS = \ libgdmcommon_la_CPPFLAGS = \
...@@ -94,7 +87,5 @@ test_log_LDADD = \ ...@@ -94,7 +87,5 @@ test_log_LDADD = \
$(NULL) $(NULL)
EXTRA_DIST = \ EXTRA_DIST = \
mkdtemp.c \
mkdtemp.h \
$(gdm_DATA) \ $(gdm_DATA) \
$(NULL) $(NULL)
...@@ -36,10 +36,6 @@ ...@@ -36,10 +36,6 @@
#include "gdm-common.h" #include "gdm-common.h"
#ifndef HAVE_MKDTEMP
#include "mkdtemp.h"
#endif
#include <systemd/sd-login.h> #include <systemd/sd-login.h>
#define GDM_DBUS_NAME "org.gnome.DisplayManager" #define GDM_DBUS_NAME "org.gnome.DisplayManager"
...@@ -48,12 +44,6 @@ ...@@ -48,12 +44,6 @@
G_DEFINE_QUARK (gdm-common-error, gdm_common_error); G_DEFINE_QUARK (gdm-common-error, gdm_common_error);
const char *
gdm_make_temp_dir (char *template)
{
return mkdtemp (template);
}
gboolean gboolean
gdm_clear_close_on_exec_flag (int fd) gdm_clear_close_on_exec_flag (int fd)
{ {
...@@ -362,10 +352,10 @@ create_transient_display (GDBusConnection *connection, ...@@ -362,10 +352,10 @@ create_transient_display (GDBusConnection *connection,
return TRUE; return TRUE;
} }
static gboolean gboolean
activate_session_id (GDBusConnection *connection, gdm_activate_session_by_id (GDBusConnection *connection,
const char *seat_id, const char *seat_id,
const char *session_id) const char *session_id)
{ {
GError *local_error = NULL; GError *local_error = NULL;
GVariant *reply; GVariant *reply;
...@@ -391,13 +381,14 @@ activate_session_id (GDBusConnection *connection, ...@@ -391,13 +381,14 @@ activate_session_id (GDBusConnection *connection,
return TRUE; return TRUE;
} }
static gboolean gboolean
get_login_window_session_id (const char *seat_id, gdm_get_login_window_session_id (const char *seat_id,
char **session_id) char **session_id)
{ {
gboolean ret; gboolean ret;
int res, i; int res, i;
char **sessions; char **sessions;
char *service_id;
char *service_class; char *service_class;
char *state; char *state;
...@@ -409,13 +400,19 @@ get_login_window_session_id (const char *seat_id, ...@@ -409,13 +400,19 @@ get_login_window_session_id (const char *seat_id,
if (sessions == NULL || sessions[0] == NULL) { if (sessions == NULL || sessions[0] == NULL) {
*session_id = NULL; *session_id = NULL;
ret = TRUE; ret = FALSE;
goto out; goto out;
} }
for (i = 0; sessions[i]; i ++) { for (i = 0; sessions[i]; i ++) {
res = sd_session_get_class (sessions[i], &service_class); res = sd_session_get_class (sessions[i], &service_class);
if (res < 0) { if (res < 0) {
if (res == -ENOENT) {
free (service_class);
continue;
}
g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res)); g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
ret = FALSE; ret = FALSE;
goto out; goto out;
...@@ -441,21 +438,35 @@ get_login_window_session_id (const char *seat_id, ...@@ -441,21 +438,35 @@ get_login_window_session_id (const char *seat_id,
} }
free (state); free (state);
*session_id = g_strdup (sessions[i]); res = sd_session_get_service (sessions[i], &service_id);
ret = TRUE; if (res < 0) {
break; g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
ret = FALSE;
goto out;
}
if (strcmp (service_id, "gdm-launch-environment") == 0) {
*session_id = g_strdup (sessions[i]);
ret = TRUE;
free (service_id);
goto out;
}
free (service_id);
} }
*session_id = NULL; *session_id = NULL;
ret = TRUE; ret = FALSE;
out: out:
for (i = 0; sessions[i]; i ++) { if (sessions) {
free (sessions[i]); for (i = 0; sessions[i]; i ++) {
} free (sessions[i]);
}
free (sessions); free (sessions);
}
return ret; return ret;
} }
...@@ -516,9 +527,9 @@ goto_login_session (GDBusConnection *connection, ...@@ -516,9 +527,9 @@ goto_login_session (GDBusConnection *connection,
return FALSE; return FALSE;
} }
res = get_login_window_session_id (seat_id, &session_id); res = gdm_get_login_window_session_id (seat_id, &session_id);
if (res && session_id != NULL) { if (res && session_id != NULL) {
res = activate_session_id (connection, seat_id, session_id); res = gdm_activate_session_by_id (connection, seat_id, session_id);
if (res) { if (res) {
ret = TRUE; ret = TRUE;
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#define _GDM_COMMON_H #define _GDM_COMMON_H
#include <glib-unix.h> #include <glib-unix.h>
#include <gio/gio.h>
#include <pwd.h> #include <pwd.h>
#include <errno.h> #include <errno.h>
...@@ -49,10 +51,10 @@ gboolean gdm_get_pwent_for_name (const char *name, ...@@ -49,10 +51,10 @@ gboolean gdm_get_pwent_for_name (const char *name,
gboolean gdm_clear_close_on_exec_flag (int fd); gboolean gdm_clear_close_on_exec_flag (int fd);
const char * gdm_make_temp_dir (char *template);
char *gdm_generate_random_bytes (gsize size, char *gdm_generate_random_bytes (gsize size,
GError **error); GError **error);
gboolean gdm_get_login_window_session_id (const char *seat_id,
char **session_id);
gboolean gdm_goto_login_session (GError **error); gboolean gdm_goto_login_session (GError **error);
GPtrArray *gdm_get_script_environment (const char *username, GPtrArray *gdm_get_script_environment (const char *username,
...@@ -71,6 +73,10 @@ char * gdm_shell_expand (const char *str, ...@@ -71,6 +73,10 @@ char * gdm_shell_expand (const char *str,
GdmExpandVarFunc expand_func, GdmExpandVarFunc expand_func,
gpointer user_data); gpointer user_data);
gboolean gdm_activate_session_by_id (GDBusConnection *connection,
const char *seat_id,
const char *session_id);
G_END_DECLS G_END_DECLS
#endif /* _GDM_COMMON_H */ #endif /* _GDM_COMMON_H */
/* Copyright (C) 1999, 2001-2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* Extracted from misc/mkdtemp.c and sysdeps/posix/tempname.c. */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
/* Specification. */
#include "mkdtemp.h"
#include <errno.h>
#ifndef __set_errno
# define __set_errno(Val) errno = (Val)
#endif
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifndef TMP_MAX
# define TMP_MAX 238328
#endif
#if HAVE_STDINT_H_WITH_UINTMAX || _LIBC
# include <stdint.h>
#endif
#if HAVE_INTTYPES_H_WITH_UINTMAX || _LIBC
# include <inttypes.h>
#endif
#if HAVE_UNISTD_H || _LIBC
# include <unistd.h>
#endif
#if HAVE_GETTIMEOFDAY || _LIBC
# if HAVE_SYS_TIME_H || _LIBC
# include <sys/time.h>
# endif
#else
# if HAVE_TIME_H || _LIBC
# include <time.h>
# endif
#endif
#include <sys/stat.h>
#if STAT_MACROS_BROKEN
# undef S_ISDIR
#endif
#if !defined S_ISDIR && defined S_IFDIR
# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
#endif
#if !S_IRUSR && S_IREAD
# define S_IRUSR S_IREAD
#endif
#if !S_IRUSR
# define S_IRUSR 00400
#endif
#if !S_IWUSR && S_IWRITE
# define S_IWUSR S_IWRITE
#endif
#if !S_IWUSR
# define S_IWUSR 00200
#endif
#if !S_IXUSR && S_IEXEC
# define S_IXUSR S_IEXEC
#endif
#if !S_IXUSR
# define S_IXUSR 00100
#endif
#if !_LIBC
# define __getpid getpid
# define __gettimeofday gettimeofday
# define __mkdir mkdir
#endif
/* Use the widest available unsigned type if uint64_t is not
available. The algorithm below extracts a number less than 62**6
(approximately 2**35.725) from uint64_t, so ancient hosts where
uintmax_t is only 32 bits lose about 3.725 bits of randomness,
which is better than not having mkstemp at all. */
#if !defined UINT64_MAX && !defined uint64_t
# define uint64_t uintmax_t
#endif
/* These are the characters used in temporary filenames. */
static const char letters[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
/* Generate a temporary file name based on TMPL. TMPL must match the
rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
does not exist at the time of the call to __gen_tempname. TMPL is
overwritten with the result.
KIND is:
__GT_DIR: create a directory, which will be mode 0700.
We use a clever algorithm to get hard-to-predict names. */
static int
gen_tempname (tmpl)
char *tmpl;
{
int len;
char *XXXXXX;
static uint64_t value;
uint64_t random_time_bits;
int count, fd = -1;
int save_errno = errno;
len = strlen (tmpl);
if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
{
__set_errno (EINVAL);
return -1;
}
/* This is where the Xs start. */
XXXXXX = &tmpl[len - 6];
/* Get some more or less random data. */
#ifdef RANDOM_BITS
RANDOM_BITS (random_time_bits);
#else
# if HAVE_GETTIMEOFDAY || _LIBC
{
struct timeval tv;
__gettimeofday (&tv, NULL);
random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
}
# else
random_time_bits = time (NULL);
# endif
#endif
value += random_time_bits ^ __getpid ();
for (count = 0; count < TMP_MAX; value += 7777, ++count)
{
uint64_t v = value;
/* Fill in the random bits. */
XXXXXX[0] = letters[v % 62];
v /= 62;
XXXXXX[1] = letters[v % 62];
v /= 62;
XXXXXX[2] = letters[v % 62];
v /= 62;
XXXXXX[3] = letters[v % 62];
v /= 62;
XXXXXX[4] = letters[v % 62];
v /= 62;
XXXXXX[5] = letters[v % 62];
fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
if (fd >= 0)
{
__set_errno (save_errno);
return fd;
}
else if (errno != EEXIST)
return -1;
}
/* We got out of the loop because we ran out of combinations to try. */
__set_errno (EEXIST);
return -1;
}
/* Generate a unique temporary directory from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX";
they are replaced with a string that makes the filename unique.
The directory is created, mode 700, and its name is returned.
(This function comes from OpenBSD.) */
char *
mkdtemp (template)
char *template;
{
if (gen_tempname (template))
return NULL;
else
return template;
}
/* Creating a private temporary directory.
Copyright (C) 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#ifndef PARAMS
# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
# define PARAMS(Args) Args
# else
# define PARAMS(Args) ()
# endif
#endif
#if HAVE_MKDTEMP
/* Get mkdtemp() declaration. */
#include <stdlib.h>
#else
/* Create a unique temporary directory from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX";
they are replaced with a string that makes the directory name unique.
Returns TEMPLATE, or a null pointer if it cannot get a unique name.
The directory is created mode 700. */
extern char * mkdtemp PARAMS ((char *template));
#endif
AC_PREREQ([2.60]) AC_PREREQ([2.60])
AC_INIT([gdm], AC_INIT([gdm],
[3.29.1], [3.29.91],
[http://bugzilla.gnome.org/enter_bug.cgi?product=gdm]) [http://bugzilla.gnome.org/enter_bug.cgi?product=gdm])
AC_CONFIG_SRCDIR([daemon/gdm-manager.c]) AC_CONFIG_SRCDIR([daemon/gdm-manager.c])
AM_INIT_AUTOMAKE([1.11.2 no-dist-gzip dist-xz tar-ustar -Wall]) AM_INIT_AUTOMAKE([1.11.2 no-dist-gzip dist-xz tar-ustar -Wall foreign])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AM_MAINTAINER_MODE([enable]) AM_MAINTAINER_MODE([enable])
...@@ -50,7 +50,8 @@ enable_documentation=yes ...@@ -50,7 +50,8 @@ enable_documentation=yes
AM_CONDITIONAL(ENABLE_DOCUMENTATION, test x$enable_documentation = xyes) AM_CONDITIONAL(ENABLE_DOCUMENTATION, test x$enable_documentation = xyes)
# i18n stuff # i18n stuff
IT_PROG_INTLTOOL([0.40.0]) AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.19.8])
GETTEXT_PACKAGE=gdm GETTEXT_PACKAGE=gdm
AC_SUBST(GETTEXT_PACKAGE) AC_SUBST(GETTEXT_PACKAGE)
...@@ -60,7 +61,7 @@ dnl --------------------------------------------------------------------------- ...@@ -60,7 +61,7 @@ dnl ---------------------------------------------------------------------------
dnl - Dependencies dnl - Dependencies
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
GLIB_REQUIRED_VERSION=2.36.0 GLIB_REQUIRED_VERSION=2.44.0
GTK_REQUIRED_VERSION=2.91.1 GTK_REQUIRED_VERSION=2.91.1
LIBCANBERRA_GTK_REQUIRED_VERSION=0.4 LIBCANBERRA_GTK_REQUIRED_VERSION=0.4
ACCOUNTS_SERVICE_REQUIRED_VERSION=0.6.35 ACCOUNTS_SERVICE_REQUIRED_VERSION=0.6.35
...@@ -185,16 +186,6 @@ AC_ARG_ENABLE(gdm-xsession, ...@@ -185,16 +186,6 @@ AC_ARG_ENABLE(gdm-xsession,
enable_gdm_xsession=no) enable_gdm_xsession=no)
AM_CONDITIONAL(ENABLE_GDM_XSESSION, test x$enable_gdm_xsession = xyes) AM_CONDITIONAL(ENABLE_GDM_XSESSION, test x$enable_gdm_xsession = xyes)
AC_ARG_ENABLE(split-authentication,
AS_HELP_STRING([--enable-split-authentication],
[Enable multiple simultaneous PAM conversations during login @<:@default=yes@:>@]),,
enable_split_authentication=yes)
AM_CONDITIONAL(ENABLE_SPLIT_AUTHENTICATION, test x$enable_split_authentication = xyes)
if test x$enable_split_authentication = xyes; then
AC_DEFINE(ENABLE_SPLIT_AUTHENTICATION, 1, [Define if split authentication is enabled])
fi
AC_ARG_ENABLE(user-display-server, AC_ARG_ENABLE(user-display-server,
AS_HELP_STRING([--enable-user-display-server], AS_HELP_STRING([--enable-user-display-server],
[Enable running X server as user @<:@default=yes@:>@]),, [Enable running X server as user @<:@default=yes@:>@]),,
...@@ -339,7 +330,6 @@ AC_CHECK_TYPE(socklen_t,, ...@@ -339,7 +330,6 @@ AC_CHECK_TYPE(socklen_t,,
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
) )
AC_CHECK_HEADERS(sys/sockio.h)
AC_CHECK_FUNCS([setresuid setenv unsetenv clearenv]) AC_CHECK_FUNCS([setresuid setenv unsetenv clearenv])
dnl checks needed for Darwin compatibility to linux **environ. dnl checks needed for Darwin compatibility to linux **environ.
...@@ -384,16 +374,6 @@ AC_CHECK_FUNC(inet_aton,,[ ...@@ -384,16 +374,6 @@ AC_CHECK_FUNC(inet_aton,,[
AC_CHECK_LIB(resolv,inet_aton, [ AC_CHECK_LIB(resolv,inet_aton, [
EXTRA_CHOOSER_LIBS="$EXTRA_CHOOSER_LIBS -lresolv"])]) EXTRA_CHOOSER_LIBS="$EXTRA_CHOOSER_LIBS -lresolv"])])
dnl ---------------------------------------------------------------------------
dnl - Check for mkdtemp
dnl ---------------------------------------------------------------------------
mkdtemp_missing=false
AC_CHECK_FUNC(mkdtemp,
[AC_DEFINE([HAVE_MKDTEMP], 1, [Have GlibC function to make temp dirs])],
mkdtemp_missing=true)
AM_CONDITIONAL(MKDTEMP_MISSING, test x$mkdtemp_missing = xtrue)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for IPv6 dnl - Check for IPv6
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
...@@ -556,24 +536,6 @@ AC_CHECK_LIB(keyutils, keyctl_read, [ ...@@ -556,24 +536,6 @@ AC_CHECK_LIB(keyutils, keyctl_read, [
AC_SUBST(KEYUTILS_LIBS) AC_SUBST(KEYUTILS_LIBS)
AC_SUBST(KEYUTILS_CFLAGS) AC_SUBST(KEYUTILS_CFLAGS)
dnl Check if we can use the setpenv function to add specialvariable
dnl to the environment (such as the /etc/environment file under AIX)
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
#ifdef HAVE_USERSEC_H
#include <usersec.h>
#endif
]],[[
return (setpenv(NULL, (PENV_INIT | PENV_NOEXEC), NULL, NULL));
]])],
can_use_setpenv=yes,
can_use_setpenv=no)
if test x$can_use_setpenv = xyes ; then
AC_DEFINE(CAN_USE_SETPENV,,[Define this variable if the code to use
the setpenv function can be compiled and used])
fi
# #
# Can we use BSD's setusercontext # Can we use BSD's setusercontext
# #
...@@ -587,12 +549,6 @@ AC_CHECK_HEADER(login_cap.h, [ ...@@ -587,12 +549,6 @@ AC_CHECK_HEADER(login_cap.h, [
AC_CHECK_HEADERS(sys/sockio.h, [ AC_CHECK_HEADERS(sys/sockio.h, [
AC_DEFINE(HAVE_SYS_SOCKIO_H, 1, [Define if we have sys/sockio.h])]) AC_DEFINE(HAVE_SYS_SOCKIO_H, 1, [Define if we have sys/sockio.h])])
#
# Check for libgen.h
#
AC_CHECK_HEADERS(libgen.h, [
AC_DEFINE(HAVE_LIBGEN_H, 1, [Define if we have libgen.h])])
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for POSIX version of getpwnam_r dnl - Check for POSIX version of getpwnam_r
...@@ -811,46 +767,6 @@ fi ...@@ -811,46 +767,6 @@ fi
AC_SUBST(LIBWRAP_LIBS) AC_SUBST(LIBWRAP_LIBS)
dnl ---------------------------------------------------------------------------
dnl - Check for XFT2 (for gdm-settings-daemon)
dnl ---------------------------------------------------------------------------
if $PKG_CONFIG --exists xft ; then
AC_DEFINE(HAVE_XFT2,,[Define if Xft functionality is available])
fi
dnl ---------------------------------------------------------------------------
dnl - Check for Xinput
dnl ---------------------------------------------------------------------------
have_xinput=
AC_CHECK_LIB(Xi, XOpenDevice, XINPUT_LIBS=-lXi)
if test "x$XINPUT_LIBS" = x; then
save_LIBS="$LIBS"
for xinputpath in $x_libraries /usr/X11R6/lib /usr/openwin/lib; do
LIBS="-L$xinputpath -lXi"
if test x$os_solaris = xyes ; then
XINPUT_RPATH_FLAGS="-R$xinputpath"
fi
AC_MSG_CHECKING(for -lXi in $xinputpath)
AC_TRY_LINK([], [XOpenDevice()], [
AC_MSG_RESULT(yes)
XINPUT_LIBS="$XINPUT_RPATH_FLAGS -L$xinputpath -lXi"
LIBS="$save_LIBS"
break],[AC_MSG_RESULT(no)])
done
if test "x$XINPUT_LIBS" = x; then
AC_MSG_ERROR(Couldn't find the XInput library. Check config.log for details)
fi
fi
AC_CHECK_HEADER(X11/extensions/XInput.h, have_xinput=yes)
if test "x$have_xinput" = xyes; then
AC_DEFINE(HAVE_XINPUT, 1, [Define if have xinput])
X_EXTRA_LIBS="$X_EXTRA_LIBS $XINPUT_LIBS"
fi
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for Xinerama dnl - Check for Xinerama
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
...@@ -1039,12 +955,6 @@ fi ...@@ -1039,12 +955,6 @@ fi
AC_SUBST(RBAC_LIBS) AC_SUBST(RBAC_LIBS)
dnl ---------------------------------------------------------------------------
dnl check for backtrace support
dnl ---------------------------------------------------------------------------
AC_CHECK_HEADERS(execinfo.h)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl check for process control dnl check for process control
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
...@@ -1202,12 +1112,6 @@ AC_SUBST(EXTRA_DYNAMIC_LIBS) ...@@ -1202,12 +1112,6 @@ AC_SUBST(EXTRA_DYNAMIC_LIBS)
AC_SUBST(EXTRA_SETUP_LIBS) AC_SUBST(EXTRA_SETUP_LIBS)
AC_SUBST(EXTRA_TEST_LIBS) AC_SUBST(EXTRA_TEST_LIBS)
# Check for Solaris logindevperm support
#
AC_CHECK_LIB(devinfo, di_devperm_login, [
AC_DEFINE(HAVE_LOGINDEVPERM)
PAM_LIBS="$PAM_LIBS -ldevinfo" ])
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for X Server location dnl - Check for X Server location
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
......
...@@ -310,7 +310,7 @@ _create_xauth_file_for_user (const char *username, ...@@ -310,7 +310,7 @@ _create_xauth_file_for_user (const char *username,
g_debug ("GdmDisplayAccessFile: creating xauth directory %s", template); g_debug ("GdmDisplayAccessFile: creating xauth directory %s", template);
/* Initially create with mode 01700 then later chmod after we create database */ /* Initially create with mode 01700 then later chmod after we create database */
errno = 0; errno = 0;
dir_name = gdm_make_temp_dir (template); dir_name = g_mkdtemp (template);
if (dir_name == NULL) { if (dir_name == NULL) {
g_set_error (error, g_set_error (error,
G_FILE_ERROR, G_FILE_ERROR,
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
struct GdmDisplayFactoryPrivate struct GdmDisplayFactoryPrivate
{ {
GdmDisplayStore *display_store; GdmDisplayStore *display_store;
guint purge_displays_id;
}; };
enum { enum {
...@@ -59,6 +60,41 @@ gdm_display_factory_error_quark (void) ...@@ -59,6 +60,41 @@ gdm_display_factory_error_quark (void)
return ret; return ret;
} }
static gboolean
purge_display (char *id,
GdmDisplay *display,
gpointer user_data)
{
int status;
status = gdm_display_get_status (display);
switch (status) {
case GDM_DISPLAY_FINISHED:
case GDM_DISPLAY_FAILED:
return TRUE;
default:
return FALSE;
}
}
static void
purge_displays (GdmDisplayFactory *factory)
{
factory->priv->purge_displays_id = 0;
gdm_display_store_foreach_remove (factory->priv->display_store,
(GdmDisplayStoreFunc)purge_display,
NULL);
}
void
gdm_display_factory_queue_purge_displays (GdmDisplayFactory *factory)
{
if (factory->priv->purge_displays_id == 0) {
factory->priv->purge_displays_id = g_idle_add ((GSourceFunc) purge_displays, factory);
}
}
GdmDisplayStore * GdmDisplayStore *
gdm_display_factory_get_display_store (GdmDisplayFactory *factory) gdm_display_factory_get_display_store (GdmDisplayFactory *factory)
{ {
...@@ -187,5 +223,10 @@ gdm_display_factory_finalize (GObject *object) ...@@ -187,5 +223,10 @@ gdm_display_factory_finalize (GObject *object)
g_return_if_fail (factory->priv != NULL); g_return_if_fail (factory->priv != NULL);
if (factory->priv->purge_displays_id != 0) {
g_source_remove (factory->priv->purge_displays_id);
factory->priv->purge_displays_id = 0;
}
G_OBJECT_CLASS (gdm_display_factory_parent_class)->finalize (object); G_OBJECT_CLASS (gdm_display_factory_parent_class)->finalize (object);
} }
...@@ -64,6 +64,7 @@ GType gdm_display_factory_get_type (void); ...@@ -64,6 +64,7 @@ GType gdm_display_factory_get_type (void);
gboolean gdm_display_factory_start (GdmDisplayFactory *manager); gboolean gdm_display_factory_start (GdmDisplayFactory *manager);
gboolean gdm_display_factory_stop (GdmDisplayFactory *manager); gboolean gdm_display_factory_stop (GdmDisplayFactory *manager);
GdmDisplayStore * gdm_display_factory_get_display_store (GdmDisplayFactory *manager); GdmDisplayStore * gdm_display_factory_get_display_store (GdmDisplayFactory *manager);
void gdm_display_factory_queue_purge_displays (GdmDisplayFactory *manager);
G_END_DECLS G_END_DECLS
......
...@@ -76,15 +76,10 @@ stored_display_new (GdmDisplayStore *store, ...@@ -76,15 +76,10 @@ stored_display_new (GdmDisplayStore *store,
static void static void
stored_display_free (StoredDisplay *stored_display) stored_display_free (StoredDisplay *stored_display)
{ {
char *id;
gdm_display_get_id (stored_display->display, &id, NULL);
g_signal_emit (G_OBJECT (stored_display->store), g_signal_emit (G_OBJECT (stored_display->store),
signals[DISPLAY_REMOVED], signals[DISPLAY_REMOVED],
0, 0,
id); stored_display->display);
g_free (id);
g_debug ("GdmDisplayStore: Unreffing display: %p", g_debug ("GdmDisplayStore: Unreffing display: %p",
stored_display->display); stored_display->display);
...@@ -281,9 +276,9 @@ gdm_display_store_class_init (GdmDisplayStoreClass *klass) ...@@ -281,9 +276,9 @@ gdm_display_store_class_init (GdmDisplayStoreClass *klass)
G_STRUCT_OFFSET (GdmDisplayStoreClass, display_removed), G_STRUCT_OFFSET (GdmDisplayStoreClass, display_removed),
NULL, NULL,
NULL, NULL,
g_cclosure_marshal_VOID__STRING, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, G_TYPE_NONE,
1, G_TYPE_STRING); 1, G_TYPE_OBJECT);
g_type_class_add_private (klass, sizeof (GdmDisplayStorePrivate)); g_type_class_add_private (klass, sizeof (GdmDisplayStorePrivate));
} }
......
...@@ -49,7 +49,7 @@ typedef struct ...@@ -49,7 +49,7 @@ typedef struct
void (* display_added) (GdmDisplayStore *display_store, void (* display_added) (GdmDisplayStore *display_store,
const char *id); const char *id);
void (* display_removed) (GdmDisplayStore *display_store, void (* display_removed) (GdmDisplayStore *display_store,
const char *id); GdmDisplay *display);
} GdmDisplayStoreClass; } GdmDisplayStoreClass;
typedef enum typedef enum
......
...@@ -1109,18 +1109,18 @@ register_display (GdmDisplay *self) ...@@ -1109,18 +1109,18 @@ register_display (GdmDisplay *self)
self->priv->object_skeleton = g_dbus_object_skeleton_new (self->priv->id); self->priv->object_skeleton = g_dbus_object_skeleton_new (self->priv->id);
self->priv->display_skeleton = GDM_DBUS_DISPLAY (gdm_dbus_display_skeleton_new ()); self->priv->display_skeleton = GDM_DBUS_DISPLAY (gdm_dbus_display_skeleton_new ());
g_signal_connect (self->priv->display_skeleton, "handle-get-id", g_signal_connect_object (self->priv->display_skeleton, "handle-get-id",
G_CALLBACK (handle_get_id), self); G_CALLBACK (handle_get_id), self, 0);
g_signal_connect (self->priv->display_skeleton, "handle-get-remote-hostname", g_signal_connect_object (self->priv->display_skeleton, "handle-get-remote-hostname",
G_CALLBACK (handle_get_remote_hostname), self); G_CALLBACK (handle_get_remote_hostname), self, 0);
g_signal_connect (self->priv->display_skeleton, "handle-get-seat-id", g_signal_connect_object (self->priv->display_skeleton, "handle-get-seat-id",
G_CALLBACK (handle_get_seat_id), self); G_CALLBACK (handle_get_seat_id), self, 0);
g_signal_connect (self->priv->display_skeleton, "handle-get-x11-display-name", g_signal_connect_object (self->priv->display_skeleton, "handle-get-x11-display-name",
G_CALLBACK (handle_get_x11_display_name), self); G_CALLBACK (handle_get_x11_display_name), self, 0);
g_signal_connect (self->priv->display_skeleton, "handle-is-local", g_signal_connect_object (self->priv->display_skeleton, "handle-is-local",
G_CALLBACK (handle_is_local), self); G_CALLBACK (handle_is_local), self, 0);
g_signal_connect (self->priv->display_skeleton, "handle-is-initial", g_signal_connect_object (self->priv->display_skeleton, "handle-is-initial",
G_CALLBACK (handle_is_initial), self); G_CALLBACK (handle_is_initial), self, 0);
g_dbus_object_skeleton_add_interface (self->priv->object_skeleton, g_dbus_object_skeleton_add_interface (self->priv->object_skeleton,
G_DBUS_INTERFACE_SKELETON (self->priv->display_skeleton)); G_DBUS_INTERFACE_SKELETON (self->priv->display_skeleton));
......
...@@ -62,7 +62,7 @@ extern char **environ; ...@@ -62,7 +62,7 @@ extern char **environ;
struct GdmLaunchEnvironmentPrivate struct GdmLaunchEnvironmentPrivate
{ {
GdmSession *session; GdmSession *session;
char *command; char *session_name;
GPid pid; GPid pid;
GdmSessionVerificationMode verification_mode; GdmSessionVerificationMode verification_mode;
...@@ -94,7 +94,7 @@ enum { ...@@ -94,7 +94,7 @@ enum {
PROP_X11_DISPLAY_IS_LOCAL, PROP_X11_DISPLAY_IS_LOCAL,
PROP_USER_NAME, PROP_USER_NAME,
PROP_RUNTIME_DIR, PROP_RUNTIME_DIR,
PROP_COMMAND, PROP_SESSION_NAME,
}; };
enum { enum {
...@@ -449,7 +449,7 @@ gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment) ...@@ -449,7 +449,7 @@ gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment)
0); 0);
gdm_session_start_conversation (launch_environment->priv->session, "gdm-launch-environment"); gdm_session_start_conversation (launch_environment->priv->session, "gdm-launch-environment");
gdm_session_select_program (launch_environment->priv->session, launch_environment->priv->command); gdm_session_select_session (launch_environment->priv->session, launch_environment->priv->session_name);
if (launch_environment->priv->session_type != NULL) { if (launch_environment->priv->session_type != NULL) {
g_object_set (G_OBJECT (launch_environment->priv->session), g_object_set (G_OBJECT (launch_environment->priv->session),
...@@ -584,11 +584,11 @@ _gdm_launch_environment_set_runtime_dir (GdmLaunchEnvironment *launch_environmen ...@@ -584,11 +584,11 @@ _gdm_launch_environment_set_runtime_dir (GdmLaunchEnvironment *launch_environmen
} }
static void static void
_gdm_launch_environment_set_command (GdmLaunchEnvironment *launch_environment, _gdm_launch_environment_set_session_name (GdmLaunchEnvironment *launch_environment,
const char *name) const char *session_name)
{ {
g_free (launch_environment->priv->command); g_free (launch_environment->priv->session_name);
launch_environment->priv->command = g_strdup (name); launch_environment->priv->session_name = g_strdup (session_name);
} }
static void static void
...@@ -635,8 +635,8 @@ gdm_launch_environment_set_property (GObject *object, ...@@ -635,8 +635,8 @@ gdm_launch_environment_set_property (GObject *object,
case PROP_RUNTIME_DIR: case PROP_RUNTIME_DIR:
_gdm_launch_environment_set_runtime_dir (self, g_value_get_string (value)); _gdm_launch_environment_set_runtime_dir (self, g_value_get_string (value));
break; break;
case PROP_COMMAND: case PROP_SESSION_NAME:
_gdm_launch_environment_set_command (self, g_value_get_string (value)); _gdm_launch_environment_set_session_name (self, g_value_get_string (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
...@@ -688,8 +688,8 @@ gdm_launch_environment_get_property (GObject *object, ...@@ -688,8 +688,8 @@ gdm_launch_environment_get_property (GObject *object,
case PROP_RUNTIME_DIR: case PROP_RUNTIME_DIR:
g_value_set_string (value, self->priv->runtime_dir); g_value_set_string (value, self->priv->runtime_dir);
break; break;
case PROP_COMMAND: case PROP_SESSION_NAME:
g_value_set_string (value, self->priv->command); g_value_set_string (value, self->priv->session_name);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
...@@ -787,10 +787,10 @@ gdm_launch_environment_class_init (GdmLaunchEnvironmentClass *klass) ...@@ -787,10 +787,10 @@ gdm_launch_environment_class_init (GdmLaunchEnvironmentClass *klass)
NULL, NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_COMMAND, PROP_SESSION_NAME,
g_param_spec_string ("command", g_param_spec_string ("session-name",
"command", "session name",
"command", "session name",
NULL, NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
signals [OPENED] = signals [OPENED] =
...@@ -865,7 +865,7 @@ gdm_launch_environment_init (GdmLaunchEnvironment *launch_environment) ...@@ -865,7 +865,7 @@ gdm_launch_environment_init (GdmLaunchEnvironment *launch_environment)
launch_environment->priv = GDM_LAUNCH_ENVIRONMENT_GET_PRIVATE (launch_environment); launch_environment->priv = GDM_LAUNCH_ENVIRONMENT_GET_PRIVATE (launch_environment);
launch_environment->priv->command = NULL; launch_environment->priv->session_name = NULL;
launch_environment->priv->session = NULL; launch_environment->priv->session = NULL;
} }
...@@ -887,7 +887,7 @@ gdm_launch_environment_finalize (GObject *object) ...@@ -887,7 +887,7 @@ gdm_launch_environment_finalize (GObject *object)
g_object_unref (launch_environment->priv->session); g_object_unref (launch_environment->priv->session);
} }
g_free (launch_environment->priv->command); g_free (launch_environment->priv->session_name);
g_free (launch_environment->priv->user_name); g_free (launch_environment->priv->user_name);
g_free (launch_environment->priv->runtime_dir); g_free (launch_environment->priv->runtime_dir);
g_free (launch_environment->priv->x11_display_name); g_free (launch_environment->priv->x11_display_name);
...@@ -902,7 +902,7 @@ gdm_launch_environment_finalize (GObject *object) ...@@ -902,7 +902,7 @@ gdm_launch_environment_finalize (GObject *object)
} }
static GdmLaunchEnvironment * static GdmLaunchEnvironment *
create_gnome_session_environment (const char *session_id, create_gnome_session_environment (const char *session_name,
const char *user_name, const char *user_name,
const char *display_name, const char *display_name,
const char *seat_id, const char *seat_id,
...@@ -911,37 +911,10 @@ create_gnome_session_environment (const char *session_id, ...@@ -911,37 +911,10 @@ create_gnome_session_environment (const char *session_id,
const char *display_hostname, const char *display_hostname,
gboolean display_is_local) gboolean display_is_local)
{ {
gboolean debug = FALSE;
char *command;
GdmLaunchEnvironment *launch_environment; GdmLaunchEnvironment *launch_environment;
char **argv;
GPtrArray *args;
gdm_settings_direct_get_boolean (GDM_KEY_DEBUG, &debug);
args = g_ptr_array_new ();
g_ptr_array_add (args, "gnome-session");
g_ptr_array_add (args, "--autostart");
g_ptr_array_add (args, DATADIR "/gdm/greeter/autostart");
if (debug) {
g_ptr_array_add (args, "--debug");
}
if (session_id != NULL) {
g_ptr_array_add (args, " --session");
g_ptr_array_add (args, (char *) session_id);
}
g_ptr_array_add (args, NULL);
argv = (char **) g_ptr_array_free (args, FALSE);
command = g_strjoinv (" ", argv);
g_free (argv);
launch_environment = g_object_new (GDM_TYPE_LAUNCH_ENVIRONMENT, launch_environment = g_object_new (GDM_TYPE_LAUNCH_ENVIRONMENT,
"command", command, "session-name", session_name,
"user-name", user_name, "user-name", user_name,
"session-type", session_type, "session-type", session_type,
"session-mode", session_mode, "session-mode", session_mode,
...@@ -952,7 +925,6 @@ create_gnome_session_environment (const char *session_id, ...@@ -952,7 +925,6 @@ create_gnome_session_environment (const char *session_id,
"runtime-dir", GDM_SCREENSHOT_DIR, "runtime-dir", GDM_SCREENSHOT_DIR,
NULL); NULL);
g_free (command);
return launch_environment; return launch_environment;
} }
...@@ -963,9 +935,7 @@ gdm_create_greeter_launch_environment (const char *display_name, ...@@ -963,9 +935,7 @@ gdm_create_greeter_launch_environment (const char *display_name,
const char *display_hostname, const char *display_hostname,
gboolean display_is_local) gboolean display_is_local)
{ {
const char *session_name = NULL; return create_gnome_session_environment ("gnome-greeter",
return create_gnome_session_environment (session_name,
GDM_USERNAME, GDM_USERNAME,
display_name, display_name,
seat_id, seat_id,
...@@ -1000,7 +970,7 @@ gdm_create_chooser_launch_environment (const char *display_name, ...@@ -1000,7 +970,7 @@ gdm_create_chooser_launch_environment (const char *display_name,
GdmLaunchEnvironment *launch_environment; GdmLaunchEnvironment *launch_environment;
launch_environment = g_object_new (GDM_TYPE_LAUNCH_ENVIRONMENT, launch_environment = g_object_new (GDM_TYPE_LAUNCH_ENVIRONMENT,
"command", LIBEXECDIR "/gdm-simple-chooser", "session-name", "gdm-simple-chooser",
"verification-mode", GDM_SESSION_VERIFICATION_MODE_CHOOSER, "verification-mode", GDM_SESSION_VERIFICATION_MODE_CHOOSER,
"user-name", GDM_USERNAME, "user-name", GDM_USERNAME,
"x11-display-name", display_name, "x11-display-name", display_name,
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include <glib-object.h> #include <glib-object.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <systemd/sd-login.h>