summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author9 <mkp@mkp.net>1999-12-29 21:06:27 +0000
committerMartin Peterson <mkp@src.gnome.org>1999-12-29 21:06:27 +0000
commitdd1777839a7c07d2f168b1a3163dae2f6c898d42 (patch)
treec47e9f1500822f34947510bbb302510f7d229e90
parentb9dcc8c3c357b613fde6c9ad5983d136c5380976 (diff)
downloadgdm-dd1777839a7c07d2f168b1a3163dae2f6c898d42.tar.gz
Checkin of my devel tree. Some of the new stuff is in. Mostly
1999-12-29 <mkp@mkp.net> * Checkin of my devel tree. Some of the new stuff is in. Mostly infrastructure changes, though. Oh, and it doesn't actually work yet. But it will eventually. Promise! 1999-12-26 <mkp@mkp.net> * daemon/verify-*.c: Move each authentication scheme to a separate file (Sucks to be a translator :). 1999-12-21 <mkp@mkp.net> * daemon/verify.c (gdm_verify_user): Added fix for expired passwords when using PAM (Philip Spencer <pspencer@fields.utoronto.ca>). 1999-11-11 <mkp@mkp.net> * daemon/misc.c (gdm_setenv): New function to work around POSIX brain damage. 1999-11-01 <mkp@mkp.net> * daemon/verify.c (gdm_verify_user): Error in error message. * daemon/slave.c (gdm_slave_greeter_ctl): Nuke random junk that might have accumulated in the ipc pipe. * gui/gdmlogin.c (gdm_login_ctrl_handler): Same as above. * configure.in: Fixed -lnsl (again) 1999-10-03 <mkp@mkp.net> * daemon/slave.c: Misc. hacks to solve #2487. PAM messes with pwent. * daemon/gdm.c (gdm_config_parse): Check that gdmlogin and gdmchooser can be executed by gdm before starting up. 1999-10-02 <mkp@mkp.net> * daemon/slave.c (gdm_slave_greeter_ctl): Fix NULL string passing bug.
-rw-r--r--ChangeLog46
-rw-r--r--README.install5
-rw-r--r--RELEASENOTES1
-rw-r--r--TODO6
-rw-r--r--config/Makefile.am14
-rw-r--r--configure.in99
-rw-r--r--daemon/Makefile.am27
-rw-r--r--daemon/auth.c132
-rw-r--r--daemon/auth.h30
-rw-r--r--daemon/choose.c2
-rw-r--r--daemon/cookie.c6
-rw-r--r--daemon/cookie.h28
-rw-r--r--daemon/display.c187
-rw-r--r--daemon/display.h30
-rw-r--r--daemon/filecheck.c37
-rw-r--r--daemon/filecheck.h27
-rw-r--r--daemon/gdm.c507
-rw-r--r--daemon/gdm.h24
-rw-r--r--daemon/md5.c2
-rw-r--r--daemon/misc.c248
-rw-r--r--daemon/misc.h32
-rw-r--r--daemon/server.c270
-rw-r--r--daemon/slave.c277
-rw-r--r--daemon/slave.h31
-rw-r--r--daemon/verify-crypt.c119
-rw-r--r--daemon/verify-pam.c (renamed from daemon/verify.c)207
-rw-r--r--daemon/verify-shadow.c130
-rw-r--r--daemon/verify.h30
-rw-r--r--daemon/xdmcp.c78
-rw-r--r--daemon/xdmcp.h38
-rw-r--r--docs/C/gdm.sgml14
-rw-r--r--gui/gdmchooser.c100
-rw-r--r--gui/gdmchooser.h2
-rw-r--r--gui/gdmlogin.c48
-rw-r--r--gui/gdmlogin.h2
-rw-r--r--po/POTFILES.in4
-rw-r--r--po/da.po436
-rw-r--r--po/et.po452
-rw-r--r--po/pt_BR.po430
-rw-r--r--po/sv.po412
40 files changed, 2664 insertions, 1906 deletions
diff --git a/ChangeLog b/ChangeLog
index 66d0d9e0..aa49c622 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,57 @@
+1999-12-29 <mkp@mkp.net>
+
+ * Checkin of my devel tree. Some of the new stuff is in. Mostly
+ infrastructure changes, though. Oh, and it doesn't actually work
+ yet. But it will eventually. Promise!
+
+1999-12-26 <mkp@mkp.net>
+
+ * daemon/verify-*.c: Move each authentication scheme to a separate
+ file (Sucks to be a translator :).
+
+1999-12-21 <mkp@mkp.net>
+
+ * daemon/verify.c (gdm_verify_user): Added fix for expired
+ passwords when using PAM (Philip Spencer
+ <pspencer@fields.utoronto.ca>).
+
+1999-11-11 <mkp@mkp.net>
+
+ * daemon/misc.c (gdm_setenv): New function to work around POSIX
+ brain damage.
+
1999-11-10 Yuri Syrota <rasta@renome.rovno.ua>
* configure.in (ALL_LINGUAS): Added uk.
+1999-11-01 <mkp@mkp.net>
+
+ * daemon/verify.c (gdm_verify_user): Error in error message.
+
+ * daemon/slave.c (gdm_slave_greeter_ctl): Nuke random junk that
+ might have accumulated in the ipc pipe.
+
+ * gui/gdmlogin.c (gdm_login_ctrl_handler): Same as above.
+
+ * configure.in: Fixed -lnsl (again)
+
1999-10-21 Sergey Panov <sipan@mit.edu>
* configure.in (ALL_LINGUAS): Added ru.
+1999-10-03 <mkp@mkp.net>
+
+ * daemon/slave.c: Misc. hacks to solve #2487. PAM messes with
+ pwent.
+
+ * daemon/gdm.c (gdm_config_parse): Check that gdmlogin and
+ gdmchooser can be executed by gdm before starting up.
+
+1999-10-02 <mkp@mkp.net>
+
+ * daemon/slave.c (gdm_slave_greeter_ctl): Fix NULL string passing
+ bug.
+
1999-09-30 <mkp@mkp.net>
* config/PreSession, config/PostSession: Example sessreg scripts.
diff --git a/README.install b/README.install
index 5da600bf..fe60cd2c 100644
--- a/README.install
+++ b/README.install
@@ -1,6 +1,9 @@
QUICK NOTES ON INSTALLATION/USE:
-First of all: gdm is a *daemon* -- not a common user application. It
+If you didn't compile Gnome yourself, make sure you have the appropriate
+-devel packages installed.
+
+WARNING: gdm is a *daemon* -- not a common user application. It
requires extensive knowledge about your system setup to install and
configure. gdm isn't - and never will be - Plug and Play
(i.e. ./configure ; make install).
diff --git a/RELEASENOTES b/RELEASENOTES
index fd6b6338..55fd1123 100644
--- a/RELEASENOTES
+++ b/RELEASENOTES
@@ -5,7 +5,6 @@ Otherwise all opcodes of the XDMCP 1.0 spec are supported.
gdmconfig doesn't work. It's only GUI code so far.
-I haven't quite made up my mind whether tab-completion goes back in or not.
diff --git a/TODO b/TODO
index 9d4abb8e..44021639 100644
--- a/TODO
+++ b/TODO
@@ -1,6 +1,4 @@
-POSIXly correct environtment handling.
-
Finish gdmconfig and gdmface.
Both language and country locale selection support.
@@ -9,3 +7,7 @@ Grab root window.
gdmlogin should honor user geometry parameters.
+Keyboard layout menu.
+
+utmp/wtmp handling.
+
diff --git a/config/Makefile.am b/config/Makefile.am
index cd30385a..b217f6e0 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -50,9 +50,11 @@ install-data-hook: gdm.conf gnomerc Gnome
if test '!' -f $(confdir)/gdm.conf; then \
$(INSTALL_DATA) gdm.conf $(confdir)/gdm.conf; \
fi
+
if test '!' -f $(localedir)/locale.alias; then \
$(INSTALL_DATA) $(srcdir)/locale.alias $(localedir)/locale.alias; \
fi
+
if test '!' -d $(sessdir); then \
$(mkinstalldirs) $(sessdir); \
chmod 755 $(sessdir); \
@@ -63,6 +65,7 @@ install-data-hook: gdm.conf gnomerc Gnome
if test '!' -f $(sessdir)/Gnome; then \
$(INSTALL_SCRIPT) Gnome $(sessdir)/Gnome; \
fi
+
if test '!' -d $(initdir); then \
$(mkinstalldirs) $(initdir); \
chmod 755 $(initdir); \
@@ -70,6 +73,7 @@ install-data-hook: gdm.conf gnomerc Gnome
if test '!' -f $(initdir)/Default; then \
$(INSTALL_SCRIPT) $(srcdir)/Default $(initdir)/Default; \
fi
+
if test '!' -d $(predir); then \
$(mkinstalldirs) $(predir); \
chmod 755 $(predir); \
@@ -77,6 +81,7 @@ install-data-hook: gdm.conf gnomerc Gnome
if test '!' -f $(predir)/Default; then \
$(INSTALL_SCRIPT) $(srcdir)/PreSession $(predir)/Default; \
fi
+
if test '!' -d $(postdir); then \
$(mkinstalldirs) $(postdir); \
chmod 755 $(postdir); \
@@ -84,6 +89,15 @@ install-data-hook: gdm.conf gnomerc Gnome
if test '!' -f $(postdir)/Default; then \
$(INSTALL_SCRIPT) $(srcdir)/PostSession $(postdir)/Default; \
fi
+
+ if test '!' -d $(gnomercdir); then \
+ $(mkinstalldirs) $(gnomercdir); \
+ chmod 755 $(gnomercdir); \
+ fi
+ if test '!' -f $(gnomercdir)/gnomerc; then \
+ $(INSTALL_SCRIPT) $(srcdir)/gnomerc $(gnomercdir)/gnomerc; \
+ fi
+
if test '!' -d $(authdir); then \
$(mkinstalldirs) $(authdir); \
chown gdm.gdm $(authdir); \
diff --git a/configure.in b/configure.in
index 4b511d08..cb36209f 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,7 @@
AC_INIT(daemon/gdm.h)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(gdm,2.0beta4)
+AM_INIT_AUTOMAKE(gdm,2.0beta5)
AM_MAINTAINER_MODE
AM_ACLOCAL_INCLUDE(macros)
@@ -23,35 +23,6 @@ dnl ## internationalization support
ALL_LINGUAS="da de es et fr hu ko nl no sv ru pl pt_BR uk tr"
AM_GNOME_GETTEXT
-dnl ## Autentication scheme
-have_pam=no
-AC_CHECK_HEADERS(security/pam_appl.h, [
- have_pam=yes
- LIBS="$LIBS -lpam"
- AC_DEFINE(HAVE_PAM)])
-
-if test $have_pam = no; then
-
- # Check if -lcrypt is necessary
- AC_CHECK_LIB(crypt, crypt, [
- LIBS="$LIBS -lcrypt"])
-
- # Check if crypt lives in a separate header file
- AC_CHECK_HEADERS(crypt.h, [
- AC_DEFINE(HAVE_CRYPT)])
-
- # Check for shadow passwords (hack)
- AC_MSG_CHECKING("for /etc/shadow")
-
- if test -f /etc/shadow; then
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_SHADOW)
- else
- AC_MSG_RESULT(no)
- fi
-
-fi
-
# TCP Wrappers for XDMCP access control
AC_MSG_CHECKING("whether to use TCP wrappers")
LIBWRAP_PATH=""
@@ -69,10 +40,9 @@ for I in $LDFLAGS $LIBS -L/usr/lib; do
done
if test -n "$LIBWRAP_PATH"; then
- AC_MSG_RESULT(yes)
- AC_CHECK_LIB(nsl, yp_get_default_domain, LIBS="$LIBS -lnsl")
+ AC_MSG_RESULT(yes)
else
- AC_MSG_RESULT(no)
+ AC_MSG_RESULT(no)
fi
if test -n "$LIBWRAP_PATH"; then
@@ -92,6 +62,69 @@ if test -n "$LIBWRAP_PATH"; then
fi
LIBS="$LIBS $LIBWRAP_PATH"
+dnl find out if we need -lnsl or whatever
+LIB_NSL=
+if test -n "$LIBWRAP_PATH"; then
+ AC_MSG_CHECKING(whether -lwrap requires -lnsl)
+ ORIG_LIBS="$LIBS"
+ LIBS="$LIBWRAP_PATH $LIBS"
+ AC_TRY_LINK([
+#include <tcpd.h>
+int allow_severity, deny_severity;
+], [return hosts_access;], ,[
+dnl try with -lnsl
+OLD_LIBS="$LIBS"
+LIBS="$LIBS -lnsl"
+AC_TRY_LINK([
+#include <tcpd.h>
+int allow_severity, deny_severity;
+], [return hosts_access;], LIB_NSL="-lnsl",
+LIBWRAP_PATH="")
+LIBS="$OLD_LIBS"
+])
+ LIBS="$ORIG_LIBS"
+if test -n "$LIB_NSL"; then
+ AC_MSG_RESULT(yes)
+ LIBS="$LIBS $LIB_NSL"
+else
+ AC_MSG_RESULT(no)
+fi
+fi
+
+dnl ## Autentication scheme
+have_pam=no
+VRFY="verify-crypt"
+AC_CHECK_HEADERS(security/pam_appl.h, [
+ have_pam=yes
+ LIBS="$LIBS -lpam"
+ VRFY="verify-pam"
+ AC_DEFINE(HAVE_PAM)])
+
+if test $have_pam = no; then
+
+ # Check if -lcrypt is necessary
+ AC_CHECK_LIB(crypt, crypt, [
+ LIBS="$LIBS -lcrypt"])
+
+ # Check if crypt lives in a separate header file
+ AC_CHECK_HEADERS(crypt.h, [
+ AC_DEFINE(HAVE_CRYPT)])
+
+ # Check for shadow passwords (hack)
+ AC_MSG_CHECKING("for /etc/shadow")
+
+ if test -f /etc/shadow; then
+ VRFY="verify-shadow"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SHADOW)
+ else
+ AC_MSG_RESULT(no)
+ fi
+
+fi
+
+AC_SUBST(VRFY)
+
AC_OUTPUT([
Makefile
daemon/Makefile
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 74179235..4fab61e0 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -1,31 +1,42 @@
## Process this file with automake to produce makefile.in
-CFLAGS += -g -Wall \
- -Wpointer-arith \
+CFLAGS += -g -Wall \
+ -Wpointer-arith \
-Wmissing-prototypes -Wmissing-declarations
DEFS += -DGDM_CONFIG_FILE=\"@sysconfdir@/gdm/gdm.conf\"
-INCLUDES = -I. -I.. -I$(includedir) \
- -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
- -DLOCALEDIR=\"$(datadir)/locale\" \
+INCLUDES = -I. -I.. -I$(includedir) \
+ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
+ -DLOCALEDIR=\"$(datadir)/locale\" \
$(GNOME_INCLUDEDIR)
bin_PROGRAMS = gdm
gdm_SOURCES = \
- gdm.c \
+ gdm.c \
gdm.h \
+ display.c \
+ display.h \
slave.c \
+ slave.h \
server.c \
- verify.c \
misc.c \
+ misc.h \
auth.c \
+ auth.h \
cookie.c \
+ cookie.h \
xdmcp.c \
+ xdmcp.h \
choose.c \
filecheck.c \
+ filecheck.h \
md5.c \
- md5.h
+ md5.h \
+ @VRFY@.c \
+ verify.h
+
+EXTRA_gdm_SOURCES = verify-pam.c verify-crypt.c verify-shadow.c
gdm_LDADD = $(GNOME_LIBDIR) $(GNOME_LIBS) -lXdmcp -lXau -lX11 $(INTLLIBS)
diff --git a/daemon/auth.c b/daemon/auth.c
index 9c76f01d..93934e9d 100644
--- a/daemon/auth.c
+++ b/daemon/auth.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -17,26 +17,28 @@
*/
/* Code for cookie handling. This really needs to be modularized to
- * support other XAuth types and possibly DECnet...
- */
+ * support other XAuth types and possibly DECnet... */
#include <config.h>
#include <gnome.h>
-#include <stdio.h>
-#include <stdlib.h>
#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <netdb.h>
+#include <netdb.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
#include <X11/Xauth.h>
#include "gdm.h"
+#include "cookie.h"
+#include "misc.h"
+#include "filecheck.h"
+#include "auth.h"
static const gchar RCSid[]="$Id$";
+
+/* Local prototypes */
+static void gdm_auth_purge (GdmDisplay *d, FILE *af);
+
+/* Configuration option variables */
extern gchar *GdmServAuthDir;
extern gchar *GdmUserAuthDir;
extern gchar *GdmUserAuthFile;
@@ -44,17 +46,15 @@ extern gchar *GdmUserAuthFB;
extern gint GdmUserMaxFile;
extern gint GdmRelaxPerms;
-extern void gdm_cookie_generate (GdmDisplay *d);
-extern void gdm_debug (const gchar *, ...);
-extern void gdm_error (const gchar *, ...);
-extern gboolean gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
- gboolean absentok, gint maxsize, gint perms);
-
-gboolean gdm_auth_secure_display (GdmDisplay *d);
-gboolean gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir);
-void gdm_auth_user_remove (GdmDisplay *d, uid_t user);
-static void gdm_auth_purge (GdmDisplay *d, FILE *af);
+/**
+ * gdm_auth_secure_display:
+ * @d: Pointer to a GdmDisplay struct
+ *
+ * Create authentication cookies for local and remote displays.
+ *
+ * Returns TRUE on success and FALSE on error.
+ */
gboolean
gdm_auth_secure_display (GdmDisplay *d)
@@ -67,24 +67,23 @@ gdm_auth_secure_display (GdmDisplay *d)
guint i;
if (!d)
- return (FALSE);
+ return FALSE;
gdm_debug ("gdm_auth_secure_display: Setting up access for %s", d->name);
- if (!d->authfile)
+ if (! d->authfile)
d->authfile = g_strconcat (GdmServAuthDir, "/", d->name, ".Xauth", NULL);
unlink (d->authfile);
af = fopen (d->authfile, "w");
- if (!af)
- return (FALSE);
+ if (! af)
+ return FALSE;
/* If this is a local display the struct hasn't changed and we
* have to eat up old authentication cookies before baking new
- * ones...
- */
+ * ones... */
if (d->type == TYPE_LOCAL && d->auths) {
GSList *alist = d->auths;
@@ -103,14 +102,15 @@ gdm_auth_secure_display (GdmDisplay *d)
g_free (d->bcookie);
}
+ /* Create new random cookie */
gdm_cookie_generate (d);
- /* FQDN or IP of display host */
+ /* Find FQDN or IP of display host */
hentry = gethostbyname (d->hostname);
if (!hentry) {
gdm_error ("gdm_auth_secure_display: Error getting hentry for %s", d->hostname);
- return (FALSE);
+ return FALSE;
}
/* Local access */
@@ -120,7 +120,7 @@ gdm_auth_secure_display (GdmDisplay *d)
xa = g_new0 (Xauth, 1);
if (!xa)
- return (FALSE);
+ return FALSE;
xa->family = FamilyLocal;
xa->address = strdup (d->hostname);
@@ -137,19 +137,20 @@ gdm_auth_secure_display (GdmDisplay *d)
gdm_debug ("gdm_auth_secure_display: Setting up network access");
- /* Network access */
- for (i=0 ; i < hentry->h_length ; i++) {
+ /* Network access: Write out an authentication entry for each of
+ * this host's official addresses */
+ for (i = 0 ; i < hentry->h_length ; i++) {
xa = g_new0 (Xauth, 1);
- if (!xa)
- return (FALSE);
+ if (! xa)
+ return FALSE;
xa->family = FamilyInternet;
addr = g_new0 (gchar, 4);
if (!addr)
- return (FALSE);
+ return FALSE;
ia = (struct in_addr *) hentry->h_addr_list[i];
@@ -172,15 +173,27 @@ gdm_auth_secure_display (GdmDisplay *d)
}
fclose (af);
- setenv ("XAUTHORITY", d->authfile, TRUE);
+ gdm_setenv ("XAUTHORITY", d->authfile);
gdm_debug ("gdm_auth_secure_display: Setting up access for %s - %d entries",
d->name, g_slist_length (d->auths));
- return (TRUE);
+ return TRUE;
}
+/**
+ * gdm_auth_user_add:
+ * @d: Pointer to a GdmDisplay struct
+ * @user: Userid of the user whose cookie file to add entries to
+ * @homedir: The user's home directory
+ *
+ * Remove all cookies referring to this display from user's cookie
+ * file and append the ones specified in the display's authlist.
+ *
+ * Returns TRUE on success and FALSE on error.
+ */
+
gboolean
gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir)
{
@@ -190,12 +203,12 @@ gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir)
GSList *auths = NULL;
if (!d)
- return (FALSE);
+ return FALSE;
gdm_debug ("gdm_auth_user_add: Adding cookie for %d", user);
/* Determine whether UserAuthDir is specified. Otherwise ~user is used */
- if (strlen (GdmUserAuthDir))
+ if (*GdmUserAuthDir)
authdir = GdmUserAuthDir;
else
authdir = homedir;
@@ -215,7 +228,8 @@ gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir)
gdm_error (_("gdm_auth_user_add: Could not open cookie file %s"), d->userauth);
g_free (d->userauth);
d->userauth = NULL;
- return (FALSE);
+
+ return FALSE;
}
af = fdopen (authfd, "w");
@@ -229,7 +243,8 @@ gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir)
gdm_error (_("gdm_auth_user_add: Could not lock cookie file %s"), d->userauth);
g_free (d->userauth);
d->userauth = NULL;
- return (FALSE);
+
+ return FALSE;
}
af = fopen (d->userauth, "a+");
@@ -241,12 +256,13 @@ gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir)
XauUnlockAuth (d->userauth);
g_free (d->userauth);
d->userauth = NULL;
- return (FALSE);
+
+ return FALSE;
}
gdm_debug ("gdm_auth_user_add: Using %s for cookies", d->userauth);
- /* If not fallback file, nuke any existing cookies for this display */
+ /* If not a fallback file, nuke any existing cookies for this display */
if (! d->authfb)
gdm_auth_purge (d, af);
@@ -260,14 +276,23 @@ gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir)
fclose (af);
XauUnlockAuth (d->userauth);
- setenv ("XAUTHORITY", d->userauth, TRUE);
+ gdm_setenv ("XAUTHORITY", d->userauth);
gdm_debug ("gdm_auth_user_add: Done");
- return (TRUE);
+ return TRUE;
}
+/**
+ * gdm_auth_user_remove:
+ * @d: Pointer to a GdmDisplay struct
+ * @user: Userid of the user whose cookie file to remove entries from
+ *
+ * Remove all cookies referring to this display from user's cookie
+ * file.
+ */
+
void
gdm_auth_user_remove (GdmDisplay *d, uid_t user)
{
@@ -298,11 +323,13 @@ gdm_auth_user_remove (GdmDisplay *d, uid_t user)
if (! gdm_file_check ("gdm_auth_user_remove", user, authdir, authfile,
FALSE, GdmUserMaxFile, GdmRelaxPerms)) {
gdm_error (_("gdm_auth_user_remove: Ignoring suspiciously looking cookie file %s"), d->userauth);
+
return;
}
g_free (authdir);
+ /* Lock user's cookie jar and open it for writing */
if (XauLockAuth (d->userauth, 3, 3, 0) != LOCK_SUCCESS)
return;
@@ -310,11 +337,14 @@ gdm_auth_user_remove (GdmDisplay *d, uid_t user)
if (!af) {
XauUnlockAuth (d->userauth);
+
return;
}
+ /* Purge entries for this display from the cookie jar */
gdm_auth_purge (d, af);
+ /* Close the file and unlock it */
fclose (af);
XauUnlockAuth (d->userauth);
@@ -325,6 +355,14 @@ gdm_auth_user_remove (GdmDisplay *d, uid_t user)
}
+/**
+ * gdm_auth_purge:
+ * @d: Pointer to a GdmDisplay struct
+ * @af: File handle to a cookie file
+ *
+ * Remove all cookies referring to this display a cookie file.
+ */
+
static void
gdm_auth_purge (GdmDisplay *d, FILE *af)
{
@@ -339,8 +377,8 @@ gdm_auth_purge (GdmDisplay *d, FILE *af)
fseek (af, 0L, SEEK_SET);
/* Read the user's entire Xauth file into memory to avoid
- * temporary file issues. Remove any instance of this display in
- * the cookie jar... */
+ * temporary file issues. Then remove any instance of this display
+ * in the cookie jar... */
while ( (xa = XauReadAuth (af)) ) {
gboolean match = FALSE;
@@ -362,10 +400,12 @@ gdm_auth_purge (GdmDisplay *d, FILE *af)
keep = g_slist_append (keep, xa);
}
+ /* Rewind the file */
af = freopen (d->userauth, "w", af);
if (!af) {
XauUnlockAuth (d->userauth);
+
return;
}
diff --git a/daemon/auth.h b/daemon/auth.h
new file mode 100644
index 00000000..0affb746
--- /dev/null
+++ b/daemon/auth.h
@@ -0,0 +1,30 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_AUTH_H
+#define GDM_AUTH_H
+
+#include "gdm.h"
+
+gboolean gdm_auth_secure_display (GdmDisplay *d);
+gboolean gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir);
+void gdm_auth_user_remove (GdmDisplay *d, uid_t user);
+
+#endif /* GDM_AUTH_H */
+
+/* EOF */
diff --git a/daemon/choose.c b/daemon/choose.c
index 062964dd..b8dcf8d6 100644
--- a/daemon/choose.c
+++ b/daemon/choose.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
diff --git a/daemon/cookie.c b/daemon/cookie.c
index d02d7228..efecb9a2 100644
--- a/daemon/cookie.c
+++ b/daemon/cookie.c
@@ -1,5 +1,6 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ * Copyright (C) Rik Faith <faith@precisioninsight.com>
*
* 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
@@ -20,7 +21,6 @@
* Functions for generating MIT-MAGIC-COOKIEs.
*
* This code was derived (i.e. stolen) from mcookie.c written by Rik Faith
- * <faith@cs.unc.edu>
*
*/
@@ -35,6 +35,7 @@
#include "gdm.h"
#include "md5.h"
+#include "cookie.h"
#define MAXBUFFERSIZE 512
@@ -51,7 +52,6 @@ struct rngs {
#define RNGS (sizeof(rngs)/sizeof(struct rngs))
-void gdm_cookie_generate (GdmDisplay *);
void
gdm_cookie_generate (GdmDisplay *d)
diff --git a/daemon/cookie.h b/daemon/cookie.h
new file mode 100644
index 00000000..51f87d14
--- /dev/null
+++ b/daemon/cookie.h
@@ -0,0 +1,28 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_COOKIE_H
+#define GDM_COOKIE_H
+
+#include "gdm.h"
+
+void gdm_cookie_generate (GdmDisplay *);
+
+#endif /* GDM_COOKIE_H */
+
+/* EOF */
diff --git a/daemon/display.c b/daemon/display.c
new file mode 100644
index 00000000..72de9128
--- /dev/null
+++ b/daemon/display.c
@@ -0,0 +1,187 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <gnome.h>
+#include <syslog.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <X11/Xauth.h>
+
+#include "gdm.h"
+#include "display.h"
+#include "slave.h"
+#include "misc.h"
+#include "xdmcp.h"
+
+static const gchar RCSid[]="$Id$";
+
+/* External vars */
+extern gint GdmXdmcp;
+extern gint sessions;
+extern GSList *displays;
+
+
+/**
+ * gdm_display_manage:
+ * @d: Pointer to a GdmDisplay struct
+ *
+ * Manage (Initialize and start login session) display
+ */
+
+gint
+gdm_display_manage (GdmDisplay *d)
+{
+ sigset_t mask, omask;
+
+ if (!d)
+ return FALSE;
+
+ gdm_debug ("gdm_display_manage: Managing %s", d->name);
+
+ /* If we have an old slave process hanging around, kill it */
+ if (d->slavepid) {
+ sigemptyset (&mask);
+ sigaddset (&mask, SIGCHLD);
+ sigprocmask (SIG_BLOCK, &mask, &omask);
+
+ kill (d->slavepid, SIGINT);
+ waitpid (d->slavepid, 0, 0);
+
+ sigprocmask (SIG_SETMASK, &omask, NULL);
+ }
+
+ /* Fork slave process */
+ switch (d->slavepid = fork()) {
+
+ case 0:
+
+ setpgid (0, 0);
+
+ /* Close XDMCP fd in slave process */
+ if (GdmXdmcp)
+ gdm_xdmcp_close ();
+
+ if (d->type == TYPE_LOCAL)
+ gdm_slave_start (d);
+
+ if (d->type == TYPE_XDMCP && d->dispstat == XDMCP_MANAGED)
+ gdm_slave_start (d);
+
+ break;
+
+ case -1:
+ gdm_error (_("gdm_display_manage: Failed forking gdm slave process for %d"), d->name);
+
+ return FALSE;
+
+ default:
+ gdm_debug ("gdm_display_manage: Forked slave: %d", d->slavepid);
+ break;
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * gdm_display_unmanage:
+ * @d: Pointer to a GdmDisplay struct
+ *
+ * Stop services for a display
+ */
+
+void
+gdm_display_unmanage (GdmDisplay *d)
+{
+ if (!d)
+ return;
+
+ gdm_debug ("gdm_display_unmanage: Stopping %s", d->name);
+
+ /* Kill slave and all its children */
+ if (d->slavepid) {
+ kill (-(d->slavepid), SIGTERM);
+ waitpid (d->slavepid, 0, 0);
+ d->slavepid = 0;
+ }
+
+ if (d->type == TYPE_LOCAL)
+ d->dispstat = DISPLAY_DEAD;
+ else /* TYPE_XDMCP */
+ gdm_display_dispose (d);
+}
+
+
+/**
+ * gdm_display_dispose:
+ * @d: Pointer to a GdmDisplay struct
+ *
+ * Deallocate display and all its resources
+ */
+
+void
+gdm_display_dispose (GdmDisplay *d)
+{
+ if (!d)
+ return;
+
+ if (d->type == TYPE_XDMCP) {
+ displays = g_slist_remove (displays, d);
+ sessions--;
+ }
+
+ if (d->name) {
+ gdm_debug ("gdm_display_dispose: Disposing %s", d->name);
+ g_free (d->name);
+ }
+
+ if (d->hostname)
+ g_free (d->hostname);
+
+ if (d->authfile)
+ g_free (d->authfile);
+
+ if (d->auths) {
+ GSList *tmpauth = d->auths;
+
+ while (tmpauth && tmpauth->data) {
+ XauDisposeAuth ((Xauth *) tmpauth->data);
+ tmpauth = tmpauth->next;
+ }
+
+ g_slist_free (d->auths);
+ }
+
+ if (d->userauth)
+ g_free (d->userauth);
+
+ if (d->command)
+ g_free (d->command);
+
+ if (d->cookie)
+ g_free (d->cookie);
+
+ if (d->bcookie)
+ g_free (d->bcookie);
+
+ g_free (d);
+}
+
+
+/* EOF */
diff --git a/daemon/display.h b/daemon/display.h
new file mode 100644
index 00000000..981188aa
--- /dev/null
+++ b/daemon/display.h
@@ -0,0 +1,30 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_DISPLAY_H
+#define GDM_DISPLAY_H
+
+#include "gdm.h"
+
+gint gdm_display_manage (GdmDisplay *d);
+void gdm_display_dispose (GdmDisplay *d);
+void gdm_display_unmanage (GdmDisplay *d);
+
+#endif /* GDM_DISPLAY_H */
+
+/* EOF */
diff --git a/daemon/filecheck.c b/daemon/filecheck.c
index 28015b2b..2c46601e 100644
--- a/daemon/filecheck.c
+++ b/daemon/filecheck.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -18,21 +18,14 @@
#include <config.h>
#include <gnome.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
#include <syslog.h>
-#include <sys/wait.h>
#include <sys/stat.h>
-#include <unistd.h>
#include "gdm.h"
+#include "filecheck.h"
static const gchar RCSid[]="$Id$";
-gboolean gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
- gboolean absentok, gint maxsize, gint perms);
-
/**
* gdm_file_check:
* @caller: String to be prepended to syslog error messages.
@@ -56,25 +49,25 @@ gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
/* Stat directory */
if (stat (dir, &statbuf) == -1) {
syslog (LOG_WARNING, _("%s: Directory %s does not exist."), caller, dir);
- return (FALSE);
+ return FALSE;
}
/* Check if dir is owned by the user ... */
if (statbuf.st_uid != user) {
syslog (LOG_WARNING, _("%s: %s is not owned by uid %d."), caller, dir, user);
- return (FALSE);
+ return FALSE;
}
/* ... if group has write permission ... */
if (perms < 1 && (statbuf.st_mode & S_IWGRP) == S_IWGRP) {
syslog (LOG_WARNING, _("%s: %s is writable by group."), caller, dir);
- return (FALSE);
+ return FALSE;
}
/* ... and if others have write permission. */
if (perms < 2 && (statbuf.st_mode & S_IWOTH) == S_IWOTH) {
syslog (LOG_WARNING, _("%s: %s is writable by other."), caller, dir);
- return (FALSE);
+ return FALSE;
}
fullpath = g_strconcat(dir, "/", file, NULL);
@@ -84,12 +77,12 @@ gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
/* Return true if file does not exist and that is ok */
if (absentok) {
g_free (fullpath);
- return (TRUE);
+ return TRUE;
}
else {
- syslog (LOG_WARNING,_("%s: does not exist and must."), caller, fullpath);
+ syslog (LOG_WARNING, _("%s: does not exist and must."), caller, fullpath);
g_free (fullpath);
- return (FALSE);
+ return FALSE;
}
}
@@ -97,28 +90,28 @@ gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
if (! S_ISREG (statbuf.st_mode)) {
syslog (LOG_WARNING, _("%s: %s is not a regular file."), caller, fullpath);
g_free (fullpath);
- return (FALSE);
+ return FALSE;
}
/* ... owned by the user ... */
if (statbuf.st_uid != user) {
syslog (LOG_WARNING, _("%s: %s is not owned by uid %d."), caller, fullpath, user);
g_free (fullpath);
- return (FALSE);
+ return FALSE;
}
/* ... unwritable by group ... */
if (perms < 1 && (statbuf.st_mode & S_IWGRP) == S_IWGRP) {
syslog (LOG_WARNING, _("%s: %s is writable by group."), caller, fullpath);
g_free (fullpath);
- return (FALSE);
+ return FALSE;
}
/* ... unwritable by others ... */
if (perms < 2 && (statbuf.st_mode & S_IWOTH) == S_IWOTH) {
syslog (LOG_WARNING, _("%s: %s is writable by group/other."), caller, fullpath);
g_free (fullpath);
- return (FALSE);
+ return FALSE;
}
/* ... and smaller than sysadmin specified limit. */
@@ -126,13 +119,13 @@ gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
syslog (LOG_WARNING, _("%s: %s is bigger than sysadmin specified maximum file size."),
caller, fullpath);
g_free (fullpath);
- return (FALSE);
+ return FALSE;
}
g_free (fullpath);
/* Yeap, this file is ok */
- return (TRUE);
+ return TRUE;
}
/* EOF */
diff --git a/daemon/filecheck.h b/daemon/filecheck.h
new file mode 100644
index 00000000..a9a47531
--- /dev/null
+++ b/daemon/filecheck.h
@@ -0,0 +1,27 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_FILECHECK_H
+#define GDM_FILECHECK_H
+
+gboolean gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
+ gboolean absentok, gint maxsize, gint perms);
+
+#endif /* GDM_FILECHECK_H */
+
+/* EOF */
diff --git a/daemon/gdm.c b/daemon/gdm.c
index 2a58bc8a..79467a13 100644
--- a/daemon/gdm.c
+++ b/daemon/gdm.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@SunSITE.auc.dk>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -16,54 +16,47 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <config.h>
#include <gnome.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include <signal.h>
-#include <strings.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <ctype.h>
#include <pwd.h>
#include <grp.h>
-#include <syslog.h>
-#include <sys/wait.h>
+#include <fcntl.h>
#include <errno.h>
-#include <ctype.h>
-#include <config.h>
-#include <X11/Xauth.h>
+#include <syslog.h>
#include "gdm.h"
+#include "misc.h"
+#include "slave.h"
+#include "xdmcp.h"
+#include "verify.h"
+#include "display.h"
static const gchar RCSid[]="$Id$";
-extern void gdm_slave_start (GdmDisplay *);
-extern gchar **gdm_arg_munch (const gchar *p);
-extern void gdm_fail (const gchar *, ...);
-extern void gdm_info (const gchar *, ...);
-extern void gdm_error (const gchar *, ...);
-extern GdmDisplay *gdm_server_alloc (gint id, gchar *command);
-extern void gdm_server_start (GdmDisplay *d);
-extern void gdm_server_stop (GdmDisplay *d);
-extern void gdm_debug (const gchar *format, ...);
-extern int gdm_xdmcp_init (void);
-extern void gdm_xdmcp_run (void);
-extern void gdm_xdmcp_close (void);
-extern void gdm_verify_check (void);
-
-gint gdm_display_manage (GdmDisplay *d);
-void gdm_display_dispose (GdmDisplay *d);
-static void gdm_local_servers_start (GdmDisplay *d);
-static void gdm_display_unmanage (GdmDisplay *d);
-
-GSList *displays;
-gint sessions=0;
-static gchar *GdmUser;
-static gchar *GdmGroup;
-sigset_t sysmask;
-uid_t GdmUserId;
-gid_t GdmGroupId;
+/* Local functions */
+static void gdm_config_parse (void);
+static void gdm_local_servers_start (GdmDisplay *d);
+static void gdm_daemonify (void);
+static void gdm_local_servers_start (GdmDisplay *d);
+static void gdm_child_handler (gint sig);
+static void gdm_term_handler (int sig);
+
+/* Global vars */
+GSList *displays; /* List of displays managed */
+gint sessions = 0; /* Number of remote sessions */
+sigset_t sysmask; /* Inherited system signal mask */
+gchar *argdelim = " "; /* argv argument delimiter */
+uid_t GdmUserId; /* Userid under which gdm should run */
+gid_t GdmGroupId; /* Groupid under which gdm should run */
+
+/* Configuration options */
+gchar *GdmUser = NULL;
+gchar *GdmGroup = NULL;
gchar *GdmSessDir = NULL;
gchar *GdmGreeter = NULL;
gchar *GdmChooser = NULL;
@@ -82,74 +75,27 @@ gchar *GdmDefaultPath = NULL;
gchar *GdmRootPath = NULL;
gint GdmKillInitClients = 0;
gint GdmUserMaxFile = 0;
-gint GdmXdmcp;
-gint GdmMaxPending;
-gint GdmMaxManageWait;
-gint GdmMaxSessions;
-gint GdmPort;
-gint GdmIndirect;
-gint GdmMaxIndirect;
-gint GdmMaxIndirectWait;
-gint GdmDebug;
-gint GdmVerboseAuth;
-gint GdmAllowRoot;
-gint GdmRelaxPerms;
-gint GdmRetryDelay;
-
-typedef struct _childstat ChildStat;
-struct _childstat { pid_t pid; gint status; };
-
-
-void
-gdm_display_dispose (GdmDisplay *d)
-{
- GSList *tmpauth;
-
- if (!d)
- return;
-
- if (d->type == TYPE_XDMCP) {
- displays = g_slist_remove (displays, d);
- sessions--;
- }
-
- if (d->name) {
- gdm_debug ("gdm_display_dispose: Disposing %s", d->name);
- g_free (d->name);
- }
-
- if (d->hostname)
- g_free (d->hostname);
-
- if (d->authfile)
- g_free (d->authfile);
-
- if (d->auths) {
- tmpauth = d->auths;
-
- while (tmpauth && tmpauth->data) {
- XauDisposeAuth ((Xauth *) tmpauth->data);
- tmpauth = tmpauth->next;
- }
-
- g_slist_free (d->auths);
- }
-
- if (d->userauth)
- g_free (d->userauth);
-
- if (d->command)
- g_free (d->command);
-
- if (d->cookie)
- g_free (d->cookie);
-
- if (d->bcookie)
- g_free (d->bcookie);
-
- g_free (d);
-}
-
+gint GdmXdmcp = 0;
+gint GdmDispPerHost = 0;
+gint GdmMaxPending = 0;
+gint GdmMaxManageWait = 0;
+gint GdmMaxSessions = 0;
+gint GdmPort = 0;
+gint GdmIndirect = 0;
+gint GdmMaxIndirect = 0;
+gint GdmMaxIndirectWait = 0;
+gint GdmDebug = 0;
+gint GdmVerboseAuth = 0;
+gint GdmAllowRoot = 0;
+gint GdmRelaxPerms = 0;
+gint GdmRetryDelay = 0;
+
+
+/**
+ * gdm_config_parse:
+ *
+ * Parse the configuration file and warn about bad permissions etc.
+ */
static void
gdm_config_parse (void)
@@ -159,12 +105,14 @@ gdm_config_parse (void)
struct passwd *pwent;
struct group *grent;
struct stat statbuf;
+ gchar *gtemp, *stemp;
displays = NULL;
if (stat (GDM_CONFIG_FILE, &statbuf) == -1)
gdm_fail (_("gdm_config_parse: No configuration file: %s. Aborting."), GDM_CONFIG_FILE);
+ /* Parse configuration options */
gnome_config_push_prefix ("=" GDM_CONFIG_FILE "=/");
GdmChooser = gnome_config_get_string (GDM_KEY_CHOOSER);
@@ -194,6 +142,7 @@ gdm_config_parse (void)
GdmVerboseAuth = gnome_config_get_int (GDM_KEY_VERBAUTH);
GdmXdmcp = gnome_config_get_int (GDM_KEY_XDMCP);
+ GdmDispPerHost = gnome_config_get_int (GDM_KEY_DISPERHOST);
GdmMaxPending = gnome_config_get_int (GDM_KEY_MAXPEND);
GdmMaxManageWait = gnome_config_get_int (GDM_KEY_MAXWAIT);
GdmMaxSessions = gnome_config_get_int (GDM_KEY_MAXSESS);
@@ -204,74 +153,50 @@ gdm_config_parse (void)
GdmDebug = gnome_config_get_int (GDM_KEY_DEBUG);
- if (GdmGreeter==NULL && stat ("/usr/local/bin/gdmlogin", &statbuf)==0)
- GdmGreeter = "/usr/local/bin/gdmlogin";
-
- if (GdmGreeter==NULL && stat ("/usr/bin/gdmlogin", &statbuf)==0)
- GdmGreeter = "/usr/bin/gdmlogin";
-
- if (GdmGreeter==NULL && stat ("/opt/gnome/bin/gdmlogin", &statbuf)==0)
- GdmGreeter = "/opt/gnome/bin/gdmlogin";
-
- if (GdmGreeter==NULL)
- gdm_fail (_("gdm_config_parse: No greeter specified and default not found."));
+ gnome_config_pop_prefix();
- if (GdmServAuthDir==NULL && stat ("/var/gdm", &statbuf)==0)
- GdmServAuthDir = "/var/gdm";
- if (GdmServAuthDir==NULL && stat ("/var/lib/gdm", &statbuf)==0)
- GdmServAuthDir = "/var/lib/gdm";
+ /* Prerequisites */
+ if (GdmGreeter == NULL)
+ gdm_fail (_("gdm_config_parse: No greeter specified."));
- if (GdmServAuthDir==NULL && stat ("/opt/gnome/var/gdm", &statbuf)==0)
- GdmServAuthDir = "/opt/gnome/var/gdm";
-
- if (GdmServAuthDir==NULL)
- gdm_fail (_("gdm_config_parse: No authdir specified and default not found."));
+ if (GdmServAuthDir == NULL)
+ gdm_fail (_("gdm_config_parse: No authdir specified."));
- if (GdmLogDir==NULL)
+ if (GdmLogDir == NULL)
GdmLogDir = GdmServAuthDir;
- if (GdmSessDir==NULL && stat ("/usr/local/etc/gdm/Sessions", &statbuf)==0)
- GdmSessDir = "/usr/local/etc/gdm/Sessions";
+ if (GdmSessDir == NULL)
+ gdm_fail (_("gdm_config_parse: No sessions directory specified."));
- if (GdmSessDir==NULL && stat ("/usr/etc/gdm/Sessions", &statbuf)==0)
- GdmSessDir = "/usr/etc/gdm/Sessions";
-
- if (GdmSessDir==NULL && stat ("/etc/gdm/Sessions", &statbuf)==0)
- GdmSessDir = "/etc/gdm/Sessions";
-
- if (GdmSessDir==NULL && stat ("/etc/X11/gdm/Sessions", &statbuf)==0)
- GdmSessDir = "/etc/X11/gdm/Sessions";
-
- if (GdmSessDir==NULL)
- gdm_fail (_("gdm_config_parse: No sessions directory specified and default not found."));
-
- gnome_config_pop_prefix();
+ /* Find local X server definitions */
iter = gnome_config_init_iterator ("=" GDM_CONFIG_FILE "=/" GDM_KEY_SERVERS);
iter = gnome_config_iterator_next (iter, &k, &v);
while (iter) {
- if (isdigit(*k))
- displays = g_slist_append (displays, gdm_server_alloc (atoi(k), v));
+ if (isdigit (*k))
+ displays = g_slist_append (displays, gdm_server_alloc (atoi (k), v));
else
gdm_info (_("gdm_config_parse: Invalid server line in config file. Ignoring!"));
iter = gnome_config_iterator_next (iter, &k, &v);
}
- if (!displays && !GdmXdmcp)
+ if (! displays && ! GdmXdmcp)
gdm_fail (_("gdm_config_parse: Xdmcp disabled and no local servers defined. Aborting!"));
+
+ /* Lookup user and groupid for the gdm user */
pwent = getpwnam (GdmUser);
- if (!pwent)
+ if (! pwent)
gdm_fail (_("gdm_config_parse: Can't find the gdm user (%s). Aborting!"), GdmUser);
else
GdmUserId = pwent->pw_uid;
- if (GdmUserId==0)
+ if (GdmUserId == 0)
gdm_fail (_("gdm_config_parse: The gdm user should not be root. Aborting!"));
grent = getgrnam (GdmGroup);
@@ -281,12 +206,41 @@ gdm_config_parse (void)
else
GdmGroupId = grent->gr_gid;
- if (GdmGroupId==0)
+ if (GdmGroupId == 0)
gdm_fail (_("gdm_config_parse: The gdm group should not be root. Aborting!"));
setegid (GdmGroupId); /* gid remains `gdm' */
seteuid (GdmUserId);
+
+ /* Check that the greeter can be executed */
+ gtemp = g_strdup (GdmGreeter);
+ stemp = strchr (gtemp, ' ');
+
+ if (stemp) {
+ *stemp = '\0';
+
+ if (access (gtemp, R_OK|X_OK))
+ gdm_fail ("gdm_config_parse: Greeter not found or can't be executed by the gdm user", gtemp);
+ }
+
+ g_free (gtemp);
+
+
+ /* Check that chooser can be executed */
+ gtemp = g_strdup (GdmChooser);
+ stemp = strchr (gtemp, ' ');
+
+ if (GdmIndirect && stemp) {
+ *stemp = '\0';
+
+ if (access (gtemp, R_OK|X_OK))
+ gdm_fail ("gdm_config_parse: Chooser not found or it can't be executed by the gdm user", gtemp);
+ }
+
+ g_free (gtemp);
+
+
/* Enter paranoia mode */
if (stat (GdmServAuthDir, &statbuf) == -1)
gdm_fail (_("gdm_config_parse: Authdir %s does not exist. Aborting."), GdmServAuthDir);
@@ -302,6 +256,7 @@ gdm_config_parse (void)
gdm_fail (_("gdm_config_parse: Authdir %s has wrong permissions. Should be 750. Aborting."),
GdmServAuthDir, statbuf.st_mode);
+
/* Check that PAM configuration file is in place */
gdm_verify_check ();
@@ -309,69 +264,71 @@ gdm_config_parse (void)
}
-static void
-gdm_local_servers_start (GdmDisplay *d)
-{
- if (d && d->type == TYPE_LOCAL) {
- gdm_debug ("gdm_local_servers_start: Starting %s", d->name);
- gdm_server_start (d);
- }
-}
-
+/**
+ * gdm_daemonify:
+ *
+ * Detach gdm daemon from the controlling terminal
+ */
-gint
-gdm_display_manage (GdmDisplay *d)
+static void
+gdm_daemonify (void)
{
- sigset_t mask, omask;
-
- if (!d)
- return (FALSE);
-
- gdm_debug ("gdm_display_manage: Managing %s", d->name);
+ FILE *pf;
+ pid_t pid;
- /* If we have an old slave process hanging around, kill it */
- if (d->slavepid) {
- sigemptyset (&mask);
- sigaddset (&mask, SIGCHLD);
- sigprocmask (SIG_BLOCK, &mask, &omask);
+ if ((pid = fork ())) {
- kill (d->slavepid, SIGINT);
- waitpid (d->slavepid, 0, 0);
+ if ((pf = fopen (GdmPidFile, "w"))) {
+ fprintf (pf, "%d\n", pid);
+ fclose (pf);
+ }
- sigprocmask (SIG_SETMASK, &omask, NULL);
+ exit (EXIT_SUCCESS);
}
- switch (d->slavepid=fork()) {
-
- case 0:
+ if (pid < 0)
+ gdm_fail (_("gdm_daemonify: fork() failed!"));
- setpgid (0, 0);
+ if (setsid() < 0)
+ gdm_fail (_("gdm_daemonify: setsid() failed: %s!"), strerror(errno));
- /* Close XDMCP fd in slave process */
- if (GdmXdmcp)
- gdm_xdmcp_close();
+ chdir (GdmServAuthDir);
+ umask (022);
- if (d->type == TYPE_LOCAL && d->servstat == SERVER_RUNNING)
- gdm_slave_start (d);
+ close (0);
+ close (1);
+ close (2);
- if (d->type == TYPE_XDMCP && d->dispstat == XDMCP_MANAGED)
- gdm_slave_start (d);
+ open ("/dev/null", O_RDONLY);
+ dup2 (0, 1);
+ dup2 (0, 2);
+}
- break;
- case -1:
- gdm_error (_("gdm_display_manage: Failed forking gdm slave process for %d"), d->name);
- return (FALSE);
+/**
+ * gdm_local_servers_start:
+ * @d: Pointer to a GdmDisplay struct
+ *
+ * Start all local (i.e. non-XDMCP) X servers
+ */
- default:
- gdm_debug ("gdm_display_manage: Forked slave: %d", d->slavepid);
- break;
+static void
+gdm_local_servers_start (GdmDisplay *d)
+{
+ if (d && d->type == TYPE_LOCAL) {
+ gdm_debug ("gdm_local_servers_start: Starting %s", d->name);
+ gdm_slave_start (d);
}
-
- return (TRUE);
}
+/**
+ * gdm_child_handler:
+ * @sig: Signal value
+ *
+ * ACME Funeral Services
+ */
+
static void
gdm_child_handler (gint sig)
{
@@ -382,55 +339,32 @@ gdm_child_handler (gint sig)
gchar **argv;
/* Get status from all dead children */
- while ((pid=waitpid (-1, &exitstatus, WNOHANG)) > 0) {
+ while ((pid = waitpid (-1, &exitstatus, WNOHANG)) > 0) {
if (WIFEXITED (exitstatus))
- status=WEXITSTATUS (exitstatus);
+ status = WEXITSTATUS (exitstatus);
gdm_debug ("gdm_child_handler: child %d returned %d", pid, status);
if (pid < 1)
- return;
+ break;
while (list && list->data) {
d = list->data;
gdm_debug ("gdm_child_handler: %s", d->name);
- /* X server died */
- if (pid == d->servpid) {
- d->servpid = 0;
-
- switch (status) {
-
- case SERVER_SUCCESS:
- case SERVER_FAILURE:
- gdm_server_start (d);
- break;
-
- case SERVER_NOTFOUND:
- case SERVER_ABORT:
- gdm_display_unmanage (d);
- break;
-
- default:
- gdm_debug ("gdm_child_handler: Server process returned unknown status %d", status);
- gdm_display_unmanage (d);
- break;
- }
- }
-
/* Slave died */
- if (pid==d->slavepid) {
+ if (pid == d->slavepid) {
d->slavepid = 0;
switch (status) {
case DISPLAY_REMANAGE:
- if (d->type == TYPE_LOCAL && d->dispstat != DISPLAY_ABORT) {
+ if (d->type == TYPE_LOCAL) {
d->dispstat = DISPLAY_DEAD;
- gdm_server_start (d);
+ gdm_slave_start (d);
}
if (d->type == TYPE_XDMCP)
@@ -448,9 +382,9 @@ gdm_child_handler (gint sig)
g_slist_foreach (displays, (GFunc) gdm_display_unmanage, NULL);
closelog();
unlink (GdmPidFile);
- argv = gdm_arg_munch (GdmReboot);
+ argv = g_strsplit (GdmReboot, argdelim, MAX_ARGS);
execv (argv[0], argv);
- gdm_error (_("gdm_child_action: Reboot failed: %s"), strerror(errno));
+ gdm_error (_("gdm_child_action: Reboot failed: %s"), strerror (errno));
break;
case DISPLAY_HALT:
@@ -458,9 +392,9 @@ gdm_child_handler (gint sig)
g_slist_foreach (displays, (GFunc) gdm_display_unmanage, NULL);
closelog();
unlink (GdmPidFile);
- argv = gdm_arg_munch (GdmHalt);
+ argv = g_strsplit (GdmHalt, argdelim, MAX_ARGS);
execv (argv[0], argv);
- gdm_error (_("gdm_child_action: Halt failed: %s"), strerror(errno));
+ gdm_error (_("gdm_child_action: Halt failed: %s"), strerror (errno));
break;
case DISPLAY_RESERVER:
@@ -485,40 +419,12 @@ gdm_child_handler (gint sig)
}
-static void
-gdm_display_unmanage (GdmDisplay *d)
-{
- if (!d)
- return;
-
- gdm_debug ("gdm_display_unmanage: Stopping %s", d->name);
-
- if (d->type == TYPE_LOCAL) {
-
- /* Kill slave and all its children */
- if (d->slavepid) {
- kill (-(d->slavepid), SIGTERM);
- waitpid (d->slavepid, 0, 0);
- d->slavepid = 0;
- }
-
- if (d->servpid) {
- gdm_server_stop (d);
- }
-
- d->dispstat = DISPLAY_DEAD;
- }
- else { /* TYPE_XDMCP */
- if (d->slavepid) {
- kill (d->slavepid, SIGTERM);
- waitpid (d->slavepid, 0, 0);
- d->slavepid = 0;
- }
-
- gdm_display_dispose (d);
- }
-}
-
+/**
+ * gdm_term_handler:
+ * @sig: Signal value
+ *
+ * Shutdown all displays and terminate the gdm process
+ */
static void
gdm_term_handler (int sig)
@@ -527,12 +433,15 @@ gdm_term_handler (int sig)
gdm_debug ("gdm_term_handler: Got TERM/INT. Going down!");
+ /* Block SIGCHLD */
sigemptyset (&mask);
sigaddset (&mask, SIGCHLD);
sigprocmask (SIG_BLOCK, &mask, NULL);
+ /* Unmanage all displays */
g_slist_foreach (displays, (GFunc) gdm_display_unmanage, NULL);
+ /* Cleanup */
closelog();
unlink (GdmPidFile);
@@ -540,40 +449,9 @@ gdm_term_handler (int sig)
}
-static void
-gdm_daemonify (void)
-{
- FILE *pf;
- pid_t pid;
-
- if ((pid=fork())) {
-
- if ((pf = fopen (GdmPidFile, "w"))) {
- fprintf (pf, "%d\n", pid);
- fclose (pf);
- }
-
- exit (EXIT_SUCCESS);
- }
-
- if (pid<0)
- gdm_fail (_("gdm_daemonify: fork() failed!"));
-
- if (setsid() < 0)
- gdm_fail (_("gdm_daemonify: setsid() failed: %s!"), strerror(errno));
-
- chdir (GdmServAuthDir);
- umask (022);
-
- close (0);
- close (1);
- close (2);
-
- open ("/dev/null", O_RDONLY);
- dup2 (0, 1);
- dup2 (0, 2);
-}
-
+/*
+ * main: The main daemon control
+ */
int
main (int argc, char *argv[])
@@ -583,44 +461,36 @@ main (int argc, char *argv[])
FILE *pf;
GMainLoop *main_loop;
- if (getuid()) {
-
- /* XDM compliant error message */
- fprintf (stderr, _("Only root wants to run x^hgdm\n"));
-
- exit (EXIT_FAILURE);
- }
+ /* XDM compliant error message */
+ if (getuid())
+ gdm_fail (_("Only root wants to run x^hgdm\n"));
+ /* Initialize runtime environment */
umask (022);
gnome_do_not_create_directories = TRUE;
gnomelib_init ("gdm", VERSION);
main_loop = g_main_new (FALSE);
openlog ("gdm", LOG_PID, LOG_DAEMON);
+ /* Parse configuration file */
gdm_config_parse();
- if (!access (GdmPidFile, R_OK)) {
- /* Check the process is still alive. Don't abort otherwise. */
- int pidv;
+ /* Check if another gdm process is already running */
+ if (! access (GdmPidFile, R_OK)) {
- pf = fopen (GdmPidFile, "r");
- if (pf && fscanf (pf, "%d", &pidv)==1 && kill (pidv,0)!=-1) {
+ /* Check if the existing process is still alive. */
+ gint pidv;
- fclose (pf);
- fprintf (stderr, _("gdm already running. Aborting!\n\n"));
-
- exit (EXIT_FAILURE);
- }
+ pf = fopen (GdmPidFile, "r");
- fclose (pf);
- fprintf (stderr, _("According to %s, gdm was already running (%d),\n"
- "but seems to have been murdered mysteriously.\n"),
- GdmPidFile, pidv);
- unlink (GdmPidFile);
+ if (pf && fscanf (pf, "%d", &pidv) == 1 && kill (pidv, 0) != -1)
+ gdm_fail (_("gdm already running. Aborting!"));
}
/* Become daemon unless started in -nodaemon mode or child of init */
- if ( (argc==2 && strcmp (argv[1],"-nodaemon")==0) || getppid()==1) {
+ if ( (argc == 2 && strcmp (argv[1], "-nodaemon") == 0) || getppid() == 1) {
+
+ /* Write pid to pidfile */
if ((pf = fopen (GdmPidFile, "w"))) {
fprintf (pf, "%d\n", getpid());
fclose (pf);
@@ -671,7 +541,8 @@ main (int argc, char *argv[])
g_main_run (main_loop);
- return (EXIT_SUCCESS);
+ return EXIT_SUCCESS; /* Not reached */
}
+
/* EOF */
diff --git a/daemon/gdm.h b/daemon/gdm.h
index 3c129c06..8fd76889 100644
--- a/daemon/gdm.h
+++ b/daemon/gdm.h
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -19,11 +19,20 @@
#ifndef __GDM_H__
#define __GDM_H__
+#include <glib.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xauth.h>
+
+
+#define STX 0x2 /* Start of txt */
+
#define TYPE_LOCAL 1 /* Local X server */
#define TYPE_XDMCP 2 /* Remote display */
#define SERVER_SUCCESS 0 /* X server default */
#define SERVER_FAILURE 1 /* X server default */
+#define SERVER_TIMEOUT 2 /* Server didn't start */
#define SERVER_NOTFOUND 127 /* X server default */
#define SERVER_DEAD 250 /* Server stopped */
#define SERVER_STARTED 251 /* Server started but not ready for connections yet */
@@ -44,8 +53,7 @@
/* Opcodes for the highly sophisticated protocol used for
- daemon<->greeter communications */
-
+ * daemon<->greeter communications */
#define GDM_MSGERR 'D'
#define GDM_NOECHO 'U'
#define GDM_PROMPT 'N'
@@ -57,6 +65,8 @@
#define GDM_QUIT 'P'
#define GDM_STOP '!'
+/* The dreaded miscellaneous category */
+#define MAX_ARGS 32
#define FIELD_SIZE 64
#define PIPE_SIZE 1024
@@ -91,6 +101,7 @@
#define GDM_KEY_MAXPEND "xdmcp/MaxPending=4"
#define GDM_KEY_MAXSESS "xdmcp/MaxSessions=16"
#define GDM_KEY_MAXWAIT "xdmcp/MaxWait=30"
+#define GDM_KEY_DISPERHOST "xdmcp/DisplaysPerHost=1"
#define GDM_KEY_UDPPORT "xdmcp/Port=177"
#define GDM_KEY_INDIRECT "xdmcp/HonorIndirect=1"
#define GDM_KEY_MAXINDIR "xdmcp/MaxPendingIndirect=4"
@@ -122,11 +133,6 @@
#define GDM_KEY_SERVERS "servers"
-#include <glib.h>
-#include <X11/Xlib.h>
-#include <X11/Xmd.h>
-#include <X11/Xauth.h>
-
typedef struct _GdmDisplay GdmDisplay;
struct _GdmDisplay {
@@ -144,11 +150,13 @@ struct _GdmDisplay {
guint8 dispstat;
guint16 dispnum;
guint8 servstat;
+ guint8 servtries;
guint8 type;
pid_t greetpid;
pid_t servpid;
pid_t sesspid;
pid_t slavepid;
+ pid_t chooserpid;
time_t acctime;
};
diff --git a/daemon/md5.c b/daemon/md5.c
index c9e26cfd..6ffb752a 100644
--- a/daemon/md5.c
+++ b/daemon/md5.c
@@ -15,7 +15,7 @@
* gdm_md5_final, which will fill a supplied 16-byte array with the
* digest.
*
- * Changed all names to avoid namespace pollution -- mkp
+ * Changed all names to avoid glibc namespace pollution -- mkp
*
*/
diff --git a/daemon/misc.c b/daemon/misc.c
index 9e419ef7..748df5fe 100644
--- a/daemon/misc.c
+++ b/daemon/misc.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@SunSITE.auc.dk>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -18,132 +18,28 @@
#include <config.h>
#include <gnome.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
#include <syslog.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <unistd.h>
#include "gdm.h"
+#include "misc.h"
static const gchar RCSid[]="$Id$";
-gchar **gdm_arg_munch (gchar *p);
-gint gdm_exec_script (GdmDisplay *d, gchar *dir);
-void gdm_fail (const gchar *format, ...);
-void gdm_abort (const gchar *format, ...);
-void gdm_info (const gchar *format, ...);
-void gdm_error (const gchar *format, ...);
-void gdm_debug (const gchar *format, ...);
-void gdm_remanage (const gchar *format, ...);
-
-
+/* Configuration option variables */
extern gchar *GdmPidFile;
-extern gchar *GdmRootPath;
extern gint GdmDebug;
-/* Written by Alan Cox <alan@redhat.com> */
-gchar **
-gdm_arg_munch (gchar *p)
-{
- gchar *x = strdup (p);
- gint quoted = 0;
- gint argn = 0;
- static gchar *argv[16];
-
- while (*x) {
- while (*x && isspace (*x))
- x++;
-
- if (*x=='"') {
- quoted = 1;
- x++;
- }
-
- argv[argn] = x;
-
- while (*x) {
-
- if (*x=='"' && quoted)
- break;
-
- if (*x==' ' && !quoted)
- break;
-
- x++;
- }
-
- if (*x)
- *x++ = 0;
-
- argn++;
-
- if (argn==16)
- break;
- }
-
- while (argn<=16) {
- argv[argn] = NULL;
- argn++;
- }
-
- return (argv);
-}
-
-
-/* Execute a script and wait for it to finish. Returns exit status of
- * the executed script.
+/**
+ * gdm_fail:
+ * @format: printf style format string
+ * @...: Optional arguments
+ *
+ * Logs fatal error condition and aborts master daemon. Also sleeps
+ * for 30 seconds to avoid looping if gdm is started by init.
*/
-gint
-gdm_exec_script (GdmDisplay *d, gchar *dir)
-{
- pid_t pid;
- gchar *script, *defscript, *scr;
- gchar **argv;
- gint status;
-
- if (!d || !dir)
- return (EXIT_SUCCESS);
-
- script = g_strconcat (dir, "/", d->name, NULL);
- defscript = g_strconcat (dir, "/Default", NULL);
-
- if (! access (script, R_OK|X_OK))
- scr = script;
- else if (! access (defscript, R_OK|X_OK))
- scr = defscript;
- else
- return (EXIT_SUCCESS);
-
- switch (pid = fork()) {
-
- case 0:
- setenv ("PATH", GdmRootPath, TRUE);
- argv = gdm_arg_munch (scr);
- execv (argv[0], argv);
- syslog (LOG_ERR, _("gdm_exec_script: Failed starting: %s"), scr);
- return (EXIT_SUCCESS);
-
- case -1:
- syslog (LOG_ERR, _("gdm_exec_script: Can't fork script process!"));
- return (EXIT_SUCCESS);
-
- default:
- waitpid (pid, &status, 0); /* Wait for script to finish */
-
- if (WIFEXITED (status))
- return (WEXITSTATUS (status));
- else
- return (EXIT_SUCCESS);
- }
-}
-
-/* Log error and abort master daemon */
void
gdm_fail (const gchar *format, ...)
{
@@ -154,14 +50,15 @@ gdm_fail (const gchar *format, ...)
s = g_strdup_vprintf (format, args);
va_end (args);
+ /* Log to both syslog and stderr */
syslog (LOG_ERR, s);
- fprintf (stderr, s);
- fprintf (stderr, "\n");
+ fprintf (stderr, "%s\n", s);
fflush (stderr);
g_free (s);
+
unlink (GdmPidFile);
- closelog();
+ closelog ();
/* Slow down respawning if we're started from init */
if (getppid() == 1)
@@ -171,9 +68,16 @@ gdm_fail (const gchar *format, ...)
}
-/* Log error and abort the slave daemon */
+/**
+ * gdm_info:
+ * @format: printf style format string
+ * @...: Optional arguments
+ *
+ * Log non-fatal information to syslog
+ */
+
void
-gdm_abort (const gchar *format, ...)
+gdm_info (const gchar *format, ...)
{
va_list args;
gchar *s;
@@ -182,17 +86,22 @@ gdm_abort (const gchar *format, ...)
s = g_strdup_vprintf (format, args);
va_end (args);
- syslog (LOG_ERR, s);
+ syslog (LOG_INFO, s);
g_free (s);
-
- exit (DISPLAY_ABORT);
}
-/* Remanage display */
+/**
+ * gdm_error:
+ * @format: printf style format string
+ * @...: Optional arguments
+ *
+ * Log non-fatal error condition to syslog
+ */
+
void
-gdm_remanage (const gchar *format, ...)
+gdm_error (const gchar *format, ...)
{
va_list args;
gchar *s;
@@ -204,62 +113,89 @@ gdm_remanage (const gchar *format, ...)
syslog (LOG_ERR, s);
g_free (s);
-
- exit (DISPLAY_REMANAGE);
}
-/* Log non fatal error/message */
+/**
+ * gdm_debug:
+ * @format: printf style format string
+ * @...: Optional arguments
+ *
+ * Log debug information to syslog if debugging is enabled.
+ */
+
void
-gdm_info (const gchar *format, ...)
+gdm_debug (const gchar *format, ...)
{
va_list args;
gchar *s;
+ if (! GdmDebug)
+ return;
+
va_start (args, format);
s = g_strdup_vprintf (format, args);
va_end (args);
- syslog (LOG_INFO, s);
+ syslog (LOG_ERR, s); /* FIXME: LOG_DEBUG */
g_free (s);
}
-/* Log error condition */
-void
-gdm_error (const gchar *format, ...)
+/**
+ * gdm_setenv:
+ * @var: Variable to set/unset
+ * @value: Value to assign to the variable, NULL for unsetting
+ *
+ * Wrapper around putenv() because POSIX/SUS is incredibly stupid.
+ *
+ * char *foo; char *bar;
+ * putenv (foo); putenv (bar); free (foo);
+ *
+ * is legal, while
+ *
+ * char *foo;
+ * putenv (foo); free (foo);
+ *
+ * isn't.
+ *
+ * Afterall, providing the programmer with a nice, consistent
+ * interface is what the standard C Library is all about. - Duh!
+ */
+
+gint
+gdm_setenv (const gchar *var, const gchar *value)
{
- va_list args;
- gchar *s;
+ static gchar *lastenv = NULL; /* Holds last successful assignment pointer */
+ gchar *envstr; /* Temporary environment string */
+ gint result; /* Return value from the putenv() call */
- va_start (args, format);
- s = g_strdup_vprintf (format, args);
- va_end (args);
-
- syslog (LOG_ERR, s);
-
- g_free (s);
-}
+ /* `var' is a prerequisite */
+ if (!var)
+ return -1;
+ /* If `value' is specified then set the variable accordingly. Otherwise clear it. */
+ if (value)
+ envstr = g_strconcat (var, "=", value, NULL);
+ else
+ envstr = g_strconcat (var, "=", NULL);
-/* Log debug messages */
-void
-gdm_debug (const gchar *format, ...)
-{
- va_list args;
- gchar *s;
+ /* If string space allocation failed then abort */
+ if (!envstr)
+ return -1;
+
+ /* Stuff the resulting string into the environment */
+ result = putenv (envstr);
- if (GdmDebug) {
- va_start (args, format);
- s = g_strdup_vprintf (format, args);
- va_end (args);
+ /* If putenv() succeeded and lastenv is set, free the old pointer */
+ if (result == 0 && lastenv)
+ g_free (lastenv);
- /* FIXME */
- syslog (LOG_ERR, s);
+ /* Save the current string pointer for the next gdm_setenv call */
+ lastenv = envstr;
- g_free (s);
- }
+ return result;
}
diff --git a/daemon/misc.h b/daemon/misc.h
new file mode 100644
index 00000000..d028fa9e
--- /dev/null
+++ b/daemon/misc.h
@@ -0,0 +1,32 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_MISC_H
+#define GDM_MISC_H
+
+#include "gdm.h"
+
+void gdm_fail (const gchar *format, ...);
+void gdm_info (const gchar *format, ...);
+void gdm_error (const gchar *format, ...);
+void gdm_debug (const gchar *format, ...);
+gint gdm_setenv (const gchar *var, const gchar *value);
+
+#endif /* GDM_MISC_H */
+
+/* EOF */
diff --git a/daemon/server.c b/daemon/server.c
index e7f177b8..218b0928 100644
--- a/daemon/server.c
+++ b/daemon/server.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@SunSITE.auc.dk>
+ * Copyright (C) 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -35,23 +35,25 @@
static const gchar RCSid[]="$Id$";
+extern gchar *argdelim;
extern gchar *GdmDisplayInit;
extern gchar *GdmServAuthDir;
extern gchar *GdmLogDir;
extern gint GdmXdmcp;
-extern gchar **gdm_arg_munch (const gchar *p);
extern gboolean gdm_auth_secure_display (GdmDisplay *);
extern void gdm_debug (const gchar *, ...);
extern void gdm_error (const gchar *, ...);
extern gint gdm_display_manage (GdmDisplay *);
extern void gdm_xdmcp_close();
+extern gint gdm_setenv (gchar *var, gchar *value);
-void gdm_server_start (GdmDisplay *d);
+gboolean gdm_server_start (GdmDisplay *d);
void gdm_server_stop (GdmDisplay *d);
-void gdm_server_restart (GdmDisplay *d);
+void gdm_server_spawn (GdmDisplay *d);
void gdm_server_usr1_handler (gint);
void gdm_server_alarm_handler (gint);
+void gdm_server_child_handler (gint);
GdmDisplay *gdm_server_alloc (gint id, gchar *command);
@@ -59,22 +61,31 @@ GdmDisplay *d;
sigset_t mask, omask;
-void
+/**
+ * gdm_server_start:
+ * @disp: Pointer to a GdmDisplay structure
+ *
+ * Starts a local X server. Handles retries and fatal errors properly.
+ */
+
+gboolean
gdm_server_start (GdmDisplay *disp)
{
- struct sigaction usr1;
- sigset_t usr1mask;
- gchar *srvcmd = NULL;
- gchar **argv = NULL;
- int logfd;
+ struct sigaction usr1, chld, oldchld, alrm;
+ sigset_t mask, omask;
if (!disp)
- return;
+ return FALSE;
d = disp;
+ d->servtries = 0;
gdm_debug ("gdm_server_start: %s", d->name);
+ /* Create new cookie */
+ gdm_auth_secure_display (d);
+ gdm_setenv ("DISPLAY", d->name);
+
/* Catch USR1 from X server */
usr1.sa_handler = gdm_server_usr1_handler;
usr1.sa_flags = SA_RESTART|SA_RESETHAND;
@@ -82,13 +93,97 @@ gdm_server_start (GdmDisplay *disp)
if (sigaction (SIGUSR1, &usr1, NULL) < 0) {
gdm_error (_("gdm_server_start: Error setting up USR1 signal handler"));
- exit (SERVER_ABORT);
+ return FALSE;
}
- sigemptyset (&usr1mask);
- sigaddset (&usr1mask, SIGUSR1);
- sigprocmask (SIG_UNBLOCK, &usr1mask, NULL);
+ /* Set signal mask */
+ sigemptyset (&mask);
+ sigaddset (&mask, SIGUSR1);
+ sigprocmask (SIG_UNBLOCK, &mask, &omask);
+
+ /* Is the old server (if any) still alive */
+ if (d->servpid && kill (d->servpid, 0) == 0) {
+
+ /* Reset X and force auth file reread. XCloseDisplay works on most
+ * servers but just like young Zaphod, we play it safe */
+
+ gdm_debug ("gdm_server_start: HUP'ing servpid=%d", d->servpid);
+ kill (d->servpid, SIGHUP);
+ d->servstat = SERVER_STARTED;
+ }
+ else /* No server running */
+ gdm_server_spawn (d);
+
+ /* Set signal mask */
+ sigemptyset (&mask);
+ sigaddset (&mask, SIGUSR1);
+ sigaddset (&mask, SIGCHLD);
+ sigaddset (&mask, SIGALRM);
+ sigprocmask (SIG_UNBLOCK, &mask, &omask);
+
+ /* Wait for X server to send ready signal */
+ while (d->servtries < 5) {
+ pause();
+
+ switch (d->servstat) {
+
+ case SERVER_TIMEOUT:
+ /* Unset alarm and try again */
+ alarm (0);
+ sigprocmask (SIG_SETMASK, &omask, NULL);
+
+ waitpid (d->servpid, 0, WNOHANG);
+
+ gdm_debug ("gdm_server_alarm_handler: Temporary server failure");
+ gdm_server_spawn (d);
+
+ break;
+
+ case SERVER_RUNNING:
+ /* Unset alarm */
+ alarm (0);
+ sigprocmask (SIG_SETMASK, &omask, NULL);
+
+ gdm_debug ("gdm_server_run_session: Starting display %s!", d->name);
+
+ return TRUE;
+
+ default:
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+
+void
+gdm_server_spawn (GdmDisplay *d)
+{
+ struct sigaction usr1, sigalarm, chld, ochld;
+ gchar *srvcmd = NULL;
+ gchar **argv = NULL;
+ int logfd;
+
+ if (!d)
+ return;
+
+ d->servstat = SERVER_STARTED;
+
+ /* Catch CHLD from X server */
+ chld.sa_handler = gdm_server_child_handler;
+ chld.sa_flags = 0;
+ sigemptyset (&chld.sa_mask);
+ if (sigaction (SIGCHLD, &chld, &ochld) < 0) {
+ gdm_error (_("gdm_server_start: Error setting up CHLD signal handler"));
+ return;
+ }
+
+ /* If the old server is still alive, kill it */
+ if (d->servpid && kill (d->servpid, 0) == 0)
+ gdm_server_stop (d);
+
/* Log all output from spawned programs to a file */
logfd = open (g_strconcat (GdmLogDir, "/", d->name, ".log", NULL),
O_CREAT|O_TRUNC|O_APPEND|O_WRONLY, 0666);
@@ -98,21 +193,17 @@ gdm_server_start (GdmDisplay *disp)
dup2 (logfd, 2);
}
else
- gdm_error (_("gdm_server_start: Could not open logfile for display %s!"), d->name);
-
- /* Just in case we have an old server hanging around */
- if (d->servpid) {
- gdm_debug ("gdm_server_start: Old server found (%d). Killing.", d->servpid);
- gdm_server_stop (d);
- }
-
- /* Secure display with cookie */
- gdm_auth_secure_display (d);
- setenv ("DISPLAY", d->name, TRUE);
+ gdm_error (_("gdm_server_spawn: Could not open logfile for display %s!"), d->name);
+ /* We add a timeout in case the X server fails to start. This
+ * might happen because X servers take a while to die, close their
+ * sockets etc. If the old X server isn't completely dead, the new
+ * one will fail and we'll hang here forever */
+
+ alarm (10);
+
/* Fork into two processes. Parent remains the gdm process. Child
- * becomes the X server.
- */
+ * becomes the X server. */
switch (d->servpid = fork()) {
@@ -127,7 +218,7 @@ gdm_server_start (GdmDisplay *disp)
sigemptyset (&usr1.sa_mask);
if (sigaction (SIGUSR1, &usr1, NULL) < 0) {
- gdm_error (_("gdm_server_start: Error setting USR1 to SIG_IGN"));
+ gdm_error (_("gdm_server_spawn: Error setting USR1 to SIG_IGN"));
exit (SERVER_ABORT);
}
@@ -135,33 +226,27 @@ gdm_server_start (GdmDisplay *disp)
"/", d->name, ".Xauth ",
d->name, NULL);
- gdm_debug ("gdm_server_start: '%s'", srvcmd);
+ gdm_debug ("gdm_server_spawn: '%s'", srvcmd);
- argv = gdm_arg_munch (srvcmd);
+ argv = g_strsplit (srvcmd, argdelim, MAX_ARGS);
g_free (srvcmd);
setpgid (0, 0);
-
execv (argv[0], argv);
- gdm_error (_("gdm_server_start: Xserver not found: %s"), d->command);
+ gdm_error (_("gdm_server_spawn: Xserver not found: %s"), d->command);
exit (SERVER_ABORT);
- break;
case -1:
- gdm_error (_("gdm_server_start: Can't fork Xserver process!"));
+ gdm_error (_("gdm_server_spawn: Can't fork Xserver process!"));
d->servpid = 0;
+ d->servstat = SERVER_DEAD;
break;
default:
break;
}
-
- d->servstat = SERVER_STARTED;
-
- /* Wait for X server to send ready signal */
- pause();
}
@@ -170,115 +255,34 @@ gdm_server_stop (GdmDisplay *d)
{
gdm_debug ("gdm_server_stop: Server for %s going down!", d->name);
+ d->servstat = SERVER_DEAD;
+
kill (d->servpid, SIGTERM);
waitpid (d->servpid, 0, 0);
+
d->servpid = 0;
- d->servstat = SERVER_DEAD;
-
- if (unlink (d->authfile) == -1)
- gdm_error (_("gdm_server_stop: Could not unlink auth file: %s!"), strerror (errno));
+ unlink (d->authfile);
}
void
-gdm_server_restart (GdmDisplay *d)
+gdm_server_usr1_handler (gint sig)
{
- sigset_t usr1mask;
- struct sigaction usr1, sigalarm;
-
- gdm_debug ("gdm_server_restart: Server for %s restarting!", d->name);
-
- if (d->servpid && kill (d->servpid, 0) < 0) {
- gdm_debug ("gdm_server_restart: Old server for %s still alive. Killing!", d->name);
- gdm_server_stop (d);
- gdm_server_start (d);
- return;
- }
-
- /* Create new cookie */
- gdm_auth_secure_display (d);
- setenv ("DISPLAY", d->name, TRUE);
-
- /* Catch USR1 from X server */
- usr1.sa_handler = gdm_server_usr1_handler;
- usr1.sa_flags = SA_RESTART|SA_RESETHAND;
- sigemptyset (&usr1.sa_mask);
-
- if (sigaction (SIGUSR1, &usr1, NULL) < 0) {
- gdm_error (_("gdm_server_start: Error setting up USR1 signal handler"));
- exit (SERVER_ABORT);
- }
-
- sigemptyset (&usr1mask);
- sigaddset (&usr1mask, SIGUSR1);
- sigprocmask (SIG_UNBLOCK, &usr1mask, NULL);
-
- /* Reset X and force auth file reread. XCloseDisplay works on most
- * servers but just like young Zaphod, we play it safe */
-
- gdm_debug ("gdm_server_restart: Servpid=%d", d->servpid);
- kill (d->servpid, SIGHUP);
-
- d->servstat = SERVER_STARTED;
-
- /* We add a timeout in case the X server fails to start. This
- * might happen because X servers take a while to die, close their
- * sockets etc. If the old X server isn't completely dead, the new
- * one will fail and we'll hang here forever */
-
- sigalarm.sa_handler = gdm_server_alarm_handler;
- sigalarm.sa_flags = 0;
- sigemptyset (&sigalarm.sa_mask);
-
- if (sigaction (SIGALRM, &sigalarm, NULL) < 0) {
- gdm_error (_("gdm_server_restart: Error setting up ALARM signal handler"));
- return;
- }
-
- sigemptyset (&mask);
- sigaddset (&mask, SIGALRM);
- sigprocmask (SIG_UNBLOCK, &mask, &omask);
-
- alarm (10);
-
- /* Wait for X server to send ready signal */
- pause();
+ d->servstat = SERVER_RUNNING; /* Server ready to accept connections */
}
void
gdm_server_alarm_handler (gint signal)
{
- /* Unset alarm and try again */
- alarm (0);
- sigprocmask (SIG_SETMASK, &omask, NULL);
-
- waitpid (d->servpid, 0, WNOHANG);
-
- gdm_debug ("gdm_server_alarm_handler: Temporary server failure");
- gdm_server_restart (d);
+ d->servstat = SERVER_TIMEOUT; /* Server didn't start */
}
-void
-gdm_server_usr1_handler (gint sig)
+void
+gdm_server_child_handler (gint signal)
{
- sigset_t usr1mask;
-
- /* Unset alarm */
- alarm (0);
- sigprocmask (SIG_SETMASK, &omask, NULL);
-
- gdm_debug ("gdm_server_usr1_handler: Starting display %s!", d->name);
-
- d->servstat = SERVER_RUNNING;
-
- /* Block USR1 */
- sigemptyset (&usr1mask);
- sigaddset (&usr1mask, SIGUSR1);
- sigprocmask (SIG_BLOCK, &usr1mask, NULL);
-
- gdm_display_manage (d);
+ d->servstat = SERVER_ABORT; /* Server died unexpectedly */
}
@@ -290,7 +294,7 @@ gdm_server_alloc (gint id, gchar *command)
GdmDisplay *d = g_new0 (GdmDisplay, 1);
if (gethostname (hostname, 1023) == -1)
- return (NULL);
+ return NULL;
sprintf (dname, ":%d", id);
d->authfile = NULL;
@@ -316,7 +320,7 @@ gdm_server_alloc (gint id, gchar *command)
g_free (dname);
g_free (hostname);
- return (d);
+ return d;
}
diff --git a/daemon/slave.c b/daemon/slave.c
index 386d952a..d850a9b1 100644
--- a/daemon/slave.c
+++ b/daemon/slave.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@SunSITE.auc.dk>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -17,8 +17,7 @@
*/
/* This is the gdm slave process. gdmslave runs the chooser, greeter
- * and the user's session scripts.
- */
+ * and the user's session scripts. */
#include <config.h>
#include <gnome.h>
@@ -34,11 +33,27 @@
#include <pwd.h>
#include <grp.h>
#include <errno.h>
+#include <syslog.h>
#include "gdm.h"
+#include "slave.h"
+#include "misc.h"
+#include "verify.h"
+#include "filecheck.h"
+#include "auth.h"
+
static const gchar RCSid[]="$Id$";
+/* Global vars */
+GdmDisplay *d;
+gchar *login = NULL;
+sigset_t mask, omask;
+gboolean pingack;
+gboolean greet = TRUE;
+FILE *greeter;
+
+/* Configuration option variables */
extern uid_t GdmUserId;
extern gid_t GdmGroupId;
extern gchar *GdmSessDir;
@@ -55,42 +70,22 @@ extern gint GdmRelaxPerms;
extern gint GdmKillInitClients;
extern gint GdmRetryDelay;
extern sigset_t sysmask;
-
-extern gboolean gdm_file_check (gchar *caller, uid_t user, gchar *dir, gchar *file,
- gboolean absentok, gint maxsize, gint perms);
-extern gchar **gdm_arg_munch (const gchar *p);
-extern gint gdm_exec_script (GdmDisplay*, gchar *dir);
-extern void gdm_abort (const char*, ...);
-extern void gdm_error (const char*, ...);
-extern void gdm_debug (const char*, ...);
-extern void gdm_remanage (const char*, ...);
-extern void gdm_verify_cleanup (void);
-extern gboolean gdm_auth_user_add (GdmDisplay *d, uid_t user, gchar *homedir);
-extern void gdm_auth_user_remove (GdmDisplay *d, uid_t user);
-extern void gdm_exec_command (gchar *cmd);
-extern gchar *gdm_verify_user (gchar *display);
-
-void gdm_slave_start (GdmDisplay *d);
-static gint gdm_slave_xerror_handler (Display *disp, XErrorEvent *evt);
-static gint gdm_slave_xioerror_handler (Display *disp);
-static void gdm_slave_greeter (void);
-static void gdm_slave_session_start (gchar *login);
-static void gdm_slave_session_stop (void);
-static void gdm_slave_session_cleanup (void);
-static void gdm_slave_term_handler (int sig);
-static void gdm_slave_child_handler (int sig);
-static void gdm_slave_windows_kill (void);
-static void gdm_slave_xsync_handler (int sig);
+extern gchar *argdelim;
+
+/* Local prototypes */
+static gint gdm_slave_xerror_handler (Display *disp, XErrorEvent *evt);
+static gint gdm_slave_xioerror_handler (Display *disp);
+static void gdm_slave_greeter (void);
+static void gdm_slave_session_start (void);
+static void gdm_slave_session_stop (void);
+static void gdm_slave_session_cleanup (void);
+static void gdm_slave_term_handler (int sig);
+static void gdm_slave_child_handler (int sig);
+static void gdm_slave_windows_kill (void);
+static void gdm_slave_xsync_handler (int sig);
static gboolean gdm_slave_xsync_ping (void);
-gchar *gdm_slave_greeter_ctl (gchar cmd, gchar *str);
-
-
-GdmDisplay *d;
-struct passwd *pwent;
-sigset_t mask, omask;
-gboolean pingack;
-gboolean greet = TRUE;
-FILE *greeter;
+static void gdm_slave_exit (gint status, const gchar *format, ...);
+static gint gdm_slave_exec_script (GdmDisplay*, gchar *dir);
void
@@ -106,8 +101,8 @@ gdm_slave_start (GdmDisplay *display)
d = display;
- setenv ("XAUTHORITY", d->authfile, TRUE);
- setenv ("DISPLAY", d->name, TRUE);
+ gdm_setenv ("XAUTHORITY", d->authfile);
+ gdm_setenv ("DISPLAY", d->name);
/* Handle a INT/TERM signals from gdm master */
term.sa_handler = gdm_slave_term_handler;
@@ -117,7 +112,7 @@ gdm_slave_start (GdmDisplay *display)
sigaddset (&term.sa_mask, SIGINT);
if ((sigaction (SIGTERM, &term, NULL) < 0) || (sigaction (SIGINT, &term, NULL) < 0))
- gdm_abort (_("gdm_slave_init: Error setting up TERM/INT signal handler"));
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_init: Error setting up TERM/INT signal handler"));
/* Child handler. Keeps an eye on greeter/session */
child.sa_handler = gdm_slave_child_handler;
@@ -125,7 +120,7 @@ gdm_slave_start (GdmDisplay *display)
sigemptyset (&child.sa_mask);
if (sigaction (SIGCHLD, &child, NULL) < 0)
- gdm_abort (_("gdm_slave_init: Error setting up CHLD signal handler"));
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_init: Error setting up CHLD signal handler"));
/* The signals we wish to listen to */
sigfillset (&mask);
@@ -161,21 +156,20 @@ gdm_slave_start (GdmDisplay *display)
}
-static void
+void
gdm_slave_greeter (void)
{
gint pipe1[2], pipe2[2];
- gchar *login = NULL;
gchar **argv;
gdm_debug ("gdm_slave_greeter: Running greeter on %s", d->name);
/* Run the init script. gdmslave suspends until script has terminated */
- gdm_exec_script (d, GdmDisplayInit);
+ gdm_slave_exec_script (d, GdmDisplayInit);
/* Open a pipe for greeter communications */
if (pipe (pipe1) < 0 || pipe (pipe2) < 0)
- gdm_abort (_("gdm_slave_greeter: Can't init pipe to gdmgreeter"));
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_greeter: Can't init pipe to gdmgreeter"));
greet = TRUE;
@@ -200,23 +194,23 @@ gdm_slave_greeter (void)
dup2 (pipe2[1], STDOUT_FILENO);
if (setgid (GdmGroupId) < 0)
- gdm_abort (_("gdm_slave_greeter: Couldn't set groupid to %d"), GdmGroupId);
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_greeter: Couldn't set groupid to %d"), GdmGroupId);
if (setuid (GdmUserId) < 0)
- gdm_abort (_("gdm_slave_greeter: Couldn't set userid to %d"), GdmUserId);
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_greeter: Couldn't set userid to %d"), GdmUserId);
- setenv ("XAUTHORITY", d->authfile, TRUE);
- setenv ("DISPLAY", d->name, TRUE);
- setenv ("HOME", "/", TRUE); /* Hack */
- setenv ("PATH", GdmDefaultPath, TRUE);
+ gdm_setenv ("XAUTHORITY", d->authfile);
+ gdm_setenv ("DISPLAY", d->name);
+ gdm_setenv ("HOME", "/"); /* Hack */
+ gdm_setenv ("PATH", GdmDefaultPath);
- argv = gdm_arg_munch (GdmGreeter);
+ argv = g_strsplit (GdmGreeter, argdelim, MAX_ARGS);
execv (argv[0], argv);
- gdm_abort (_("gdm_slave_greeter: Error starting greeter on display %s"), d->name);
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_greeter: Error starting greeter on display %s"), d->name);
case -1:
- gdm_abort (_("gdm_slave_greeter: Can't fork gdmgreeter process"));
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_greeter: Can't fork gdmgreeter process"));
default:
close (pipe1[0]);
@@ -247,23 +241,25 @@ gdm_slave_greeter (void)
}
}
- gdm_slave_session_start (login);
+ gdm_slave_session_start();
}
-static void
-gdm_slave_session_start (gchar *login)
+void
+gdm_slave_session_start ()
{
gchar *cfgdir, *sesspath;
struct stat statbuf;
+ struct passwd *pwent;
gchar *session, *language, *usrsess, *usrlang;
gboolean savesess = FALSE, savelang = FALSE, usrcfgok = FALSE, authok = FALSE;
gint i;
pwent = getpwnam (login);
-
+
if (!pwent)
- gdm_remanage (_("gdm_slave_session_start: User passed authentication but getpwnam(%s) failed. Spooky!"), login);
+ gdm_slave_exit (DISPLAY_REMANAGE,
+ _("gdm_slave_session_start: User passed auth but getpwnam(%s) failed!"), login);
setegid (pwent->pw_gid);
seteuid (pwent->pw_uid);
@@ -322,36 +318,37 @@ gdm_slave_session_start (gchar *login)
waitpid (d->greetpid, 0, 0);
d->greetpid = 0;
- sigprocmask (SIG_UNBLOCK, &omask, NULL);
+ sigprocmask (SIG_SETMASK, &omask, NULL);
if (GdmKillInitClients)
gdm_slave_windows_kill();
/* Prepare user session */
- setenv ("DISPLAY", d->name, TRUE);
- setenv ("LOGNAME", login, TRUE);
- setenv ("USER", login, TRUE);
- setenv ("USERNAME", login, TRUE);
- setenv ("HOME", pwent->pw_dir, TRUE);
- setenv ("GDMSESSION", session, TRUE);
- setenv ("SHELL", pwent->pw_shell, TRUE);
- putenv ("MAIL");
+ gdm_setenv ("DISPLAY", d->name);
+ gdm_setenv ("LOGNAME", login);
+ gdm_setenv ("USER", login);
+ gdm_setenv ("USERNAME", login);
+ gdm_setenv ("HOME", pwent->pw_dir);
+ gdm_setenv ("GDMSESSION", session);
+ gdm_setenv ("SHELL", pwent->pw_shell);
+ gdm_setenv ("MAIL", NULL); /* Unset $MAIL for broken shells */
/* Special PATH for root */
- if(pwent->pw_uid == 0)
- setenv ("PATH", GdmRootPath, TRUE);
+ if (pwent->pw_uid == 0)
+ gdm_setenv ("PATH", GdmRootPath);
else
- setenv ("PATH", GdmDefaultPath, TRUE);
+ gdm_setenv ("PATH", GdmDefaultPath);
/* Set locale */
if (!strcasecmp (language, "english"))
- setenv ("LANG", "C", TRUE);
+ gdm_setenv ("LANG", "C");
else
- setenv ("LANG", language, TRUE);
+ gdm_setenv ("LANG", language);
/* If script fails reset X server and restart greeter */
- if (gdm_exec_script (d, GdmPreSession) != EXIT_SUCCESS)
- gdm_remanage (_("gdm_slave_session_start: Execution of PreSession script returned > 0. Aborting."));
+ if (gdm_slave_exec_script (d, GdmPreSession) != EXIT_SUCCESS)
+ gdm_slave_exit (DISPLAY_REMANAGE,
+ _("gdm_slave_session_start: Execution of PreSession script returned > 0. Aborting."));
/* Setup cookie -- We need this information during cleanup, thus
* cookie handling is done before fork()ing */
@@ -375,7 +372,7 @@ gdm_slave_session_start (gchar *login)
switch (d->sesspid = fork()) {
case -1:
- gdm_abort (_("gdm_slave_session_start: Error forking user session"));
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_session_start: Error forking user session"));
case 0:
setpgid (0, 0);
@@ -383,13 +380,16 @@ gdm_slave_session_start (gchar *login)
umask (022);
if (setgid (pwent->pw_gid) < 0)
- gdm_remanage (_("gdm_slave_session_start: Could not setgid %d. Aborting."), pwent->pw_gid);
+ gdm_slave_exit (DISPLAY_REMANAGE,
+ _("gdm_slave_session_start: Could not setgid %d. Aborting."), pwent->pw_gid);
if (initgroups (login, pwent->pw_gid) < 0)
- gdm_remanage (_("gdm_slave_session_start: initgroups() failed for %s. Aborting."), login);
+ gdm_slave_exit (DISPLAY_REMANAGE,
+ _("gdm_slave_session_start: initgroups() failed for %s. Aborting."), login);
if (setuid (pwent->pw_uid) < 0)
- gdm_remanage (_("gdm_slave_session_start: Could not become %s. Aborting."), login);
+ gdm_slave_exit (DISPLAY_REMANAGE,
+ _("gdm_slave_session_start: Could not become %s. Aborting."), login);
chdir (pwent->pw_dir);
@@ -444,15 +444,22 @@ gdm_slave_session_start (gchar *login)
}
-static void
-gdm_slave_session_stop (void)
+void
+gdm_slave_session_stop ()
{
- gdm_debug ("gdm_slave_session_stop: %s on %s", pwent->pw_name, d->name);
+ struct passwd *pwent;
+
+ gdm_debug ("gdm_slave_session_stop: %s on %s", login, d->name);
kill (- (d->sesspid), SIGTERM);
gdm_verify_cleanup();
+ pwent = getpwnam (login); /* PAM overwrites our pwent */
+
+ if (!pwent)
+ return;
+
/* Remove display from ~user/.Xauthority */
setegid (pwent->pw_gid);
seteuid (pwent->pw_uid);
@@ -464,15 +471,14 @@ gdm_slave_session_stop (void)
}
-/* Only executed if display is still alive */
-static void
+void
gdm_slave_session_cleanup (void)
{
- gdm_debug ("gdm_slave_session_cleanup: %s on %s", pwent->pw_name, d->name);
+ gdm_debug ("gdm_slave_session_cleanup: %s on %s", login, d->name);
/* Execute post session script */
gdm_debug ("gdm_slave_session_cleanup: Running post session script");
- gdm_exec_script (d, GdmPostSession);
+ gdm_slave_exec_script (d, GdmPostSession);
if (d->dsp && gdm_slave_xsync_ping()) {
@@ -498,7 +504,7 @@ gdm_slave_term_handler (int sig)
waitpid (d->greetpid, 0, 0);
d->greetpid = 0;
}
- else if (pwent)
+ else if (login)
gdm_slave_session_stop();
gdm_debug ("gdm_slave_term_handler: Whacking client connections");
@@ -557,8 +563,8 @@ gdm_slave_windows_kill (void)
gdm_debug ("gdm_slave_windows_kill: Killing windows on %s", d->name);
- setenv ("XAUTHORITY", d->authfile, TRUE);
- setenv ("DISPLAY", d->name, TRUE);
+ gdm_setenv ("XAUTHORITY", d->authfile);
+ gdm_setenv ("DISPLAY", d->name);
for (screen = 0 ; screen < ScreenCount (disp) ; screen++) {
@@ -597,7 +603,7 @@ gdm_slave_xioerror_handler (Display *disp)
{
gdm_debug ("gdm_slave_xioerror_handler: I/O error for display %s", d->name);
- if (pwent)
+ if (login)
gdm_slave_session_stop();
gdm_error (_("gdm_slave_windows_kill_ioerror_handler: Fatal X error - Restarting %s"), d->name);
@@ -632,7 +638,7 @@ gdm_slave_xsync_ping (void)
sigemptyset (&sigalarm.sa_mask);
if (sigaction (SIGALRM, &sigalarm, NULL) < 0)
- gdm_abort (_("gdm_slave_xsync_ping: Error setting up ALARM signal handler"));
+ gdm_slave_exit (DISPLAY_ABORT, _("gdm_slave_xsync_ping: Error setting up ALARM signal handler"));
sigemptyset (&mask);
sigaddset (&mask, SIGALRM);
@@ -655,8 +661,15 @@ gchar *
gdm_slave_greeter_ctl (gchar cmd, gchar *str)
{
gchar buf[FIELD_SIZE];
-
- g_print ("%c%s\n", cmd, str);
+ guchar c;
+
+ if (str)
+ g_print ("%c%c%s\n", STX, cmd, str);
+ else
+ g_print ("%c%c\n", STX, cmd);
+
+ /* Skip random junk that might have accumulated */
+ do { c = getc (greeter); } while (c && c != STX);
fgets (buf, FIELD_SIZE-1, greeter);
@@ -669,4 +682,80 @@ gdm_slave_greeter_ctl (gchar cmd, gchar *str)
}
+static void
+gdm_slave_exit (gint status, const gchar *format, ...)
+{
+ va_list args;
+ gchar *s;
+
+ va_start (args, format);
+ s = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ syslog (LOG_ERR, s);
+
+ g_free (s);
+
+ /* Kill children where applicable */
+ if (d->greetpid)
+ kill (SIGTERM, d->greetpid);
+
+ if (d->chooserpid)
+ kill (SIGTERM, d->chooserpid);
+
+ if (d->sesspid)
+ kill (SIGTERM, d->sesspid);
+
+ if (d->servpid)
+ kill (SIGTERM, d->servpid);
+
+ exit (status);
+}
+
+
+static gint
+gdm_slave_exec_script (GdmDisplay *d, gchar *dir)
+{
+ pid_t pid;
+ gchar *script, *defscript, *scr;
+ gchar **argv;
+ gint status;
+
+ if (!d || !dir)
+ return EXIT_SUCCESS;
+
+ script = g_strconcat (dir, "/", d->name, NULL);
+ defscript = g_strconcat (dir, "/Default", NULL);
+
+ if (! access (script, R_OK|X_OK))
+ scr = script;
+ else if (! access (defscript, R_OK|X_OK))
+ scr = defscript;
+ else
+ return EXIT_SUCCESS;
+
+ switch (pid = fork()) {
+
+ case 0:
+ gdm_setenv ("PATH", GdmRootPath);
+ argv = g_strsplit (scr, argdelim, MAX_ARGS);
+ execv (argv[0], argv);
+ syslog (LOG_ERR, _("gdm_slave_exec_script: Failed starting: %s"), scr);
+ return EXIT_SUCCESS;
+
+ case -1:
+ syslog (LOG_ERR, _("gdm_slave_exec_script: Can't fork script process!"));
+ return EXIT_SUCCESS;
+
+ default:
+ waitpid (pid, &status, 0); /* Wait for script to finish */
+
+ if (WIFEXITED (status))
+ return WEXITSTATUS (status);
+ else
+ return EXIT_SUCCESS;
+ }
+}
+
+
/* EOF */
diff --git a/daemon/slave.h b/daemon/slave.h
new file mode 100644
index 00000000..6deaf4a1
--- /dev/null
+++ b/daemon/slave.h
@@ -0,0 +1,31 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_SLAVE_H
+#define GDM_SLAVE_H
+
+#include <glib.h>
+#include <X11/Xlib.h>
+#include "gdm.h"
+
+void gdm_slave_start (GdmDisplay *d);
+gchar *gdm_slave_greeter_ctl (gchar cmd, gchar *str);
+
+#endif /* GDM_SLAVE_H */
+
+/* EOF */
diff --git a/daemon/verify-crypt.c b/daemon/verify-crypt.c
new file mode 100644
index 00000000..10de5f3f
--- /dev/null
+++ b/daemon/verify-crypt.c
@@ -0,0 +1,119 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <gnome.h>
+#include <syslog.h>
+#include <pwd.h>
+
+#ifdef HAVE_CRYPT
+ #include <crypt.h>
+#endif /* HAVE_CRYPT */
+
+#include "gdm.h"
+#include "misc.h"
+#include "slave.h"
+#include "verify.h"
+
+static const gchar RCSid[]="$Id$";
+
+
+/* Configuration option variables */
+extern gboolean GdmVerboseAuth;
+extern gboolean GdmAllowRoot;
+
+
+/**
+ * gdm_verify_user:
+ * @display: Name of display to register with the authentication system
+ *
+ * Provides a communication layer between the operating system's
+ * authentication functions and the gdmgreeter.
+ *
+ * Returns the user's login on success and NULL on failure.
+ */
+
+gchar *
+gdm_verify_user (const gchar *display)
+{
+ gchar *login, *passwd, *ppasswd;
+ struct passwd *pwent;
+
+ /* Ask for the user's login */
+ login = gdm_slave_greeter_ctl (GDM_PROMPT, _("Login:"));
+ pwent = getpwnam (login);
+
+ ppasswd = !pwent ? NULL : pwent->pw_passwd;
+
+ /* Request the user's password */
+ passwd = gdm_slave_greeter_ctl (GDM_NOECHO, _("Password:"));
+
+ /* If verbose authentication is enabled, output messages from the
+ * authentication system */
+ if (GdmVerboseAuth) {
+
+ if (!pwent) {
+ gdm_error (_("Couldn't authenticate %s"), login);
+ gdm_slave_greeter_ctl (GDM_MSGERR, _("User unknown"));
+ return NULL;
+ }
+
+ if (GdmAllowRoot == 0 && pwent->pw_uid == 0) {
+ gdm_error (_("Root login disallowed on display '%s'"), display);
+ gdm_slave_greeter_ctl (GDM_MSGERR, _("Root login disallowed"));
+ return NULL;
+ }
+ }
+
+ /* Check whether password is valid */
+ if (!passwd || !ppasswd || strcmp (crypt (passwd, ppasswd), ppasswd)) {
+
+ if (GdmVerboseAuth)
+ gdm_slave_greeter_ctl (GDM_MSGERR, _("Incorrect password"));
+
+ return NULL;
+ }
+
+ return login;
+}
+
+
+/**
+ * gdm_verify_cleanup:
+ *
+ * Unregister the user's session */
+
+void
+gdm_verify_check (void)
+{
+}
+
+/**
+ * gdm_verify_check:
+ *
+ * Check that the authentication system is correctly configured.
+ *
+ * Aborts daemon on error
+ */
+
+void
+gdm_verify_check (void)
+{
+}
+
+/* EOF */
diff --git a/daemon/verify.c b/daemon/verify-pam.c
index db395eba..8b960502 100644
--- a/daemon/verify.c
+++ b/daemon/verify-pam.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -16,60 +16,39 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <syslog.h>
-#include <pwd.h>
-#include <glib.h>
#include <config.h>
#include <gnome.h>
-
-#ifdef HAVE_PAM
- #include <security/pam_appl.h>
-#endif /* HAVE_PAM */
-
-#ifdef HAVE_CRYPT
- #include <crypt.h>
-#endif /* HAVE_CRYPT */
-
-#ifdef HAVE_SHADOW
- #include <shadow.h>
-#endif /* HAVE_SHADOW */
+#include <sys/stat.h>
+#include <syslog.h>
+#include <security/pam_appl.h>
#include "gdm.h"
+#include "misc.h"
+#include "slave.h"
+#include "verify.h"
static const gchar RCSid[]="$Id$";
-extern void gdm_abort (const char*, ...);
-extern void gdm_fail (const gchar *, ...);
-extern void gdm_debug (const char*, ...);
-extern void gdm_error (const char*, ...);
-extern gchar *gdm_slave_greeter_ctl (gchar cmd, gchar *str);
+/* Configuration option variables */
extern gboolean GdmVerboseAuth;
extern gboolean GdmAllowRoot;
-gchar *gdm_verify_user (gchar *display);
-void gdm_verify_cleanup (void);
-void gdm_verify_check (void);
-
-
-#ifdef HAVE_PAM
-
+/* Local PAM handle */
pam_handle_t *pamh;
+/* Internal PAM conversation function. Interfaces between the PAM
+ * authentication system and the actual greeter program */
+
static gint
gdm_verify_pam_conv (int num_msg, const struct pam_message **msg,
struct pam_response **resp,
void *appdata_ptr)
{
gint replies = 0;
- struct pam_response *reply = NULL;
gchar *s;
+ struct pam_response *reply = NULL;
reply = g_new0 (struct pam_response, num_msg);
@@ -81,6 +60,7 @@ gdm_verify_pam_conv (int num_msg, const struct pam_message **msg,
switch (msg[replies]->msg_style) {
case PAM_PROMPT_ECHO_ON:
+ /* PAM requested textual input with echo on */
s = gdm_slave_greeter_ctl (GDM_PROMPT, (gchar *) msg[replies]->msg);
reply[replies].resp_retcode = PAM_SUCCESS;
reply[replies].resp = g_strdup (s);
@@ -88,6 +68,7 @@ gdm_verify_pam_conv (int num_msg, const struct pam_message **msg,
break;
case PAM_PROMPT_ECHO_OFF:
+ /* PAM requested textual input with echo off */
s = gdm_slave_greeter_ctl (GDM_NOECHO, (gchar *) msg[replies]->msg);
reply[replies].resp_retcode = PAM_SUCCESS;
reply[replies].resp = g_strdup (s);
@@ -96,20 +77,22 @@ gdm_verify_pam_conv (int num_msg, const struct pam_message **msg,
case PAM_ERROR_MSG:
case PAM_TEXT_INFO:
+ /* PAM sent a message that should displayed to the user */
gdm_slave_greeter_ctl (GDM_MSGERR, (gchar *) msg[replies]->msg);
reply[replies].resp_retcode = PAM_SUCCESS;
reply[replies].resp = NULL;
break;
default:
+ /* PAM has been smoking serious crack */
g_free (reply);
- return (PAM_CONV_ERR);
+ return PAM_CONV_ERR;
}
}
*resp = reply;
- return (PAM_SUCCESS);
+ return PAM_SUCCESS;
}
@@ -119,58 +102,84 @@ static struct pam_conv pamc = {
};
+/**
+ * gdm_verify_user:
+ * @display: Name of display to register with the authentication system
+ *
+ * Provides a communication layer between the operating system's
+ * authentication functions and the gdmgreeter.
+ *
+ * Returns the user's login on success and NULL on failure.
+ */
+
gchar *
-gdm_verify_user (gchar *display)
+gdm_verify_user (const gchar *display)
{
- gint pamerr, i;
+ gint pamerr;
gchar *login;
gchar **pamenv;
+ /* Ask gdmgreeter for the user's login. Just for good measure */
login = gdm_slave_greeter_ctl (GDM_PROMPT, _("Login:"));
if (!login)
- return (NULL);
-
+ return NULL;
+
+ /* Initialize a PAM session for the user */
if ((pamerr = pam_start ("gdm", login, &pamc, &pamh)) != PAM_SUCCESS) {
gdm_error (_("Can't find /etc/pam.d/gdm!"));
goto pamerr;
}
+ /* Inform PAM of the user's tty */
if ((pamerr = pam_set_item (pamh, PAM_TTY, display)) != PAM_SUCCESS) {
- gdm_error (_("Can't set PAM_TTY=%s"), ":0");
+ gdm_error (_("Can't set PAM_TTY=%s"), display);
goto pamerr;
}
-
+
+ /* Start authentication session */
if ((pamerr = pam_authenticate (pamh, 0)) != PAM_SUCCESS) {
gdm_error (_("Couldn't authenticate %s"), login);
goto pamerr;
}
-
- if ((pamerr = pam_acct_mgmt (pamh, 0)) != PAM_SUCCESS) {
+
+ /* If the user's password has expired, ask for a new one */
+ pamerr = pam_acct_mgmt (pamh, 0);
+
+ if (pamerr == PAM_NEW_AUTHTOK_REQD)
+ pamerr = pam_chauthtok (pamh, PAM_CHANGE_EXPIRED_AUTHTOK);
+
+ if (pamerr != PAM_SUCCESS) {
gdm_error (_("Couldn't set acct. mgmt for %s"), login);
goto pamerr;
}
+ /* Set credentials */
if ((pamerr = pam_setcred (pamh, 0)) != PAM_SUCCESS) {
gdm_error (_("Couldn't set credentials for %s"), login);
goto pamerr;
}
+ /* Register the session */
if ((pamerr = pam_open_session (pamh, 0)) != PAM_SUCCESS) {
gdm_error (_("Couldn't open session for %s"), login);
goto pamerr;
}
+ /* Migrate any PAM env. variables to the user's environment */
if ((pamenv = pam_getenvlist (pamh))) {
- for (i = 0 ; pamenv[i] ; i++) {
+ gint i;
+
+ for (i = 0 ; pamenv[i] ; i++)
putenv (pamenv[i]);
- }
}
- return (login);
+ return login;
pamerr:
+ /* The verbose authentication is turned on, output the error
+ * message from the PAM subsystem */
if (GdmVerboseAuth)
gdm_slave_greeter_ctl (GDM_MSGERR, (gchar *) pam_strerror (pamh, pamerr));
@@ -178,108 +187,50 @@ gdm_verify_user (gchar *display)
pamh = NULL;
/* Workaround to avoid gdm messages being logged as PAM_pwdb */
- closelog();
+ closelog ();
openlog ("gdm", LOG_PID, LOG_DAEMON);
- return (NULL);
+ return NULL;
}
-#else /* HAVE_PAM */
-
+/**
+ * gdm_verify_cleanup:
+ *
+ * Unregister the user's session
+ */
-gchar *
-gdm_verify_user (gchar *display)
+void
+gdm_verify_cleanup (void)
{
- gchar *login, *passwd, *ppasswd;
- struct passwd *pwent;
-
-#ifdef HAVE_SHADOW
- struct spwd *sp;
-#endif
-
- login = gdm_slave_greeter_ctl (GDM_PROMPT, _("Login:"));
- pwent = getpwnam (login);
-
- ppasswd = !pwent ? NULL : pwent->pw_passwd;
-
-#ifdef HAVE_SHADOW
-
- sp = getspnam (login);
-
- if (sp)
- ppasswd = sp->sp_pwdp;
-
- endspent();
-
-#endif /* HAVE_SHADOW */
-
- passwd = gdm_slave_greeter_ctl (GDM_NOECHO, _("Password:"));
-
- if (GdmVerboseAuth) {
-
- if (!pwent) {
- gdm_error (_("Couldn't authenticate %s"), login);
- gdm_slave_greeter_ctl (GDM_MSGERR, _("User unknown"));
- return (NULL);
- }
-
- if (pwent->pw_uid == 0) {
- gdm_error (_("Root login disallowed on display '%s'"), display);
- gdm_slave_greeter_ctl (GDM_MSGERR, _("Root login disallowed"));
- return (NULL);
- }
- }
-
- if (!passwd || !ppasswd || strcmp (crypt (passwd, ppasswd), ppasswd)) {
-
- if (GdmVerboseAuth)
- gdm_slave_greeter_ctl (GDM_MSGERR, _("Incorrect password"));
-
- return (NULL);
+ if (pamh) {
+ pam_close_session (pamh, 0);
+ pam_end (pamh, PAM_SUCCESS);
+ pamh = NULL;
}
- return (login);
+ /* Workaround to avoid gdm messages being logged as PAM_pwdb */
+ closelog ();
+ openlog ("gdm", LOG_PID, LOG_DAEMON);
}
-#endif /* HAVE_PAM */
+/**
+ * gdm_verify_check:
+ *
+ * Check that the authentication system is correctly configured.
+ *
+ * Aborts daemon on error
+ */
void
gdm_verify_check (void)
{
-
-#ifdef HAVE_PAM
struct stat statbuf;
if (stat ("/etc/pam.d/gdm", &statbuf) && stat ("/etc/pam.conf", &statbuf))
gdm_fail (_("gdm_verify_check: Can't find PAM configuration file for gdm"));
-
-#endif /* HAVE_PAM */
-
}
-void
-gdm_verify_cleanup (void)
-{
-
-#ifdef HAVE_PAM
-
- gdm_debug ("gdm_verify_cleanup: Closing session %d", pamh);
-
- if (pamh) {
- pam_close_session (pamh, 0);
- pam_end (pamh, PAM_SUCCESS);
- pamh = NULL;
- }
-
- /* Workaround to avoid gdm messages being logged as PAM_pwdb */
- closelog();
- openlog ("gdm", LOG_PID, LOG_DAEMON);
-
-#endif /* HAVE_PAM */
-
-}
-
/* EOF */
diff --git a/daemon/verify-shadow.c b/daemon/verify-shadow.c
new file mode 100644
index 00000000..c4a809c6
--- /dev/null
+++ b/daemon/verify-shadow.c
@@ -0,0 +1,130 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <gnome.h>
+#include <syslog.h>
+#include <pwd.h>
+#include <shadow.h>
+
+#ifdef HAVE_CRYPT
+ #include <crypt.h>
+#endif /* HAVE_CRYPT */
+
+#include "gdm.h"
+#include "misc.h"
+#include "slave.h"
+#include "verify.h"
+
+static const gchar RCSid[]="$Id$";
+
+
+/* Configuration option variables */
+extern gboolean GdmVerboseAuth;
+extern gboolean GdmAllowRoot;
+
+
+/**
+ * gdm_verify_user:
+ * @display: Name of display to register with the authentication system
+ *
+ * Provides a communication layer between the operating system's
+ * authentication functions and the gdmgreeter.
+ *
+ * Returns the user's login on success and NULL on failure.
+ */
+
+gchar *
+gdm_verify_user (const gchar *display)
+{
+ gchar *login, *passwd, *ppasswd;
+ struct passwd *pwent;
+ struct spwd *sp;
+
+ /* Ask for the user's login */
+ login = gdm_slave_greeter_ctl (GDM_PROMPT, _("Login:"));
+ pwent = getpwnam (login);
+
+ ppasswd = !pwent ? NULL : pwent->pw_passwd;
+
+ /* Lookup shadow password */
+ sp = getspnam (login);
+
+ if (sp)
+ ppasswd = sp->sp_pwdp;
+
+ endspent();
+
+ /* Request the user's password */
+ passwd = gdm_slave_greeter_ctl (GDM_NOECHO, _("Password:"));
+
+ /* If verbose authentication is enabled, output messages from the
+ * authentication system */
+ if (GdmVerboseAuth) {
+
+ if (!pwent) {
+ gdm_error (_("Couldn't authenticate %s"), login);
+ gdm_slave_greeter_ctl (GDM_MSGERR, _("User unknown"));
+ return NULL;
+ }
+
+ if (GdmAllowRoot == 0 && pwent->pw_uid == 0) {
+ gdm_error (_("Root login disallowed on display '%s'"), display);
+ gdm_slave_greeter_ctl (GDM_MSGERR, _("Root login disallowed"));
+ return NULL;
+ }
+ }
+
+ /* Check whether password is valid */
+ if (!passwd || !ppasswd || strcmp (crypt (passwd, ppasswd), ppasswd)) {
+
+ if (GdmVerboseAuth)
+ gdm_slave_greeter_ctl (GDM_MSGERR, _("Incorrect password"));
+
+ return NULL;
+ }
+
+ return login;
+}
+
+
+/**
+ * gdm_verify_cleanup:
+ *
+ * Unregister the user's session */
+
+void
+gdm_verify_check (void)
+{
+}
+
+
+/**
+ * gdm_verify_check:
+ *
+ * Check that the authentication system is correctly configured.
+ *
+ * Aborts daemon on error
+ */
+
+void
+gdm_verify_check (void)
+{
+}
+
+/* EOF */
diff --git a/daemon/verify.h b/daemon/verify.h
new file mode 100644
index 00000000..b5a4285e
--- /dev/null
+++ b/daemon/verify.h
@@ -0,0 +1,30 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_VERIFY_H
+#define GDM_VERIFY_H
+
+#include "gdm.h"
+
+gchar *gdm_verify_user (const gchar *display);
+void gdm_verify_cleanup (void);
+void gdm_verify_check (void);
+
+#endif /* GDM_VERIFY_H */
+
+/* EOF */
diff --git a/daemon/xdmcp.c b/daemon/xdmcp.c
index de26cb3d..928c3506 100644
--- a/daemon/xdmcp.c
+++ b/daemon/xdmcp.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -81,11 +81,13 @@
#endif
#include "gdm.h"
+#include "xdmcp.h"
+#include "display.h"
+#include "misc.h"
+#include "auth.h"
static const gchar RCSid[]="$Id$";
-int XdmcpReallocARRAY8 (ARRAY8Ptr array, int length);
-
/* TCP Wrapper syslog control */
gint allow_severity = LOG_INFO;
gint deny_severity = LOG_WARNING;
@@ -110,6 +112,29 @@ extern gint GdmMaxSessions; /* Maximum number of remote sessions */
extern gint GdmPort; /* UDP port number */
extern gint GdmIndirect; /* Honor XDMCP_INDIRECT, i.e. choosing */
extern gint GdmMaxIndirectWait; /* Max wait between INDIRECT_QUERY and MANAGE */
+extern gint GdmDispPerHost; /* Max number of displays per remote host */
+
+/* Local prototypes */
+static void gdm_xdmcp_decode_packet (void);
+static void gdm_xdmcp_handle_query (struct sockaddr_in *clnt_sa, gint len, gint type);
+static void gdm_xdmcp_send_forward_query (GdmIndirectDisplay *id, ARRAYofARRAY8Ptr authlist);
+static void gdm_xdmcp_handle_forward_query (struct sockaddr_in *clnt_sa, gint len);
+static void gdm_xdmcp_handle_request (struct sockaddr_in *clnt_sa, gint len);
+static void gdm_xdmcp_handle_manage (struct sockaddr_in *clnt_sa, gint len);
+static void gdm_xdmcp_handle_keepalive (struct sockaddr_in *clnt_sa, gint len);
+static void gdm_xdmcp_send_willing (struct sockaddr_in *clnt_sa);
+static void gdm_xdmcp_send_unwilling (struct sockaddr_in *clnt_sa, gint type);
+static void gdm_xdmcp_send_accept (struct sockaddr_in *clnt_sa, gint displaynum);
+static void gdm_xdmcp_send_decline (struct sockaddr_in *clnt_sa);
+static void gdm_xdmcp_send_refuse (struct sockaddr_in *clnt_sa, CARD32 sessid);
+static void gdm_xdmcp_send_failed (struct sockaddr_in *clnt_sa, CARD32 sessid);
+static void gdm_xdmcp_send_alive (struct sockaddr_in *clnt_sa, CARD32 sessid);
+static gboolean gdm_xdmcp_host_allow (struct sockaddr_in *cnlt_sa);
+static GdmDisplay *gdm_xdmcp_display_alloc (struct sockaddr_in *, gint);
+static GdmDisplay *gdm_xdmcp_display_lookup (CARD32 sessid);
+static void gdm_xdmcp_display_dispose_check (gchar *name);
+static void gdm_xdmcp_displays_check (void);
+
/*
* We don't support XDM-AUTHENTICATION-1 and XDM-AUTHORIZATION-1.
@@ -134,42 +159,11 @@ static XdmAuthRec serv_authlist = {
};
-extern gchar *gdm_cookie_generate (void);
-extern void gdm_abort (const gchar *format, ...);
-extern void gdm_debug (const gchar *format, ...);
-extern void gdm_error (const gchar *format, ...);
-extern gboolean gdm_auth_secure_display (GdmDisplay *d);
-extern gint gdm_display_manage (GdmDisplay *d);
-extern void gdm_display_dispose (GdmDisplay *d);
extern gboolean gdm_choose_socket_handler (GIOChannel *source, GIOCondition cond, gint fd);
extern GdmIndirectDisplay *gdm_choose_indirect_alloc (struct sockaddr_in *clnt_sa);
extern GdmIndirectDisplay *gdm_choose_indirect_lookup (struct sockaddr_in *clnt_sa);
-int gdm_xdmcp_init (void);
-void gdm_xdmcp_run (void);
-void gdm_xdmcp_close (void);
-static void gdm_xdmcp_decode_packet (void);
-static void gdm_xdmcp_handle_query (struct sockaddr_in *clnt_sa, gint len, gint type);
-static void gdm_xdmcp_send_forward_query (GdmIndirectDisplay *id, ARRAYofARRAY8Ptr authlist);
-static void gdm_xdmcp_handle_forward_query (struct sockaddr_in *clnt_sa, gint len);
-static void gdm_xdmcp_handle_request (struct sockaddr_in *clnt_sa, gint len);
-static void gdm_xdmcp_handle_manage (struct sockaddr_in *clnt_sa, gint len);
-static void gdm_xdmcp_handle_keepalive (struct sockaddr_in *clnt_sa, gint len);
-static void gdm_xdmcp_send_willing (struct sockaddr_in *clnt_sa);
-static void gdm_xdmcp_send_unwilling (struct sockaddr_in *clnt_sa, gint type);
-static void gdm_xdmcp_send_accept (struct sockaddr_in *clnt_sa, gint displaynum);
-static void gdm_xdmcp_send_decline (struct sockaddr_in *clnt_sa);
-static void gdm_xdmcp_send_refuse (struct sockaddr_in *clnt_sa, CARD32 sessid);
-static void gdm_xdmcp_send_failed (struct sockaddr_in *clnt_sa, CARD32 sessid);
-static void gdm_xdmcp_send_alive (struct sockaddr_in *clnt_sa, CARD32 sessid);
-static gboolean gdm_xdmcp_host_allow (struct sockaddr_in *cnlt_sa);
-static GdmDisplay *gdm_xdmcp_display_alloc (struct sockaddr_in *, gint);
-static GdmDisplay *gdm_xdmcp_display_lookup (CARD32 sessid);
-static void gdm_xdmcp_display_dispose_check (gchar *name);
-static void gdm_xdmcp_displays_check (void);
-
-
int
gdm_xdmcp_init (void)
{
@@ -181,7 +175,7 @@ gdm_xdmcp_init (void)
/* Fetch and store local hostname in XDMCP friendly format */
if (gethostname (hostbuf, 255))
- gdm_abort (_("gdm_xdmcp_init: Could not get server hostname: %s!"), strerror (errno));
+ gdm_fail (_("gdm_xdmcp_init: Could not get server hostname: %s!"), strerror (errno));
uname (&name);
sysid = g_strconcat (name.sysname, " ", name.release, NULL);
@@ -195,14 +189,14 @@ gdm_xdmcp_init (void)
xdmcpfd = socket (AF_INET, SOCK_DGRAM, 0); /* UDP */
if (xdmcpfd == -1)
- gdm_abort (_("gdm_xdmcp_init: Could not create socket!"));
+ gdm_fail (_("gdm_xdmcp_init: Could not create socket!"));
serv_sa.sin_family = AF_INET;
serv_sa.sin_port = htons (GdmPort); /* UDP 177 */
serv_sa.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (xdmcpfd, (struct sockaddr_in *) &serv_sa, sizeof (serv_sa)) == -1)
- gdm_abort (_("gdm_xdmcp_init: Could not bind to XDMCP socket!"));
+ gdm_fail (_("gdm_xdmcp_init: Could not bind to XDMCP socket!"));
/* Setup FIFO if choosing is enabled */
if (GdmIndirect) {
@@ -211,17 +205,17 @@ gdm_xdmcp_init (void)
fifopath = g_strconcat (GdmServAuthDir, "/.gdmchooser", NULL);
if (!fifopath)
- gdm_abort (_("gdm_xdmcp_init: Can't alloc fifopath"));
+ gdm_fail (_("gdm_xdmcp_init: Can't alloc fifopath"));
unlink (fifopath);
if (mkfifo (fifopath, 0660) < 0)
- gdm_abort (_("gdm_xdmcp_init: Could not make FIFO for chooser"));
+ gdm_fail (_("gdm_xdmcp_init: Could not make FIFO for chooser"));
choosefd = open (fifopath, O_RDWR); /* Open with write to avoid EOF */
if (!choosefd)
- gdm_abort (_("gdm_xdmcp_init: Could not open FIFO for chooser"));
+ gdm_fail (_("gdm_xdmcp_init: Could not open FIFO for chooser"));
chmod (fifopath, 0660);
@@ -914,8 +908,8 @@ gdm_xdmcp_host_allow (struct sockaddr_in *clnt_sa)
static GdmDisplay *
gdm_xdmcp_display_alloc (struct sockaddr_in *clnt_sa, gint displaynum)
{
- GdmDisplay *d;
- struct hostent *client_he;
+ GdmDisplay *d = NULL;
+ struct hostent *client_he = NULL;
d = g_malloc (sizeof (GdmDisplay));
d->authfile = NULL;
diff --git a/daemon/xdmcp.h b/daemon/xdmcp.h
new file mode 100644
index 00000000..97e78415
--- /dev/null
+++ b/daemon/xdmcp.h
@@ -0,0 +1,38 @@
+/* GDM - The Gnome Display Manager
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
+ *
+ * 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GDM_XDMCP_H
+#define GDM_XDMCP_H
+
+#include <glib.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xauth.h>
+#include <X11/Xdmcp.h>
+#include "gdm.h"
+
+int gdm_xdmcp_init (void);
+void gdm_xdmcp_run (void);
+void gdm_xdmcp_close (void);
+
+/* Fix broken X includes */
+int XdmcpReallocARRAY8 (ARRAY8Ptr array, int length);
+
+#endif /* GDM_XDMCP_H */
+
+/* EOF */
diff --git a/docs/C/gdm.sgml b/docs/C/gdm.sgml
index ffb0d412..c7fa0e9d 100644
--- a/docs/C/gdm.sgml
+++ b/docs/C/gdm.sgml
@@ -810,6 +810,20 @@
<title>[xdmcp]</title>
<varlistentry>
+ <term>DisplaysPerHost</term>
+ <listitem>
+ <synopsis>DisplaysPerHost=1</synopsis>
+ <para>
+ To prevent attackers from filling up the pending
+ queue, GDM will only allow one connection for each
+ remote machine. If you want to provide display
+ services to machines with more than one screen, you
+ should increase the DisplaysPerHost value accordingly.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>Enable</term>
<listitem>
<synopsis>Enable=0</synopsis>
diff --git a/gui/gdmchooser.c b/gui/gdmchooser.c
index 42f8f061..f09d7ecd 100644
--- a/gui/gdmchooser.c
+++ b/gui/gdmchooser.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K, Petersen <mkp@mkp.net>
*
* 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
@@ -18,8 +18,7 @@
/* gdmchooser discovers hosts running XDMCP on the local network(s),
* presents a list of them and allows the user to choose one. The
- * selected hostname will be printed on stdout.
- */
+ * selected hostname will be printed on stdout. */
#include <config.h>
#include <gnome.h>
@@ -103,9 +102,9 @@ gdm_chooser_sort_func(gpointer d1, gpointer d2)
GdmChooserHost *b = d2;
if (!d1 || !d2)
- return (0);
+ return 0;
- return (strcmp (a->name, b->name));
+ return strcmp (a->name, b->name);
}
@@ -130,42 +129,42 @@ gdm_chooser_decode_packet (void)
if (header.version != XDM_PROTOCOL_VERSION)
return;
- if (header.opcode == WILLING) {
-
- if (! XdmcpReadARRAY8 (&buf, &auth))
- goto done;
-
- if (! XdmcpReadARRAY8 (&buf, &host))
- goto done;
-
- if (! XdmcpReadARRAY8 (&buf, &stat))
- goto done;
-
- status = g_strndup (stat.data, stat.length);
-
- he = gethostbyaddr ((gchar *) &clnt_sa.sin_addr,
- sizeof (struct in_addr),
- AF_INET);
-
- hostname = (he && he->h_name) ? he->h_name : inet_ntoa (clnt_sa.sin_addr);
-
- /* We can't pipe hostnames larger than this */
- if (strlen (hostname)+1 > PIPE_BUF)
- goto done;
-
- hosts = g_list_insert_sorted (hosts,
- gdm_chooser_host_alloc (hostname, (gchar *) status),
- (GCompareFunc) gdm_chooser_sort_func);
-
- done:
- XdmcpDisposeARRAY8 (&auth);
- XdmcpDisposeARRAY8 (&host);
- XdmcpDisposeARRAY8 (&stat);
-
- g_free (status);
-
+ if (header.opcode != WILLING)
return;
- }
+
+ if (! XdmcpReadARRAY8 (&buf, &auth))
+ goto done;
+
+ if (! XdmcpReadARRAY8 (&buf, &host))
+ goto done;
+
+ if (! XdmcpReadARRAY8 (&buf, &stat))
+ goto done;
+
+ status = g_strndup (stat.data, stat.length);
+
+ he = gethostbyaddr ((gchar *) &clnt_sa.sin_addr,
+ sizeof (struct in_addr),
+ AF_INET);
+
+ hostname = (he && he->h_name) ? he->h_name : inet_ntoa (clnt_sa.sin_addr);
+
+ /* We can't pipe hostnames larger than this */
+ if (strlen (hostname)+1 > PIPE_BUF)
+ goto done;
+
+ hosts = g_list_insert_sorted (hosts,
+ gdm_chooser_host_alloc (hostname, (gchar *) status),
+ (GCompareFunc) gdm_chooser_sort_func);
+
+ done:
+ XdmcpDisposeARRAY8 (&auth);
+ XdmcpDisposeARRAY8 (&host);
+ XdmcpDisposeARRAY8 (&stat);
+
+ g_free (status);
+
+ return;
}
@@ -204,9 +203,8 @@ gdm_chooser_find_bcaddr (void)
if ((ifreq->ifr_flags & IFF_BROADCAST) == 0)
goto done;
- if (ioctl (sockfd, SIOCGIFBRDADDR, ifreq) < 0) {
+ if (ioctl (sockfd, SIOCGIFBRDADDR, ifreq) < 0)
goto done;
- }
ba = (struct sockaddr_in *) &ifreq->ifr_broadaddr;
@@ -253,10 +251,10 @@ gdm_chooser_xdmcp_discover (void)
bl = bl->next;
}
- tid = g_timeout_add (GdmScanTime*1000,
+ tid = g_timeout_add (GdmScanTime * 1000,
(GSourceFunc) gdm_chooser_browser_update, NULL);
- return (TRUE);
+ return TRUE;
}
@@ -299,7 +297,7 @@ gdm_chooser_cancel (void)
closelog();
gtk_main_quit();
- return (TRUE);
+ return TRUE;
}
@@ -312,7 +310,7 @@ gdm_chooser_manage (void)
closelog();
gtk_main_quit();
- return (TRUE);
+ return TRUE;
}
@@ -359,7 +357,7 @@ static gboolean
gdm_chooser_browser_select (GtkWidget *widget, gint selected, GdkEvent *event)
{
if (!widget || !event)
- return (TRUE);
+ return TRUE;
switch (event->type) {
@@ -373,7 +371,7 @@ gdm_chooser_browser_select (GtkWidget *widget, gint selected, GdkEvent *event)
break;
}
- return (TRUE);
+ return TRUE;
}
@@ -381,7 +379,7 @@ static gboolean
gdm_chooser_browser_unselect (GtkWidget *widget, gint selected, GdkEvent *event)
{
if (!event)
- return(TRUE);
+ return TRUE;
switch (event->type) {
@@ -395,7 +393,7 @@ gdm_chooser_browser_unselect (GtkWidget *widget, gint selected, GdkEvent *event)
break;
}
- return (TRUE);
+ return TRUE;
}
@@ -636,7 +634,7 @@ gdm_chooser_host_alloc (gchar *hostname, gchar *description)
g_free (hostimg);
- return (host);
+ return host;
}
diff --git a/gui/gdmchooser.h b/gui/gdmchooser.h
index 97ddfd04..4fc2a95f 100644
--- a/gui/gdmchooser.h
+++ b/gui/gdmchooser.h
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@SunSITE.auc.dk>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
diff --git a/gui/gdmlogin.c b/gui/gdmlogin.c
index 23eae8f8..a7b0b475 100644
--- a/gui/gdmlogin.c
+++ b/gui/gdmlogin.c
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1998, 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
@@ -33,13 +33,10 @@
#include "gdmlogin.h"
#include "gdm.h"
+#include "filecheck.h"
static const gchar RCSid[]="$Id$";
-extern gboolean gdm_file_check (gchar *caller, uid_t user, gchar *dir,
- gchar *file, gboolean absentok,
- gint maxsize, gint perms);
-
static gint GdmBrowser;
static gint GdmDebug;
static gint GdmIconMaxHeight;
@@ -461,7 +458,7 @@ gdm_login_session_lookup (gchar* savedsess)
gtk_widget_set_sensitive (GTK_WIDGET (sessmenu), FALSE);
/* Previously saved session not found in ~user/.gnome/gdm */
- if (! strlen (savedsess)) {
+ if (savedsess && ! strlen (savedsess)) {
/* If "Last" is chosen run Default, else run user's current selection */
if (!strcasecmp (cursess, lastsess))
session = defsess;
@@ -519,7 +516,7 @@ gdm_login_language_lookup (gchar* savedlang)
gtk_widget_set_sensitive (GTK_WIDGET (langmenu), FALSE);
/* Previously saved language not found in ~user/.gnome/gdm */
- if (! strlen (savedlang)) {
+ if (savedlang && ! strlen (savedlang)) {
/* If "Last" is chosen use Default, else use current selection */
if (!strcasecmp (curlang, lastlang))
language = GdmDefaultLocale;
@@ -572,7 +569,7 @@ gdm_login_entry_handler (GtkWidget *widget, GdkEventKey *event)
if (!curuser)
curuser = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
- g_print ("%s\n", gtk_entry_get_text (GTK_ENTRY (entry)));
+ g_print ("%c%s\n", STX, gtk_entry_get_text (GTK_ENTRY (entry)));
break;
case GDK_Up:
@@ -799,14 +796,28 @@ gdm_login_ctrl_handler (GIOChannel *source, GIOCondition cond, gint fd)
gint len;
gint i, x, y;
+ /* If this is not incoming i/o then return */
if (cond != G_IO_IN)
return (TRUE);
+ /* Read random garbage from i/o channel until STX is found */
+ do {
+ g_io_channel_read (source, buf, 1, &len);
+
+ if (len != 1)
+ return (TRUE);
+
+ }
+ while (buf[0] && buf[0] != STX);
+
+ /* Read opcode */
g_io_channel_read (source, buf, 1, &len);
- if (len!=1)
+ /* If opcode couldn't be read */
+ if (len != 1)
return (TRUE);
+ /* Parse opcode */
switch (buf[0]) {
case GDM_PROMPT:
g_io_channel_read (source, buf, PIPE_SIZE-1, &len);
@@ -837,30 +848,29 @@ gdm_login_ctrl_handler (GIOChannel *source, GIOCondition cond, gint fd)
buf[len-1] = '\0';
gtk_label_set (GTK_LABEL (msg), buf);
gtk_widget_show (GTK_WIDGET (msg));
- g_print ("\n");
break;
case GDM_SESS:
g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
buf[len-1] = '\0';
gdm_login_session_lookup (buf);
- g_print ("%s\n", session);
+ g_print ("%c%s\n", STX, session);
break;
case GDM_LANG:
g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
buf[len-1] = '\0';
gdm_login_language_lookup (buf);
- g_print ("%s\n", language);
+ g_print ("%c%s\n", STX, language);
break;
case GDM_SSESS:
g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
if (savesess)
- g_print ("Y\n");
+ g_print ("%cY\n", STX);
else
- g_print ("\n");
+ g_print ("%c\n", STX);
break;
@@ -868,9 +878,9 @@ gdm_login_ctrl_handler (GIOChannel *source, GIOCondition cond, gint fd)
g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */
if (savelang)
- g_print ("Y\n");
+ g_print ("%cY\n", STX);
else
- g_print ("\n");
+ g_print ("%c\n", STX);
break;
@@ -899,7 +909,7 @@ gdm_login_ctrl_handler (GIOChannel *source, GIOCondition cond, gint fd)
if (GdmBrowser)
gtk_widget_set_sensitive (GTK_WIDGET (browser), TRUE);
- g_print ("\n");
+ g_print ("%c\n", STX);
break;
case GDM_QUIT:
@@ -962,7 +972,7 @@ gdm_login_browser_select (GtkWidget *widget, gint selected, GdkEvent *event)
gtk_widget_set_sensitive (GTK_WIDGET (entry), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE);
- g_print ("%s\n", gtk_entry_get_text (GTK_ENTRY (entry)));
+ g_print ("%c%s\n", STX, gtk_entry_get_text (GTK_ENTRY (entry)));
break;
default:
@@ -1007,7 +1017,7 @@ gdm_login_gui_init (void)
gint cols, rows;
struct stat statbuf;
- if(GdmGtkRC)
+ if(*GdmGtkRC)
gtk_rc_parse (GdmGtkRC);
rootwin = gdk_window_foreign_new (GDK_ROOT_WINDOW ());
diff --git a/gui/gdmlogin.h b/gui/gdmlogin.h
index b36c67fa..e8d732e9 100644
--- a/gui/gdmlogin.h
+++ b/gui/gdmlogin.h
@@ -1,5 +1,5 @@
/* GDM - The Gnome Display Manager
- * Copyright (C) 1999 Martin Kasper Petersen <mkp@mkp.net>
+ * Copyright (C) 1999, 2000 Martin K. Petersen <mkp@mkp.net>
*
* 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
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 36443cb4..c9a7aa96 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -4,7 +4,9 @@ daemon/filecheck.c
daemon/misc.c
daemon/server.c
daemon/slave.c
-daemon/verify.c
+daemon/verify-pam.c
+daemon/verify-shadow.c
+daemon/verify-crypt.c
daemon/xdmcp.c
gui/gdmchooser.c
gui/gdmlogin.c
diff --git a/po/da.po b/po/da.po
index b7d76c12..651b74ea 100644
--- a/po/da.po
+++ b/po/da.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: gdm 2.0beta3\n"
-"POT-Creation-Date: 1999-09-23 02:31+0200\n"
+"POT-Creation-Date: 1999-12-27 13:01+0100\n"
"PO-Revision-Date: 1999-09-27 16:17+02:00\n"
"Last-Translator: Kenneth Christiansen <kenneth@ripen.dk>\n"
"Language-Team: Dansk/Danish <da@li.org>\n"
@@ -14,35 +14,38 @@ msgstr ""
"Content-Transfer-Encoding: 8-bit\n"
# src/gdm.c:135
-#: daemon/gdm.c:166
+#: daemon/gdm.c:169
#, c-format
msgid "gdm_config_parse: No configuration file: %s. Aborting."
msgstr "gdm_config_parse: Ingen konfigurationsfil: %s. Afbryder."
# src/gdm.c:173
#: daemon/gdm.c:217
-msgid "gdm_config_parse: No greeter specified and default not found."
+#, fuzzy
+msgid "gdm_config_parse: No greeter specified."
msgstr "gdm_config_parse: Ingen velkomst specificeret og standard ikke fundet."
# src/gdm.c:185
-#: daemon/gdm.c:229
-msgid "gdm_config_parse: No authdir specified and default not found."
-msgstr "gdm_config_parse: Ingen auth-mappe specificeret og standard ikke fundet."
+#: daemon/gdm.c:220
+#, fuzzy
+msgid "gdm_config_parse: No authdir specified."
+msgstr ""
+"gdm_config_parse: Ingen auth-mappe specificeret og standard ikke fundet."
# src/gdm.c:203
-#: daemon/gdm.c:247
-msgid ""
-"gdm_config_parse: No sessions directory specified and default not found."
+#: daemon/gdm.c:226
+#, fuzzy
+msgid "gdm_config_parse: No sessions directory specified."
msgstr ""
"gdm_config_parse: Ingen sessionsmappe specificeret og standard ikke fundet."
# src/gdm.c:215
-#: daemon/gdm.c:259
+#: daemon/gdm.c:238
msgid "gdm_config_parse: Invalid server line in config file. Ignoring!"
msgstr "gdm_config_parse: Ugyldig serverlinie i konfigurationsfil. Ignorerer!"
# src/gdm.c:221
-#: daemon/gdm.c:265
+#: daemon/gdm.c:244
msgid ""
"gdm_config_parse: Xdmcp disabled and no local servers defined. Aborting!"
msgstr ""
@@ -50,41 +53,41 @@ msgstr ""
"Afbryder!"
# src/gdm.c:226
-#: daemon/gdm.c:270
+#: daemon/gdm.c:251
#, c-format
msgid "gdm_config_parse: Can't find the gdm user (%s). Aborting!"
msgstr "gdm_config_parse: Kan ikke finde gdm brugeren (%s). Afbryder!"
# src/gdm.c:231
-#: daemon/gdm.c:275
+#: daemon/gdm.c:256
msgid "gdm_config_parse: The gdm user should not be root. Aborting!"
msgstr "gdm_config_parse: Gdm brugeren må ikke være root. Afbryder!"
# src/gdm.c:236
-#: daemon/gdm.c:280
+#: daemon/gdm.c:261
#, c-format
msgid "gdm_config_parse: Can't find the gdm group (%s). Aborting!"
msgstr "gdm_config_parse: Kan ikke finde gdm gruppen (%s). Afbryder."
# src/gdm.c:242
-#: daemon/gdm.c:285
+#: daemon/gdm.c:266
msgid "gdm_config_parse: The gdm group should not be root. Aborting!"
msgstr "gdm_config_parse: Gdm gruppen må ikke være root. Afbryder!"
# src/gdm.c:249
-#: daemon/gdm.c:292
+#: daemon/gdm.c:302
#, c-format
msgid "gdm_config_parse: Authdir %s does not exist. Aborting."
msgstr "gdm_config_parse: Auth-mappe %s eksisterer ikke. Afbryder."
# src/gdm.c:252
-#: daemon/gdm.c:295
+#: daemon/gdm.c:305
#, c-format
msgid "gdm_config_parse: Authdir %s is not a directory. Aborting."
msgstr "gdm_config_parse: Auth-mappe %s er ikke en mappe. Afbryder."
# src/gdm.c:255
-#: daemon/gdm.c:298
+#: daemon/gdm.c:308
#, c-format
msgid ""
"gdm_config_parse: Authdir %s is not owned by user %s, group %s. Aborting."
@@ -93,7 +96,7 @@ msgstr ""
"Afbryder."
# src/gdm.c:258
-#: daemon/gdm.c:302
+#: daemon/gdm.c:312
#, c-format
msgid ""
"gdm_config_parse: Authdir %s has wrong permissions. Should be 750. Aborting."
@@ -102,622 +105,613 @@ msgstr ""
"Afbryder."
# src/gdm.c:309
-#: daemon/gdm.c:363
+#: daemon/gdm.c:389
#, c-format
msgid "gdm_display_manage: Failed forking gdm slave process for %d"
msgstr "gdm_display_manage: Fejl under opstart af gdm slaveproces for %d"
# src/gdm.c:390
-#: daemon/gdm.c:442
+#: daemon/gdm.c:478
#, c-format
msgid "gdm_child_action: Aborting display %s"
msgstr "gdm_child_action: Afbryder skærm %s"
# src/gdm.c:395
-#: daemon/gdm.c:447
+#: daemon/gdm.c:483
msgid "gdm_child_action: Master rebooting..."
msgstr "gdm_child_action: Mester genstarter..."
# src/gdm.c:401
-#: daemon/gdm.c:453
+#: daemon/gdm.c:489
#, c-format
msgid "gdm_child_action: Reboot failed: %s"
msgstr "gdm_child_action: Genstart fejlede: %s"
# src/gdm.c:405
-#: daemon/gdm.c:457
+#: daemon/gdm.c:493
msgid "gdm_child_action: Master halting..."
msgstr "gdm_child_action: Mester stopper..."
# src/gdm.c:411
-#: daemon/gdm.c:463
+#: daemon/gdm.c:499
#, c-format
msgid "gdm_child_action: Halt failed: %s"
msgstr "gdm_child_action: Stop fejlede: %s"
# src/gdm.c:517
-#: daemon/gdm.c:560
+#: daemon/gdm.c:619
msgid "gdm_daemonify: fork() failed!"
msgstr "gdm_daemonify: fork() fejlede!"
# src/gdm.c:520
-#: daemon/gdm.c:563
+#: daemon/gdm.c:622
#, c-format
msgid "gdm_daemonify: setsid() failed: %s!"
msgstr "gdm_daemonify: setsid() fejlet: %s!"
# src/gdm.c:545
-#. XDM compliant error message
-#: daemon/gdm.c:589
+#: daemon/gdm.c:651
msgid "Only root wants to run x^hgdm\n"
msgstr "Kun root må køre x^hgdm\n"
# src/gdm.c:563
-#: daemon/gdm.c:610
-msgid ""
-"gdm already running. Aborting!\n"
-"\n"
+#: daemon/gdm.c:672
+#, fuzzy
+msgid "gdm already running. Aborting!"
msgstr ""
"gdm kører allerede. Afbryder!\n"
"\n"
-# src/gdm.c:568
-#: daemon/gdm.c:616
-#, c-format
-msgid ""
-"According to %s, gdm was already running (%d),\n"
-"but seems to have been murdered mysteriously.\n"
-msgstr ""
-"I følge %s, kørte gdm allerede (%d), \n"
-"men ser ud til at have blevet myrdet på mysterisk vis.\n"
-
# src/gdm.c:589
-#: daemon/gdm.c:638
+#: daemon/gdm.c:693
msgid "gdm_main: Error setting up TERM signal handler"
msgstr "gdm_main: Fejl under opsætning af TERM signalhåndtering"
# src/gdm.c:592
-#: daemon/gdm.c:641
+#: daemon/gdm.c:696
msgid "gdm_main: Error setting up INT signal handler"
msgstr "gdm_main: Fejl under opsætning af INT signalhåndtering"
# src/gdm.c:600
-#: daemon/gdm.c:649
+#: daemon/gdm.c:704
msgid "gdm_main: Error setting up CHLD signal handler"
msgstr "gdm_main: Fejl under opsætning af CHLD signalhåndtering"
# src/gdmauth.c:96
#. Really no need to clean up here - this process is a goner anyway
-#: daemon/auth.c:215 daemon/auth.c:240
+#: daemon/auth.c:228 daemon/auth.c:255
#, c-format
msgid "gdm_auth_user_add: Could not open cookie file %s"
msgstr "gdm_auth_user_add: Kunne ikke tilføje infokage %s"
# src/gdmauth.c:96
-#: daemon/auth.c:229
+#: daemon/auth.c:243
#, c-format
msgid "gdm_auth_user_add: Could not lock cookie file %s"
msgstr "gdm_auth_user_add: Kunne ikke låse infokage %s"
# src/gdmauth.c:132
-#: daemon/auth.c:300
+#: daemon/auth.c:325
#, c-format
msgid "gdm_auth_user_remove: Ignoring suspiciously looking cookie file %s"
msgstr "gdm_auth_user_remove: Fjerner suspekt udseende infokage %s"
-#: daemon/filecheck.c:58
+#: daemon/filecheck.c:51
#, c-format
msgid "%s: Directory %s does not exist."
msgstr "%s: Mappe %s eksisterer ikke."
# src/gdmmisc.c:111 src/gdmmisc.c:144
-#: daemon/filecheck.c:64 daemon/filecheck.c:105
+#: daemon/filecheck.c:57 daemon/filecheck.c:98
#, c-format
msgid "%s: %s is not owned by uid %d."
msgstr "%s: %s er ikke ejet af uid %d."
# src/gdmmisc.c:118
-#: daemon/filecheck.c:70 daemon/filecheck.c:112
+#: daemon/filecheck.c:63 daemon/filecheck.c:105
#, c-format
msgid "%s: %s is writable by group."
msgstr "%s: %s er skrivbar af gruppe."
# src/gdmmisc.c:118
-#: daemon/filecheck.c:76
+#: daemon/filecheck.c:69
#, c-format
msgid "%s: %s is writable by other."
msgstr "%s: %s er skrivbar af andre."
-#: daemon/filecheck.c:90
+#: daemon/filecheck.c:83
#, c-format
msgid "%s: does not exist and must."
msgstr "%s: eksisterer ikke, men skal."
# src/gdmmisc.c:137
-#: daemon/filecheck.c:98
+#: daemon/filecheck.c:91
#, c-format
msgid "%s: %s is not a regular file."
msgstr "%s: %s er ikke en almindelig fil."
# src/gdmmisc.c:118
-#: daemon/filecheck.c:119
+#: daemon/filecheck.c:112
#, c-format
msgid "%s: %s is writable by group/other."
msgstr "%s: %s er skrivbar af gruppe/andre."
# src/gdmmisc.c:159
-#: daemon/filecheck.c:126
+#: daemon/filecheck.c:119
#, c-format
msgid "%s: %s is bigger than sysadmin specified maximum file size."
msgstr "%s: %s er større end maksimum filstørrelse angivet af sysadmin."
-# src/gdmmisc.c:273
-#: daemon/misc.c:128
-#, c-format
-msgid "gdm_exec_script: Failed starting: %s"
-msgstr "gdm_exec_script: Fejl under opstart: %s"
-
-# src/gdmmisc.c:277
-#: daemon/misc.c:132
-msgid "gdm_exec_script: Can't fork script process!"
-msgstr "gdm_exec_script: Kan ikke splitte skriptproces!"
-
# src/gdmgreeter.c:1611
-#: daemon/server.c:84 daemon/server.c:208
+#: daemon/server.c:95
msgid "gdm_server_start: Error setting up USR1 signal handler"
msgstr "gdm_server_start: Fejl under opsætning af USR1 signalhåndtering"
+# src/gdmgreeter.c:1611
+#: daemon/server.c:179
+#, fuzzy
+msgid "gdm_server_start: Error setting up CHLD signal handler"
+msgstr "gdm_server_start: Fejl under opsætning af USR1 signalhåndtering"
+
# src/gdmxdmcp.c:592
-#: daemon/server.c:101
-#, c-format
-msgid "gdm_server_start: Could not open logfile for display %s!"
+#: daemon/server.c:196
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Could not open logfile for display %s!"
msgstr "gdm_server_start: Kunne ikke åbne logfil for skærm %s!"
-#: daemon/server.c:130
-msgid "gdm_server_start: Error setting USR1 to SIG_IGN"
+#: daemon/server.c:221
+#, fuzzy
+msgid "gdm_server_spawn: Error setting USR1 to SIG_IGN"
msgstr "gdm_server_start: Lykkedes ikke at sætte USR1 til SIG_IGN"
# src/gdm.c:268
-#: daemon/server.c:147
-#, c-format
-msgid "gdm_server_start: Xserver not found: %s"
+#: daemon/server.c:237
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Xserver not found: %s"
msgstr "gdm_server_start: XServer ikke fundet: %s"
# src/gdmmisc.c:277
-#: daemon/server.c:153
-msgid "gdm_server_start: Can't fork Xserver process!"
+#: daemon/server.c:242
+#, fuzzy
+msgid "gdm_server_spawn: Can't fork Xserver process!"
msgstr "gdm_server_start: Kan ikke splitte Xserver proces!"
-# src/gdmauth.c:62
-#: daemon/server.c:179
-#, c-format
-msgid "gdm_server_stop: Could not unlink auth file: %s!"
-msgstr "gdm_server_stop: Kunne ikke køre ulink på auth fil: %s"
-
-# src/gdmslave.c:611
-#: daemon/server.c:234
-msgid "gdm_server_restart: Error setting up ALARM signal handler"
-msgstr "gdm_server_restart: Fejl under opsætning af ALARM signalhåndtering"
-
# src/gdmslave.c:116
-#: daemon/slave.c:120
+#: daemon/slave.c:115
msgid "gdm_slave_init: Error setting up TERM/INT signal handler"
msgstr "gdm_slave_init: Fejl under opsætning af TERM/INT signalhåndtering"
# src/gdmslave.c:124
-#: daemon/slave.c:128
+#: daemon/slave.c:123
msgid "gdm_slave_init: Error setting up CHLD signal handler"
msgstr "gdm_slave_init: Fejl under opsætning af CHLD signalhåndtering"
# src/gdmslave.c:162
-#: daemon/slave.c:179
+#: daemon/slave.c:172
msgid "gdm_slave_greeter: Can't init pipe to gdmgreeter"
msgstr "gdm_slave_greeter: Kan ikke åbne pibe til gdmvelkomst"
# src/gdmslave.c:184
-#: daemon/slave.c:204
+#: daemon/slave.c:197
#, c-format
msgid "gdm_slave_greeter: Couldn't set groupid to %d"
msgstr "gdm_slave_greeter: Kunne ikke sætte gruppe-id til %d"
# src/gdmslave.c:187
-#: daemon/slave.c:207
+#: daemon/slave.c:200
#, c-format
msgid "gdm_slave_greeter: Couldn't set userid to %d"
msgstr "gdm_slave_greeter: Kunne ikke sætte bruger-id til %d"
# src/gdmslave.c:197
-#: daemon/slave.c:217
+#: daemon/slave.c:210
#, c-format
msgid "gdm_slave_greeter: Error starting greeter on display %s"
msgstr "gdm_slave_greeter: Fejl under opstart af velkomst på skærm %s"
# src/gdmslave.c:200
-#: daemon/slave.c:220
+#: daemon/slave.c:213
msgid "gdm_slave_greeter: Can't fork gdmgreeter process"
msgstr "gdm_slave_greeter: Kan ikke opsplitte gdmvelkomst proces"
-# src/gdmslave.c:332
-#: daemon/slave.c:298
-#, c-format
-msgid "gdm_slave_session_init: User '%s' not found. Aborting."
-msgstr "gdm_slave_session_init: Bruger '%s' ikke fundet. Afbryder."
+# src/gdmslave.c:326
+#: daemon/slave.c:262
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: User passed auth but getpwnam(%s) failed!"
+msgstr "gdm_slave_session_start: %s på %s"
# src/gdmslave.c:351
-#: daemon/slave.c:323
+#: daemon/slave.c:351
+#, fuzzy
msgid ""
-"gdm_slave_session_init: Execution of PreSession script returned > 0. "
+"gdm_slave_session_start: Execution of PreSession script returned > 0. "
"Aborting."
msgstr ""
"gdm_slave_session_init: Køring af PræSessionsskript returnerede > 0. "
"Afbryder."
# src/gdmslave.c:356
-#: daemon/slave.c:347
-msgid "gdm_slave_session_init: Error forking user session"
+#: daemon/slave.c:375
+#, fuzzy
+msgid "gdm_slave_session_start: Error forking user session"
msgstr "gdm_slave_session_init: Fejl under opsplitning af brugersession"
# src/gdmslave.c:362
-#: daemon/slave.c:355
-#, c-format
-msgid "gdm_slave_session_init: Could not setgid %d. Aborting."
+#: daemon/slave.c:384
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not setgid %d. Aborting."
msgstr "gdm_slave_session_init: Kunne ikke køre setgid på %d. Afbryder."
# src/gdmslave.c:365
-#: daemon/slave.c:358
-#, c-format
-msgid "gdm_slave_session_init: initgroups() failed for %s. Aborting."
+#: daemon/slave.c:388
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: initgroups() failed for %s. Aborting."
msgstr "gdm_slave_session_init: initgroups() fejlede for %s. Afbryder."
# src/gdmslave.c:368
-#: daemon/slave.c:361
-#, c-format
-msgid "gdm_slave_session_init: Could not become %s. Aborting."
+#: daemon/slave.c:392
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not become %s. Aborting."
msgstr "gdm_slave_session_init: Kunne ikke blive %s. Afbryder."
# src/gdmslave.c:415
-#: daemon/slave.c:403
-#, c-format
-msgid "gdm_slave_session_init: Could not start session `%s'"
+#: daemon/slave.c:428
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not start session `%s'"
msgstr "gdm_slave_session_init: Kunne ikke starte session `%s'"
# src/gdmslave.c:579
-#: daemon/slave.c:578
+#: daemon/slave.c:609
#, c-format
msgid "gdm_slave_windows_kill_ioerror_handler: Fatal X error - Restarting %s"
msgstr "gdm_slave_windows_kill_ioerror_handler: Fatal X fejl - Genstarter %s"
# src/gdmslave.c:611
-#: daemon/slave.c:610
+#: daemon/slave.c:641
msgid "gdm_slave_xsync_ping: Error setting up ALARM signal handler"
msgstr "gdm_slave_xsync_ping: Fejl under opsætning af ALARM signalhåndtering"
+# src/gdmmisc.c:273
+#: daemon/slave.c:743
+#, fuzzy, c-format
+msgid "gdm_slave_exec_script: Failed starting: %s"
+msgstr "gdm_exec_script: Fejl under opstart: %s"
+
+# src/gdmmisc.c:277
+#: daemon/slave.c:747
+#, fuzzy
+msgid "gdm_slave_exec_script: Can't fork script process!"
+msgstr "gdm_exec_script: Kan ikke splitte skriptproces!"
+
# src/gdmgreeter.c:1285
-#: daemon/verify.c:129 daemon/verify.c:201 gui/gdmlogin.c:1246
+#. Ask gdmgreeter for the user's login. Just for good measure
+#: daemon/verify-crypt.c:58 daemon/verify-pam.c:123 daemon/verify-shadow.c:60
+#: gui/gdmlogin.c:1230
msgid "Login:"
msgstr "Logind:"
# src/gdmverify.c:106
-#: daemon/verify.c:135
+#: daemon/verify-pam.c:130
msgid "Can't find /etc/pam.d/gdm!"
msgstr "Kan ikke finde /etc/pam.d/gdm!"
# src/gdmverify.c:113
-#: daemon/verify.c:140
+#: daemon/verify-pam.c:136
#, c-format
msgid "Can't set PAM_TTY=%s"
msgstr "Kan ikke sætte PAM_TTY=%s"
# src/gdmverify.c:120 src/gdmverify.c:173
-#: daemon/verify.c:145 daemon/verify.c:222
+#: daemon/verify-crypt.c:71 daemon/verify-pam.c:142 daemon/verify-shadow.c:81
#, c-format
msgid "Couldn't authenticate %s"
msgstr "Kunne ikke autentificere %s"
# src/gdmverify.c:127
-#: daemon/verify.c:150
+#: daemon/verify-pam.c:153
#, c-format
msgid "Couldn't set acct. mgmt for %s"
msgstr "Kunne ikke sætte kontohåndtering for %s"
# src/gdmverify.c:134
-#: daemon/verify.c:155
+#: daemon/verify-pam.c:159
#, c-format
msgid "Couldn't set credentials for %s"
msgstr "Kunne ikke sætte credentials for %s"
# src/gdmverify.c:141
-#: daemon/verify.c:160
+#: daemon/verify-pam.c:165
#, c-format
msgid "Couldn't open session for %s"
msgstr "Kunne ikke åbne session for %s"
+#: daemon/verify-pam.c:232
+msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
+msgstr "gdm_verify_check: Kan ikke finde PAM konfigurationsfil for gdm"
+
# src/gdmgreeter.c:1291
-#: daemon/verify.c:217
+#. Request the user's password
+#: daemon/verify-crypt.c:64 daemon/verify-shadow.c:74
msgid "Password:"
msgstr "Adgangskode:"
-#: daemon/verify.c:223
+#: daemon/verify-crypt.c:72 daemon/verify-shadow.c:82
msgid "User unknown"
msgstr "Bruger ukendt"
-#: daemon/verify.c:228
+#: daemon/verify-crypt.c:77 daemon/verify-shadow.c:87
#, c-format
msgid "Root login disallowed on display '%s'"
msgstr "Root logind ikke tilladt på skærm '%s'"
-#: daemon/verify.c:229
+#: daemon/verify-crypt.c:78 daemon/verify-shadow.c:88
msgid "Root login disallowed"
msgstr "Root logind ikke tilladt"
-#: daemon/verify.c:237
+#: daemon/verify-crypt.c:87 daemon/verify-shadow.c:97
msgid "Incorrect password"
msgstr "Forkert adgangskode"
-#: daemon/verify.c:256
-msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
-msgstr "gdm_verify_check: Kan ikke finde PAM konfigurationsfil for gdm"
-
# src/gdmxdmcp.c:170
-#: daemon/xdmcp.c:184
+#: daemon/xdmcp.c:178
#, c-format
msgid "gdm_xdmcp_init: Could not get server hostname: %s!"
msgstr "gdm_xdmcp_init: Kunne ikke få serverens værtsnavn: %s!"
# src/gdmxdmcp.c:181
-#: daemon/xdmcp.c:198
+#: daemon/xdmcp.c:192
msgid "gdm_xdmcp_init: Could not create socket!"
msgstr "gdm_xdmcp_init: Kunne ikke oprette socket!"
# src/gdmxdmcp.c:188
-#: daemon/xdmcp.c:205
+#: daemon/xdmcp.c:199
msgid "gdm_xdmcp_init: Could not bind to XDMCP socket!"
msgstr "gdm_xdmcp_init: Kunne ikke binde med XDMCP socket!"
# src/gdmxdmcp.c:181
-#: daemon/xdmcp.c:214
+#: daemon/xdmcp.c:208
msgid "gdm_xdmcp_init: Can't alloc fifopath"
msgstr "gdm_xdmcp_init: Kunne ikke allokere fifosti"
# src/gdmxdmcp.c:181
-#: daemon/xdmcp.c:219
+#: daemon/xdmcp.c:213
msgid "gdm_xdmcp_init: Could not make FIFO for chooser"
msgstr "gdm_xdmcp_init: Kunne ikke oprette FIFO for vælger"
# src/gdmxdmcp.c:181
-#: daemon/xdmcp.c:224
+#: daemon/xdmcp.c:218
msgid "gdm_xdmcp_init: Could not open FIFO for chooser"
msgstr "gdm_xdmcp_init: Kunne ikke åbne FIFO for vælger"
# src/gdmxdmcp.c:209
-#: daemon/xdmcp.c:284
+#: daemon/xdmcp.c:278
msgid "gdm_xdmcp_decode: Could not create XDMCP buffer!"
msgstr "gdm_xdmcp_decode: Kunne ikke oprette XDMCP buffer!"
# src/gdmxdmcp.c:214
-#: daemon/xdmcp.c:289
+#: daemon/xdmcp.c:283
msgid "gdm_xdmcp_decode: Could not read XDMCP header!"
msgstr "gdm_xdmcp_decode: Kunne ikke læse XDMCP header!"
# src/gdmxdmcp.c:219
-#: daemon/xdmcp.c:294
+#: daemon/xdmcp.c:288
msgid "gdm_xdmcp_decode: Incorrect XDMCP version!"
msgstr "gdm_xdmcp_decode: Forkert XDMCP version!"
# src/gdmxdmcp.c:255
-#: daemon/xdmcp.c:333
+#: daemon/xdmcp.c:328
#, c-format
msgid "gdm_xdmcp_decode_packet: Unknown opcode from host %s"
msgstr "gdm_xdmcp_decode_packet: Ukendt opkode fra vært %s"
# src/gdmxdmcp.c:273
-#: daemon/xdmcp.c:351
+#: daemon/xdmcp.c:346
msgid "gdm_xdmcp_handle_query: Could not extract authlist from packet"
msgstr "gdm_xdmcp_query: Kunne ikke skaffe auth-liste fra pakke"
# src/gdmxdmcp.c:284
-#: daemon/xdmcp.c:362
+#: daemon/xdmcp.c:357
msgid "gdm_xdmcp_handle_query: Error in checksum"
msgstr "gdm_xdmcp_handle_query: Fejl i tjeksum"
# src/gdmxdmcp.c:373
-#: daemon/xdmcp.c:433
+#: daemon/xdmcp.c:428
msgid "gdm_xdmcp_handle_forward_query: Could not read display address"
msgstr "gdm_xdmcp_handle_forward_query: Kunne ikke læse skærmadresse"
# src/gdmxdmcp.c:373
-#: daemon/xdmcp.c:439
+#: daemon/xdmcp.c:434
msgid "gdm_xdmcp_handle_forward_query: Could not read display port number"
msgstr "gdm_xdmcp_handle_forward_query: Kunne ikke læse skærmportnummer"
# src/gdmxdmcp.c:273
-#: daemon/xdmcp.c:445
+#: daemon/xdmcp.c:440
msgid "gdm_xdmcp_handle_forward_query: Could not extract authlist from packet"
msgstr "gdm_xdmcp_handle_forward_query: Kunne ikke skaffe auth-liste fra pakke"
# src/gdmxdmcp.c:284
-#: daemon/xdmcp.c:460
+#: daemon/xdmcp.c:455
msgid "gdm_xdmcp_handle_forward_query: Error in checksum"
msgstr "gdm_xdmcp_handle_forward_query: Fejl i tjeksum"
-#: daemon/xdmcp.c:523
+#: daemon/xdmcp.c:518
#, c-format
msgid "Denied XDMCP query from host %s"
msgstr "Vært %s tillod ikke XDMCP forespørgsel"
# src/gdmxdmcp.c:333
-#: daemon/xdmcp.c:525
+#: daemon/xdmcp.c:520
msgid "Display not authorized to connect"
msgstr "Skærm ikke autoriseret til at forbinde"
# src/gdmxdmcp.c:366
-#: daemon/xdmcp.c:558
+#: daemon/xdmcp.c:553
#, c-format
msgid "gdm_xdmcp_handle_request: Got REQUEST from banned host %s"
msgstr "gdm_xdmcp_handle_request: Modtog REQUEST fra bandlyst vært %s"
# src/gdmxdmcp.c:373
-#: daemon/xdmcp.c:565
+#: daemon/xdmcp.c:560
msgid "gdm_xdmcp_handle_request: Could not read Display Number"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse skærmnummer"
# src/gdmxdmcp.c:379
-#: daemon/xdmcp.c:571
+#: daemon/xdmcp.c:566
msgid "gdm_xdmcp_handle_request: Could not read Connection Type"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse forbindelsestype"
# src/gdmxdmcp.c:385
-#: daemon/xdmcp.c:577
+#: daemon/xdmcp.c:572
msgid "gdm_xdmcp_handle_request: Could not read Client Address"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse klientadresse"
# src/gdmxdmcp.c:391
-#: daemon/xdmcp.c:583
+#: daemon/xdmcp.c:578
msgid "gdm_xdmcp_handle_request: Could not read Authentication Names"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse autentificeringsnavn"
# src/gdmxdmcp.c:397
-#: daemon/xdmcp.c:589
+#: daemon/xdmcp.c:584
msgid "gdm_xdmcp_handle_request: Could not read Authentication Data"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse autentificeringsdata"
# src/gdmxdmcp.c:403
-#: daemon/xdmcp.c:595
+#: daemon/xdmcp.c:590
msgid "gdm_xdmcp_handle_request: Could not read Authorization List"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse autorisationslisten"
# src/gdmxdmcp.c:414
-#: daemon/xdmcp.c:606
+#: daemon/xdmcp.c:601
msgid "gdm_xdmcp_handle_request: Could not read Manufacturer ID"
msgstr "gdm_xdmcp_handle_request: Kunne ikke læse producent-ID"
# src/gdmxdmcp.c:432
-#: daemon/xdmcp.c:624
+#: daemon/xdmcp.c:619
#, c-format
msgid "gdm_xdmcp_handle_request: Failed checksum from %s"
msgstr "gdm_xdmcp_handle_request: Fejlede tjeksum fra %s"
# src/gdmxdmcp.c:551
-#: daemon/xdmcp.c:737
+#: daemon/xdmcp.c:732
#, c-format
msgid "gdm_xdmcp_handle_manage: Got Manage from banned host %s"
msgstr "gdm_xdmcp_handle_manage: Modtog Manage fra bandlyst vært %s"
# src/gdmxdmcp.c:558
-#: daemon/xdmcp.c:744
+#: daemon/xdmcp.c:739
msgid "gdm_xdmcp_handle_manage: Could not read Session ID"
msgstr "gdm_xdmcp_handle_manage: Kunne ikke læse sessions-ID"
# src/gdmxdmcp.c:564
-#: daemon/xdmcp.c:750
+#: daemon/xdmcp.c:745
msgid "gdm_xdmcp_handle_manage: Could not read Display Number"
msgstr "gdm_xdmcp_handle_manage: Kunne ikke læse skærmnummer"
# src/gdmxdmcp.c:573
-#: daemon/xdmcp.c:759
+#: daemon/xdmcp.c:754
msgid "gdm_xdmcp_manage: Could not read Display Class"
msgstr "gdm_xdmcp_manage: Kunne ikke læse skærmklasse"
# src/gdmxdmcp.c:592
-#: daemon/xdmcp.c:780
+#: daemon/xdmcp.c:775
#, c-format
msgid "gdm_xdmcp_handle_manage: Could not open logfile for display %s!"
msgstr "gdm_xdmcp_handle_manage: Kunne ikke åbne logfil for skærm %s!"
# src/gdmxdmcp.c:686
-#: daemon/xdmcp.c:852
+#: daemon/xdmcp.c:847
#, c-format
msgid "gdm_xdmcp_handle_keepalive: Got KEEPALIVE from banned host %s"
msgstr "gdm_xdmcp_handle_keepalive: Modtog KEEPALIVE fra bandlyst vært %s"
# src/gdmxdmcp.c:693
-#: daemon/xdmcp.c:859
+#: daemon/xdmcp.c:854
msgid "gdm_xdmcp_handle_keepalive: Could not read Display Number"
msgstr "gdm_xdmcp_handle_keepalive: Kunne ikke læse skærmnummer"
# src/gdmxdmcp.c:699
-#: daemon/xdmcp.c:865
+#: daemon/xdmcp.c:860
msgid "gdm_xdmcp_handle_keepalive: Could not read Session ID"
msgstr "gdm_xdmcp_handle_keepalive: Kunne ikke læse sessions-ID"
# src/gdmgreeter.c:224
-#: gui/gdmchooser.c:342
+#: gui/gdmchooser.c:340
#, c-format
msgid "gdm_chooser_parse_config: No configuration file: %s. Aborting."
msgstr "gdm_chooser_parse_config: Ingen konfigurationsfil: %s. Afbryder."
# src/gdmverify.c:141
-#: gui/gdmchooser.c:451
+#: gui/gdmchooser.c:449
#, c-format
msgid "Can't open default host icon: %s"
msgstr "Kunne ikke åbne standard værtsikon: %s"
#. Buttons
-#: gui/gdmchooser.c:518
+#: gui/gdmchooser.c:516
msgid "Connect"
msgstr "Forbind"
-#: gui/gdmchooser.c:525
+#: gui/gdmchooser.c:523
msgid "Rescan"
msgstr "Genskan"
-#: gui/gdmchooser.c:531
+#: gui/gdmchooser.c:529
msgid "Cancel"
msgstr "Annullér"
# src/gdmslave.c:124
-#: gui/gdmchooser.c:582
+#: gui/gdmchooser.c:580
msgid "gdm_signals_init: Error setting up HUP signal handler"
msgstr "gdm_signals_init: Fejl under opsætning af HUPD signalhåndtering"
# src/gdm.c:592
-#: gui/gdmchooser.c:585
+#: gui/gdmchooser.c:583
msgid "gdm_signals_init: Error setting up INT signal handler"
msgstr "gdm_signals_init: Fejl under opsætning af INT signalhåndtering"
# src/gdm.c:589
-#: gui/gdmchooser.c:588
+#: gui/gdmchooser.c:586
msgid "gdm_signals_init: Error setting up TERM signal handler"
msgstr "gdm_signals_init: Fejl under opsætning af TERM signalhåndtering"
-#: gui/gdmchooser.c:596 gui/gdmlogin.c:1555
+#: gui/gdmchooser.c:594 gui/gdmlogin.c:1542
msgid "Could not set signal mask!"
msgstr "Kunne ikke sætte signalmaske!"
# src/gdmmisc.c:202
-#: gui/gdmlogin.c:271
+#: gui/gdmlogin.c:268
msgid "gdm_parse_enriched_string: String too long!"
msgstr "gdm_parse_enriched_string: Strengen er for lang!"
# src/gdmmisc.c:203
-#: gui/gdmlogin.c:272
+#: gui/gdmlogin.c:269
#, c-format
msgid "Welcome to %s"
msgstr "Velkommen til %s"
# src/gdmmisc.c:207
-#: gui/gdmlogin.c:276
+#: gui/gdmlogin.c:273
msgid "gdm_parse_enriched_string: Could not malloc temporary buffer!"
msgstr "gdm_parse_enriched_string: Klarede ikke at malloc midlertidig buffer! "
# src/gdmgreeter.c:451
-#: gui/gdmlogin.c:358
+#: gui/gdmlogin.c:355
msgid "Are you sure you want to reboot the machine?"
msgstr "Er du sikker på at du vil genstarte maskinen?"
# src/gdmgreeter.c:480
-#: gui/gdmlogin.c:371
+#: gui/gdmlogin.c:368
msgid "Are you sure you want to halt the machine?"
msgstr "Er du sikker på at du vil stoppe maskinen?"
# src/gdmgreeter.c:224
-#: gui/gdmlogin.c:388
+#: gui/gdmlogin.c:385
#, c-format
msgid "gdm_login_parse_config: No configuration file: %s. Aborting."
msgstr "gdm_login_parse_config: Ingen konfigurationsfil: %s. Afbryder."
# src/gdmgreeter.c:357
-#: gui/gdmlogin.c:524
+#: gui/gdmlogin.c:481
#, c-format
msgid ""
"Your preferred session type %s is not installed on this machine.\n"
@@ -727,7 +721,7 @@ msgstr ""
"Ønsker du at gøre %s til standard for fremtidige sessioner?"
# src/gdmgreeter.c:349
-#: gui/gdmlogin.c:543 gui/gdmlogin.c:573
+#: gui/gdmlogin.c:496 gui/gdmlogin.c:538
#, c-format
msgid ""
"You have chosen %s for this session, but your default setting is %s.\n"
@@ -736,109 +730,129 @@ msgstr ""
"Du har valgt %s for denne session, men standard indstilling er %s.\n"
"Ønsker du at gøre %s til standard for fremtidige sessioner?"
-#: gui/gdmlogin.c:631
+#: gui/gdmlogin.c:597
#, c-format
msgid "%s session selected"
msgstr "%s session valgt"
-#: gui/gdmlogin.c:647 gui/gdmlogin.c:750
+#: gui/gdmlogin.c:613 gui/gdmlogin.c:716
msgid "Last"
msgstr "Sidste"
# src/gdmgreeter.c:737
-#: gui/gdmlogin.c:662
+#: gui/gdmlogin.c:628
msgid "gdm_login_session_init: Session script directory not found!"
msgstr "gdm_login_session_init: Sessionens skriptmappe er ikke fundet!"
# src/gdmgreeter.c:790
-#: gui/gdmlogin.c:715
+#: gui/gdmlogin.c:681
msgid "No session scripts found. Aborting!"
msgstr "Intet sessionsskript fundet. Afbryder!"
# src/gdmgreeter.c:794
-#: gui/gdmlogin.c:719
+#: gui/gdmlogin.c:685
#, c-format
msgid "No default session link found. Using %s.\n"
msgstr "Ingen standard sessionlænke fundet. Bruger %s.\n"
-#: gui/gdmlogin.c:733
+#: gui/gdmlogin.c:699
#, c-format
msgid "%s language selected"
msgstr "%s sprog valgt"
-#: gui/gdmlogin.c:765
+#: gui/gdmlogin.c:731
msgid "A-M"
msgstr "A-M"
-#: gui/gdmlogin.c:771
+#: gui/gdmlogin.c:737
msgid "N-Z"
msgstr "N-Z"
-#: gui/gdmlogin.c:777
+#: gui/gdmlogin.c:743
msgid "Other"
msgstr "Andre"
# src/gdmgreeter.c:963
-#: gui/gdmlogin.c:1080
+#: gui/gdmlogin.c:1062
msgid "Session"
msgstr "Session"
# src/gdmgreeter.c:970
-#: gui/gdmlogin.c:1087
+#: gui/gdmlogin.c:1069
msgid "Language"
msgstr "Sprog"
# src/gdmgreeter.c:980
-#: gui/gdmlogin.c:1094
+#: gui/gdmlogin.c:1076
msgid "Reboot..."
msgstr "Genstart..."
# src/gdmgreeter.c:986
-#: gui/gdmlogin.c:1101
+#: gui/gdmlogin.c:1083
msgid "Halt..."
msgstr "Stop..."
# src/gdmgreeter.c:1000
-#: gui/gdmlogin.c:1108
+#: gui/gdmlogin.c:1090
msgid "System"
msgstr "System"
# src/gdmgreeter.c:1008
-#: gui/gdmlogin.c:1116
+#: gui/gdmlogin.c:1098
#, c-format
msgid "Can't open icon file: %s. Suspending iconify feature!"
msgstr "Kan ikke åbne ikonfilen: %s. Suspenderer ikonofiseringsfunktionen!"
# src/gdmgreeter.c:1012
-#: gui/gdmlogin.c:1119
+#: gui/gdmlogin.c:1101
msgid "Iconify"
msgstr "Ikonificér"
-#: gui/gdmlogin.c:1281
+#: gui/gdmlogin.c:1265
msgid "Please enter your login"
msgstr "Indtast venligst dit brugernavn"
# src/gdmgreeter.c:1453
-#: gui/gdmlogin.c:1462
+#: gui/gdmlogin.c:1446
#, c-format
msgid "Can't open DefaultImage: %s. Suspending face browser!"
msgstr "Kan ikke åbne StandardBillede: %s. Bruger ikke ansigtsvælger!"
# src/gdmgreeter.c:1597
-#: gui/gdmlogin.c:1541
+#: gui/gdmlogin.c:1528
msgid "main: Error setting up HUP signal handler"
msgstr "main: Fejl under opsætning af HUP signalhåndtering"
# src/gdmgreeter.c:1600
-#: gui/gdmlogin.c:1544
+#: gui/gdmlogin.c:1531
msgid "main: Error setting up INT signal handler"
msgstr "main: Fejl under opsætning af INT signalhåndtering"
# src/gdmgreeter.c:1603
-#: gui/gdmlogin.c:1547
+#: gui/gdmlogin.c:1534
msgid "main: Error setting up TERM signal handler"
msgstr "main: Fejl under opsætning af TERM signalhåndtering"
+# src/gdm.c:568
+#~ msgid ""
+#~ "According to %s, gdm was already running (%d),\n"
+#~ "but seems to have been murdered mysteriously.\n"
+#~ msgstr ""
+#~ "I følge %s, kørte gdm allerede (%d), \n"
+#~ "men ser ud til at have blevet myrdet på mysterisk vis.\n"
+
+# src/gdmauth.c:62
+#~ msgid "gdm_server_stop: Could not unlink auth file: %s!"
+#~ msgstr "gdm_server_stop: Kunne ikke køre ulink på auth fil: %s"
+
+# src/gdmslave.c:611
+#~ msgid "gdm_server_restart: Error setting up ALARM signal handler"
+#~ msgstr "gdm_server_restart: Fejl under opsætning af ALARM signalhåndtering"
+
+# src/gdmslave.c:332
+#~ msgid "gdm_slave_session_init: User '%s' not found. Aborting."
+#~ msgstr "gdm_slave_session_init: Bruger '%s' ikke fundet. Afbryder."
+
# src/gdm.c:94
#~ msgid "gdm_display_dispose: Closing display %s"
#~ msgstr "gdm_display_dispose: Lukker skærm %s"
@@ -1035,10 +1049,6 @@ msgstr "main: Fejl under opsætning af TERM signalhåndtering"
#~ msgid "gdm_slave_get_opts: Insufficient data from greeter in pipe"
#~ msgstr "gdm_slave_get_opts: Utilstrækkelig data fra velkomst i piben"
-# src/gdmslave.c:326
-#~ msgid "gdm_slave_session_start: %s on %s"
-#~ msgstr "gdm_slave_session_start: %s på %s"
-
# src/gdmslave.c:436
#~ msgid "gdm_slave_session_stop: %s on %s"
#~ msgstr "gdm_slave_session_stop: %s på %s"
diff --git a/po/et.po b/po/et.po
index 4c32e913..6ae41efa 100644
--- a/po/et.po
+++ b/po/et.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: gdm2 2.0beta3\n"
-"POT-Creation-Date: 1999-09-25 01:02+0300\n"
+"POT-Creation-Date: 1999-12-27 13:01+0100\n"
"PO-Revision-Date: 1999-09-25 23:43+0300\n"
"Last-Translator: Lauris Kaplinski <lauris@ariman.ee>\n"
"Language-Team: Estonian <linux-l@eenet.ee>\n"
@@ -13,585 +13,595 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8-bit\n"
-#: daemon/gdm.c:166
+#: daemon/gdm.c:169
#, c-format
msgid "gdm_config_parse: No configuration file: %s. Aborting."
msgstr "gdm_config_parse: Puudub konfiguratsioonifail %s. Lõpetame."
#: daemon/gdm.c:217
-msgid "gdm_config_parse: No greeter specified and default not found."
-msgstr "gdm_config_parse: Tervitajat (greeter) pole määratud ning enda oma ei leia."
+#, fuzzy
+msgid "gdm_config_parse: No greeter specified."
+msgstr ""
+"gdm_config_parse: Tervitajat (greeter) pole määratud ning enda oma ei leia."
-#: daemon/gdm.c:229
-msgid "gdm_config_parse: No authdir specified and default not found."
+#: daemon/gdm.c:220
+#, fuzzy
+msgid "gdm_config_parse: No authdir specified."
msgstr "gdm_config_parse: 'authdir' pole määratud ja enda oma ei leia."
-#: daemon/gdm.c:247
-msgid ""
-"gdm_config_parse: No sessions directory specified and default not found."
-msgstr "gdm_config_parse: Sessioonikataloogi pole määratud ja enda oma ei leia."
+#: daemon/gdm.c:226
+#, fuzzy
+msgid "gdm_config_parse: No sessions directory specified."
+msgstr ""
+"gdm_config_parse: Sessioonikataloogi pole määratud ja enda oma ei leia."
-#: daemon/gdm.c:259
+#: daemon/gdm.c:238
msgid "gdm_config_parse: Invalid server line in config file. Ignoring!"
-msgstr "gdm_config_parse: Vigane 'server' rida konfiguratsioonifailis. Jätan vahele!"
+msgstr ""
+"gdm_config_parse: Vigane 'server' rida konfiguratsioonifailis. Jätan vahele!"
-#: daemon/gdm.c:265
+#: daemon/gdm.c:244
msgid ""
"gdm_config_parse: Xdmcp disabled and no local servers defined. Aborting!"
-msgstr "gdm_config_parse: Xdmcp on välja lülitatud ja lokaalseid servereid pole määratud. Lõpetame!"
+msgstr ""
+"gdm_config_parse: Xdmcp on välja lülitatud ja lokaalseid servereid pole "
+"määratud. Lõpetame!"
-#: daemon/gdm.c:270
+#: daemon/gdm.c:251
#, c-format
msgid "gdm_config_parse: Can't find the gdm user (%s). Aborting!"
msgstr "gdm_config_parse: Ei leia gdm kasutajat (%s). Lõpetame!"
-#: daemon/gdm.c:275
+#: daemon/gdm.c:256
msgid "gdm_config_parse: The gdm user should not be root. Aborting!"
msgstr "gdm_config_parse: gdm kasutaja ei tohi olla root. Lõpetame!"
-#: daemon/gdm.c:280
+#: daemon/gdm.c:261
#, c-format
msgid "gdm_config_parse: Can't find the gdm group (%s). Aborting!"
msgstr "gdm_config_parse: Ei leia gdm gruppi (%s). Lõpetame!"
-#: daemon/gdm.c:285
+#: daemon/gdm.c:266
msgid "gdm_config_parse: The gdm group should not be root. Aborting!"
msgstr "gdm_config_parse: gdm grupp ei tohi olla root. Lõpetame!"
-#: daemon/gdm.c:292
+#: daemon/gdm.c:302
#, c-format
msgid "gdm_config_parse: Authdir %s does not exist. Aborting."
msgstr "gdm_config_parse: Authdir %s pole olemas. Lõpetame."
-#: daemon/gdm.c:295
+#: daemon/gdm.c:305
#, c-format
msgid "gdm_config_parse: Authdir %s is not a directory. Aborting."
msgstr "gdm_config_parse: Authdir %s ei ole kataloog. Lõpetame."
-#: daemon/gdm.c:298
+#: daemon/gdm.c:308
#, c-format
msgid ""
"gdm_config_parse: Authdir %s is not owned by user %s, group %s. Aborting."
-msgstr "gdm_config_parse: Authdir %s ei kuulu kasutajale %s, grupile %s. Lõpetame."
+msgstr ""
+"gdm_config_parse: Authdir %s ei kuulu kasutajale %s, grupile %s. Lõpetame."
-#: daemon/gdm.c:302
+#: daemon/gdm.c:312
#, c-format
msgid ""
"gdm_config_parse: Authdir %s has wrong permissions. Should be 750. Aborting."
-msgstr "gdm_config_parse: Authdir %s loabitid on valed. Peaks olema 750. Lõpetame."
+msgstr ""
+"gdm_config_parse: Authdir %s loabitid on valed. Peaks olema 750. Lõpetame."
-#: daemon/gdm.c:363
+#: daemon/gdm.c:389
#, c-format
msgid "gdm_display_manage: Failed forking gdm slave process for %d"
msgstr "gdm_display_manage: gdb alluva protsessi %d forkimine ei õnnestunud"
-#: daemon/gdm.c:442
+#: daemon/gdm.c:478
#, c-format
msgid "gdm_child_action: Aborting display %s"
msgstr "gdm_child_action: Paneme displei %s kinni"
-#: daemon/gdm.c:447
+#: daemon/gdm.c:483
msgid "gdm_child_action: Master rebooting..."
msgstr "gdm_child_action: Pealik teeb alglaadimise..."
-#: daemon/gdm.c:453
+#: daemon/gdm.c:489
#, c-format
msgid "gdm_child_action: Reboot failed: %s"
msgstr "gdm_child_action: Alglaadimine ebaõnnestus: %s"
-#: daemon/gdm.c:457
+#: daemon/gdm.c:493
msgid "gdm_child_action: Master halting..."
msgstr "gdm_child_action: Pealik paneb masina seisma..."
-#: daemon/gdm.c:463
+#: daemon/gdm.c:499
#, c-format
msgid "gdm_child_action: Halt failed: %s"
msgstr "gdm_child_action: Seiskamine ebaõnnestus: %s"
-#: daemon/gdm.c:560
+#: daemon/gdm.c:619
msgid "gdm_daemonify: fork() failed!"
msgstr "gdm_daemonify: fork() ebaõnnestus!"
-#: daemon/gdm.c:563
+#: daemon/gdm.c:622
#, c-format
msgid "gdm_daemonify: setsid() failed: %s!"
msgstr "gdm_daemonify: setsid() ebaõnnestus: %s!"
-#. XDM compliant error message
-#: daemon/gdm.c:589
+#: daemon/gdm.c:651
msgid "Only root wants to run x^hgdm\n"
msgstr "Ainult root võib soovida käivitada x^hgdm\n"
-#: daemon/gdm.c:610
-msgid ""
-"gdm already running. Aborting!\n"
-"\n"
-msgstr "gdm juba töötab. Katkestame!\n\n"
-
-#: daemon/gdm.c:616
-#, c-format
-msgid ""
-"According to %s, gdm was already running (%d),\n"
-"but seems to have been murdered mysteriously.\n"
+#: daemon/gdm.c:672
+#, fuzzy
+msgid "gdm already running. Aborting!"
msgstr ""
-"Vastavalt %s gdm kord juba töötas (%d),\n"
-"kuid mõrvati salapärastel asjaoludel.\n"
+"gdm juba töötab. Katkestame!\n"
+"\n"
-#: daemon/gdm.c:638
+#: daemon/gdm.c:693
msgid "gdm_main: Error setting up TERM signal handler"
msgstr "gdm_main: Viga signaali TERM händleri ülesseadmisel"
-#: daemon/gdm.c:641
+#: daemon/gdm.c:696
msgid "gdm_main: Error setting up INT signal handler"
msgstr "gdm_main: Viga signaali INT händleri ülesseadmisel"
-#: daemon/gdm.c:649
+#: daemon/gdm.c:704
msgid "gdm_main: Error setting up CHLD signal handler"
msgstr "gdm_main: Viga signaali CHLD händleri ülesseadmisel"
#. Really no need to clean up here - this process is a goner anyway
-#: daemon/auth.c:215 daemon/auth.c:240
+#: daemon/auth.c:228 daemon/auth.c:255
#, c-format
msgid "gdm_auth_user_add: Could not open cookie file %s"
msgstr "gdm_auth_user_add: Ei saanud cookie faili %s avada"
-#: daemon/auth.c:229
+#: daemon/auth.c:243
#, c-format
msgid "gdm_auth_user_add: Could not lock cookie file %s"
msgstr "gdm_auth_user_add: Ei saanud cookie faili %s lukustada"
-#: daemon/auth.c:300
+#: daemon/auth.c:325
#, c-format
msgid "gdm_auth_user_remove: Ignoring suspiciously looking cookie file %s"
-msgstr "gdm_auth_user_remove: Jätan kahtlase väljanägemisega cookie faili %s vahele"
+msgstr ""
+"gdm_auth_user_remove: Jätan kahtlase väljanägemisega cookie faili %s vahele"
-#: daemon/filecheck.c:58
+#: daemon/filecheck.c:51
#, c-format
msgid "%s: Directory %s does not exist."
msgstr "%s: Kataloogi %s pole olemas."
-#: daemon/filecheck.c:64 daemon/filecheck.c:105
+#: daemon/filecheck.c:57 daemon/filecheck.c:98
#, c-format
msgid "%s: %s is not owned by uid %d."
msgstr "%s: %s omanik ei ole uid %d."
-#: daemon/filecheck.c:70 daemon/filecheck.c:112
+#: daemon/filecheck.c:63 daemon/filecheck.c:105
#, c-format
msgid "%s: %s is writable by group."
msgstr "%s: %s on grupile kirjutatav."
-#: daemon/filecheck.c:76
+#: daemon/filecheck.c:69
#, c-format
msgid "%s: %s is writable by other."
msgstr "%s: %s on teistele kirjutatav."
-#: daemon/filecheck.c:90
+#: daemon/filecheck.c:83
#, c-format
msgid "%s: does not exist and must."
msgstr "%s: ei ole olemas, kuid peab olema."
-#: daemon/filecheck.c:98
+#: daemon/filecheck.c:91
#, c-format
msgid "%s: %s is not a regular file."
msgstr "%s: %s ei ole tavaline fail."
-#: daemon/filecheck.c:119
+#: daemon/filecheck.c:112
#, c-format
msgid "%s: %s is writable by group/other."
msgstr "%s: %s on kirjutatav grupile/teistele."
-#: daemon/filecheck.c:126
+#: daemon/filecheck.c:119
#, c-format
msgid "%s: %s is bigger than sysadmin specified maximum file size."
msgstr "%s: %s on suurem kui administraatori poolt lubatud limiit."
-#: daemon/misc.c:128
-#, c-format
-msgid "gdm_exec_script: Failed starting: %s"
-msgstr "gdm_exec_script: Ei õnnestunud alustada: %s"
-
-#: daemon/misc.c:132
-msgid "gdm_exec_script: Can't fork script process!"
-msgstr "gdm_exec_script: Ei õnnestunud forkida skriptiprotsessi!"
-
-#: daemon/server.c:84 daemon/server.c:208
+#: daemon/server.c:95
msgid "gdm_server_start: Error setting up USR1 signal handler"
msgstr "gdm_server_start: Viga signaali USR1 händleri ülesseadmisel"
-#: daemon/server.c:101
-#, c-format
-msgid "gdm_server_start: Could not open logfile for display %s!"
+#: daemon/server.c:179
+#, fuzzy
+msgid "gdm_server_start: Error setting up CHLD signal handler"
+msgstr "gdm_server_start: Viga signaali USR1 händleri ülesseadmisel"
+
+#: daemon/server.c:196
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Could not open logfile for display %s!"
msgstr "gdm_server_start: Ei saanud avada displei %s jaoks logfaili!"
-#: daemon/server.c:130
-msgid "gdm_server_start: Error setting USR1 to SIG_IGN"
+#: daemon/server.c:221
+#, fuzzy
+msgid "gdm_server_spawn: Error setting USR1 to SIG_IGN"
msgstr "gdm_server_start: Ei saanud määrata signaali USR1 SIG_IGN"
-#: daemon/server.c:147
-#, c-format
-msgid "gdm_server_start: Xserver not found: %s"
+#: daemon/server.c:237
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Xserver not found: %s"
msgstr "gdm_server_start: Ei õnnestunud leida Xserver-it: %s"
-#: daemon/server.c:153
-msgid "gdm_server_start: Can't fork Xserver process!"
+#: daemon/server.c:242
+#, fuzzy
+msgid "gdm_server_spawn: Can't fork Xserver process!"
msgstr "gdm_server_start: Ei õnnestunud forkida Xserver protsessi!"
-#: daemon/server.c:179
-#, c-format
-msgid "gdm_server_stop: Could not unlink auth file: %s!"
-msgstr "gdm_server_stop: Ei saanud unlinkida auth faili: %s!"
-
-#: daemon/server.c:234
-msgid "gdm_server_restart: Error setting up ALARM signal handler"
-msgstr "gdm_server_restart: Viga signaali ALARM händleri ülesseadmisel"
-
-#: daemon/slave.c:120
+#: daemon/slave.c:115
msgid "gdm_slave_init: Error setting up TERM/INT signal handler"
msgstr "gdm_slave_init: Viga signaali TERM/INT händleri ülesseadmisel"
-#: daemon/slave.c:128
+#: daemon/slave.c:123
msgid "gdm_slave_init: Error setting up CHLD signal handler"
msgstr "gdm_slave_init: Viga signaali CHLD händleri ülesseadmisel"
-#: daemon/slave.c:179
+#: daemon/slave.c:172
msgid "gdm_slave_greeter: Can't init pipe to gdmgreeter"
msgstr "gdm_slave_greeter: Ei õnnestunud avada toru gdmgreeter-isse"
-#: daemon/slave.c:204
+#: daemon/slave.c:197
#, c-format
msgid "gdm_slave_greeter: Couldn't set groupid to %d"
msgstr "gdm_slave_greeter: Ei õnnestunud määrata groupid-ks %d"
-#: daemon/slave.c:207
+#: daemon/slave.c:200
#, c-format
msgid "gdm_slave_greeter: Couldn't set userid to %d"
msgstr "gdm_slave_greeter: Ei õnnestunud määrata userid-ks %d"
-#: daemon/slave.c:217
+#: daemon/slave.c:210
#, c-format
msgid "gdm_slave_greeter: Error starting greeter on display %s"
msgstr "gdm_slave_greeter: Viga tervitaja (greeter) kävitamisel displeil %s"
-#: daemon/slave.c:220
+#: daemon/slave.c:213
msgid "gdm_slave_greeter: Can't fork gdmgreeter process"
msgstr "gdm_slave_greeter: Ei õnnestunud forkida gdmgreeter protsessi"
-#: daemon/slave.c:298
+#: daemon/slave.c:262
#, c-format
-msgid "gdm_slave_session_init: User '%s' not found. Aborting."
-msgstr "gdm_slave_session_init: Kasutaja '%s' on tundmatu. Lõpetame."
+msgid "gdm_slave_session_start: User passed auth but getpwnam(%s) failed!"
+msgstr ""
-#: daemon/slave.c:323
+#: daemon/slave.c:351
+#, fuzzy
msgid ""
-"gdm_slave_session_init: Execution of PreSession script returned > 0. "
+"gdm_slave_session_start: Execution of PreSession script returned > 0. "
"Aborting."
msgstr "gdm_slave_session_init: PreSession skripti kävitamise tulemus > 0."
-#: daemon/slave.c:347
-msgid "gdm_slave_session_init: Error forking user session"
+#: daemon/slave.c:375
+#, fuzzy
+msgid "gdm_slave_session_start: Error forking user session"
msgstr "gdm_slave_session_init: Viga kasutaja sessiooni forkimisel"
-#: daemon/slave.c:355
-#, c-format
-msgid "gdm_slave_session_init: Could not setgid %d. Aborting."
+#: daemon/slave.c:384
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not setgid %d. Aborting."
msgstr "gdm_slave_session_init: Ei õnnestunud teha setgid %d. Lõpetame."
-#: daemon/slave.c:358
-#, c-format
-msgid "gdm_slave_session_init: initgroups() failed for %s. Aborting."
+#: daemon/slave.c:388
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: initgroups() failed for %s. Aborting."
msgstr "gdm_slave_session_init: initgroups() %s jaoks ei õnnestunud. Lõpetame."
-#: daemon/slave.c:361
-#, c-format
-msgid "gdm_slave_session_init: Could not become %s. Aborting."
+#: daemon/slave.c:392
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not become %s. Aborting."
msgstr "gdm_slave_session_init: Ei õnnestunud hakata %s. Lõpetame."
-#: daemon/slave.c:403
-#, c-format
-msgid "gdm_slave_session_init: Could not start session `%s'"
+#: daemon/slave.c:428
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not start session `%s'"
msgstr "gdm_slave_session_init: Ei õnnestunud käivitada sessiooni '%s'"
-#: daemon/slave.c:578
+#: daemon/slave.c:609
#, c-format
msgid "gdm_slave_windows_kill_ioerror_handler: Fatal X error - Restarting %s"
-msgstr "gdm_slave_windows_kill_ioerror_handler: Fataalne X viga - taaskäivitame %s"
+msgstr ""
+"gdm_slave_windows_kill_ioerror_handler: Fataalne X viga - taaskäivitame %s"
-#: daemon/slave.c:610
+#: daemon/slave.c:641
msgid "gdm_slave_xsync_ping: Error setting up ALARM signal handler"
msgstr "gdm_slave_xsync_ping: Viga signaali ALARM händleri ülesseadmisel"
-#: daemon/verify.c:129 daemon/verify.c:201 gui/gdmlogin.c:1248
+#: daemon/slave.c:743
+#, fuzzy, c-format
+msgid "gdm_slave_exec_script: Failed starting: %s"
+msgstr "gdm_exec_script: Ei õnnestunud alustada: %s"
+
+#: daemon/slave.c:747
+#, fuzzy
+msgid "gdm_slave_exec_script: Can't fork script process!"
+msgstr "gdm_exec_script: Ei õnnestunud forkida skriptiprotsessi!"
+
+#. Ask gdmgreeter for the user's login. Just for good measure
+#: daemon/verify-crypt.c:58 daemon/verify-pam.c:123 daemon/verify-shadow.c:60
+#: gui/gdmlogin.c:1230
msgid "Login:"
msgstr "Kasutajanimi:"
-#: daemon/verify.c:135
+#: daemon/verify-pam.c:130
msgid "Can't find /etc/pam.d/gdm!"
msgstr "Ei leia /etc/pam.d/gdm!"
-#: daemon/verify.c:140
+#: daemon/verify-pam.c:136
#, c-format
msgid "Can't set PAM_TTY=%s"
msgstr "Ei õnnestu määrata PAM_TTY=%s"
-#: daemon/verify.c:145 daemon/verify.c:222
+#: daemon/verify-crypt.c:71 daemon/verify-pam.c:142 daemon/verify-shadow.c:81
#, c-format
msgid "Couldn't authenticate %s"
msgstr "Ei õnnestunud %s autentiseerida"
-#: daemon/verify.c:150
+#: daemon/verify-pam.c:153
#, c-format
msgid "Couldn't set acct. mgmt for %s"
msgstr "Ei õnnestunud määrata acct. mgmt %s jaoks"
-#: daemon/verify.c:155
+#: daemon/verify-pam.c:159
#, c-format
msgid "Couldn't set credentials for %s"
msgstr "Ei õnnestunud määrata mandaate %s jaoks"
-#: daemon/verify.c:160
+#: daemon/verify-pam.c:165
#, c-format
msgid "Couldn't open session for %s"
msgstr "Ei õnnestunud avada sessiooni %s jaoks"
-#: daemon/verify.c:217
+#: daemon/verify-pam.c:232
+msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
+msgstr "gdm_verify_check: Ei leia PAM konfiguratsioonifaili gdm jaoks"
+
+#. Request the user's password
+#: daemon/verify-crypt.c:64 daemon/verify-shadow.c:74
msgid "Password:"
msgstr "Parool:"
-#: daemon/verify.c:223
+#: daemon/verify-crypt.c:72 daemon/verify-shadow.c:82
msgid "User unknown"
msgstr "Tundmatu kasutaja"
-#: daemon/verify.c:228
+#: daemon/verify-crypt.c:77 daemon/verify-shadow.c:87
#, c-format
msgid "Root login disallowed on display '%s'"
msgstr "Root ei tohi displei '%s' kaudu sisse logida"
-#: daemon/verify.c:229
+#: daemon/verify-crypt.c:78 daemon/verify-shadow.c:88
msgid "Root login disallowed"
msgstr "Root ei tohi sisse logida"
-#: daemon/verify.c:237
+#: daemon/verify-crypt.c:87 daemon/verify-shadow.c:97
msgid "Incorrect password"
msgstr "Vale parool"
-#: daemon/verify.c:256
-msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
-msgstr "gdm_verify_check: Ei leia PAM konfiguratsioonifaili gdm jaoks"
-
-#: daemon/xdmcp.c:184
+#: daemon/xdmcp.c:178
#, c-format
msgid "gdm_xdmcp_init: Could not get server hostname: %s!"
msgstr "gdm_xdmcp_init: Ei õnnestu määrata serveri hostname: %s!"
-#: daemon/xdmcp.c:198
+#: daemon/xdmcp.c:192
msgid "gdm_xdmcp_init: Could not create socket!"
msgstr "gdm_xdmcp_init: Ei suutnud luua soketit!"
-#: daemon/xdmcp.c:205
+#: daemon/xdmcp.c:199
msgid "gdm_xdmcp_init: Could not bind to XDMCP socket!"
msgstr "gdm_xdmcp_init: Ei õnnestunud liituda XDMCP soketi külge!"
-#: daemon/xdmcp.c:214
+#: daemon/xdmcp.c:208
msgid "gdm_xdmcp_init: Can't alloc fifopath"
msgstr "gdm_xdmcp_init: Ei õnnestu allokeitida fifopath-i"
-#: daemon/xdmcp.c:219
+#: daemon/xdmcp.c:213
msgid "gdm_xdmcp_init: Could not make FIFO for chooser"
msgstr "gdm_xdmcp_init: Ei õnnestunud luua FIFO-t valija jaoks"
-#: daemon/xdmcp.c:224
+#: daemon/xdmcp.c:218
msgid "gdm_xdmcp_init: Could not open FIFO for chooser"
msgstr "gdm_xdmcp_init: Ei õnnestunud avada FIFO-t valija jaoks"
-#: daemon/xdmcp.c:284
+#: daemon/xdmcp.c:278
msgid "gdm_xdmcp_decode: Could not create XDMCP buffer!"
msgstr "gdm_xdmcp_decode: Ei õnnestunud luua XDMCP puhvrit!"
-#: daemon/xdmcp.c:289
+#: daemon/xdmcp.c:283
msgid "gdm_xdmcp_decode: Could not read XDMCP header!"
msgstr "gdm_xdmcp_decode: Ei õnnestunud lugeda XDMCP päist!"
-#: daemon/xdmcp.c:294
+#: daemon/xdmcp.c:288
msgid "gdm_xdmcp_decode: Incorrect XDMCP version!"
msgstr "gdm_xdmcp_decode: Vale XDMCP versioon!"
-#: daemon/xdmcp.c:333
+#: daemon/xdmcp.c:328
#, c-format
msgid "gdm_xdmcp_decode_packet: Unknown opcode from host %s"
msgstr "gdm_xdmcp_decode_packet: Tundmatu opkood hostilt %s"
-#: daemon/xdmcp.c:351
+#: daemon/xdmcp.c:346
msgid "gdm_xdmcp_handle_query: Could not extract authlist from packet"
msgstr "gdm_xdmcp_handle_query: Ei õnnestunud authlist-i paketist kätte saada"
-#: daemon/xdmcp.c:362
+#: daemon/xdmcp.c:357
msgid "gdm_xdmcp_handle_query: Error in checksum"
msgstr "gdm_xdmcp_handle_query: Viga kontrollsummas"
-#: daemon/xdmcp.c:433
+#: daemon/xdmcp.c:428
msgid "gdm_xdmcp_handle_forward_query: Could not read display address"
msgstr "gdm_xdmcp_handle_forward_query: Ei õnnestunud lugeda displei aadressi"
-#: daemon/xdmcp.c:439
+#: daemon/xdmcp.c:434
msgid "gdm_xdmcp_handle_forward_query: Could not read display port number"
-msgstr "gdm_xdmcp_handle_forward_query: Ei õnnestunud lugeda displei pordinumbrit"
+msgstr ""
+"gdm_xdmcp_handle_forward_query: Ei õnnestunud lugeda displei pordinumbrit"
-#: daemon/xdmcp.c:445
+#: daemon/xdmcp.c:440
msgid "gdm_xdmcp_handle_forward_query: Could not extract authlist from packet"
-msgstr "gdm_xdmcp_handle_forward_query: Ei õnnestunud authlist-i paketist kätte saada"
+msgstr ""
+"gdm_xdmcp_handle_forward_query: Ei õnnestunud authlist-i paketist kätte saada"
-#: daemon/xdmcp.c:460
+#: daemon/xdmcp.c:455
msgid "gdm_xdmcp_handle_forward_query: Error in checksum"
msgstr "gdm_xdmcp_handle_forward_query: Viga kontrollsummas"
-#: daemon/xdmcp.c:523
+#: daemon/xdmcp.c:518
#, c-format
msgid "Denied XDMCP query from host %s"
msgstr "XDMCP päring hostist %s tagasi lükatud"
-#: daemon/xdmcp.c:525
+#: daemon/xdmcp.c:520
msgid "Display not authorized to connect"
msgstr "Displeil ei ole ühenduseks volitusi"
-#: daemon/xdmcp.c:558
+#: daemon/xdmcp.c:553
#, c-format
msgid "gdm_xdmcp_handle_request: Got REQUEST from banned host %s"
msgstr "gdm_xdmcp_handle_request: Keelatud hostilt %s tuli REQUEST"
-#: daemon/xdmcp.c:565
+#: daemon/xdmcp.c:560
msgid "gdm_xdmcp_handle_request: Could not read Display Number"
msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda displei numbrit"
-#: daemon/xdmcp.c:571
+#: daemon/xdmcp.c:566
msgid "gdm_xdmcp_handle_request: Could not read Connection Type"
msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda ühenduse tüüpi"
-#: daemon/xdmcp.c:577
+#: daemon/xdmcp.c:572
msgid "gdm_xdmcp_handle_request: Could not read Client Address"
msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda kliendi aadressi"
-#: daemon/xdmcp.c:583
+#: daemon/xdmcp.c:578
msgid "gdm_xdmcp_handle_request: Could not read Authentication Names"
msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda autentiseerimisnime"
-#: daemon/xdmcp.c:589
+#: daemon/xdmcp.c:584
msgid "gdm_xdmcp_handle_request: Could not read Authentication Data"
msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda autentiseerimisandmeid"
-#: daemon/xdmcp.c:595
+#: daemon/xdmcp.c:590
msgid "gdm_xdmcp_handle_request: Could not read Authorization List"
-msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda autentiseerimisnimekirja"
+msgstr ""
+"gdm_xdmcp_handle_request: Ei õnnestunud lugeda autentiseerimisnimekirja"
-#: daemon/xdmcp.c:606
+#: daemon/xdmcp.c:601
msgid "gdm_xdmcp_handle_request: Could not read Manufacturer ID"
msgstr "gdm_xdmcp_handle_request: Ei õnnestunud lugeda tootja ID koodi"
-#: daemon/xdmcp.c:624
+#: daemon/xdmcp.c:619
#, c-format
msgid "gdm_xdmcp_handle_request: Failed checksum from %s"
msgstr "gdm_xdmcp_handle_request: Vigane kontrollsumma %s-lt"
-#: daemon/xdmcp.c:737
+#: daemon/xdmcp.c:732
#, c-format
msgid "gdm_xdmcp_handle_manage: Got Manage from banned host %s"
msgstr "gdm_xdmcp_handle_manage: Keelatud host %s saatis 'Manage'"
-#: daemon/xdmcp.c:744
+#: daemon/xdmcp.c:739
msgid "gdm_xdmcp_handle_manage: Could not read Session ID"
msgstr "gdm_xdmcp_handle_manage: Ei õnnestunud lugeda sessiooni ID koodi"
-#: daemon/xdmcp.c:750
+#: daemon/xdmcp.c:745
msgid "gdm_xdmcp_handle_manage: Could not read Display Number"
msgstr "gdm_xdmcp_handle_manage: Ei õnnestunud lugeda displei numbrit"
-#: daemon/xdmcp.c:759
+#: daemon/xdmcp.c:754
msgid "gdm_xdmcp_manage: Could not read Display Class"
msgstr "gdm_xdmcp_manage: Ei õnnestunud lugeda displei klassi"
-#: daemon/xdmcp.c:780
+#: daemon/xdmcp.c:775
#, c-format
msgid "gdm_xdmcp_handle_manage: Could not open logfile for display %s!"
-msgstr "gdm_xdmcp_handle_manage: Ei õnnestunud avada logfaili displei %s jaoks!"
+msgstr ""
+"gdm_xdmcp_handle_manage: Ei õnnestunud avada logfaili displei %s jaoks!"
-#: daemon/xdmcp.c:852
+#: daemon/xdmcp.c:847
#, c-format
msgid "gdm_xdmcp_handle_keepalive: Got KEEPALIVE from banned host %s"
msgstr "gdm_xdmcp_handle_keepalive: Keelatud host %s saatis KEEPALIVE"
-#: daemon/xdmcp.c:859
+#: daemon/xdmcp.c:854
msgid "gdm_xdmcp_handle_keepalive: Could not read Display Number"
msgstr "gdm_xdmcp_handle_keepalive: Ei õnnestunud lugeda displei numbrit"
-#: daemon/xdmcp.c:865
+#: daemon/xdmcp.c:860
msgid "gdm_xdmcp_handle_keepalive: Could not read Session ID"
msgstr "gdm_xdmcp_handle_keepalive: Ei õnnestunud lugeda sessiooni ID koodi"
-#: gui/gdmchooser.c:342
+#: gui/gdmchooser.c:340
#, c-format
msgid "gdm_chooser_parse_config: No configuration file: %s. Aborting."
msgstr "gdm_chooser_parse_config: Konfiguratsioonifaili ei ole: %s. Lõpetame."
-#: gui/gdmchooser.c:451
+#: gui/gdmchooser.c:449
#, c-format
msgid "Can't open default host icon: %s"
msgstr "Ei õnnestu avada vaikimisi hostiikooni: %s"
#. Buttons
-#: gui/gdmchooser.c:518
+#: gui/gdmchooser.c:516
msgid "Connect"
msgstr "Ühenda"
-#: gui/gdmchooser.c:525
+#: gui/gdmchooser.c:523
msgid "Rescan"
msgstr "Loe uuesti"
-#: gui/gdmchooser.c:531
+#: gui/gdmchooser.c:529
msgid "Cancel"
msgstr "Vabandust"
-#: gui/gdmchooser.c:582
+#: gui/gdmchooser.c:580
msgid "gdm_signals_init: Error setting up HUP signal handler"
msgstr "gdm_signals_init: Viga signaali HUP händleri ülesseadmisel"
-#: gui/gdmchooser.c:585
+#: gui/gdmchooser.c:583
msgid "gdm_signals_init: Error setting up INT signal handler"
msgstr "gdm_signals_init: Viga signaali INT händleri ülesseadmisel"
-#: gui/gdmchooser.c:588
+#: gui/gdmchooser.c:586
msgid "gdm_signals_init: Error setting up TERM signal handler"
msgstr "gdm_signals_init: Viga signaali TERM händleri ülesseadmisel"
-#: gui/gdmchooser.c:596 gui/gdmlogin.c:1557
+#: gui/gdmchooser.c:594 gui/gdmlogin.c:1542
msgid "Could not set signal mask!"
msgstr "Ei õnnestunud määrata signaalimaski!"
-#: gui/gdmlogin.c:271
+#: gui/gdmlogin.c:268
msgid "gdm_parse_enriched_string: String too long!"
msgstr "gdm_parse_enriched_string: Märgijada on liiga pikk!"
-#: gui/gdmlogin.c:272
+#: gui/gdmlogin.c:269
#, c-format
msgid "Welcome to %s"
msgstr "%s - Tere tulemast!"
-#: gui/gdmlogin.c:276
+#: gui/gdmlogin.c:273
msgid "gdm_parse_enriched_string: Could not malloc temporary buffer!"
msgstr "gdm_parse_enriched_string: Ei õnnestunud allokeitida ajutist puhvrit!"
-#: gui/gdmlogin.c:358
+#: gui/gdmlogin.c:355
msgid "Are you sure you want to reboot the machine?"
msgstr "Soovite Te kindlasti teha masinale uut alglaadimist?"
-#: gui/gdmlogin.c:371
+#: gui/gdmlogin.c:368
msgid "Are you sure you want to halt the machine?"
msgstr "Soovite Te kindlasti masinat välja lülitada?"
-#: gui/gdmlogin.c:388
+#: gui/gdmlogin.c:385
#, c-format
msgid "gdm_login_parse_config: No configuration file: %s. Aborting."
msgstr "gdm_login_parse_config: Puudub konfiguratsioonifail: %s. Lõpetame."
-#: gui/gdmlogin.c:524
+#: gui/gdmlogin.c:481
#, c-format
msgid ""
"Your preferred session type %s is not installed on this machine.\n"
@@ -600,7 +610,7 @@ msgstr ""
"Teie lemmiksessioon %s ei ole sellesse masinasse installeeritud.\n"
"Soovite Te muuta %s edaspidiseks vaikimisi sessiooniks?"
-#: gui/gdmlogin.c:543 gui/gdmlogin.c:573
+#: gui/gdmlogin.c:496 gui/gdmlogin.c:538
#, c-format
msgid ""
"You have chosen %s for this session, but your default setting is %s.\n"
@@ -609,91 +619,107 @@ msgstr ""
"Te valisite %s selleks sessiooniks, kuigi teie vaikimisi määrang on %s.\n"
"Soovite Te muuta %s edaspidiseks vaikimisi sessiooniks?"
-#: gui/gdmlogin.c:631
+#: gui/gdmlogin.c:597
#, c-format
msgid "%s session selected"
msgstr "valitud sessioon %s"
-#: gui/gdmlogin.c:647 gui/gdmlogin.c:750
+#: gui/gdmlogin.c:613 gui/gdmlogin.c:716
msgid "Last"
msgstr "Viimane"
-#: gui/gdmlogin.c:662
+#: gui/gdmlogin.c:628
msgid "gdm_login_session_init: Session script directory not found!"
msgstr "gdm_login_session_init: Ei leidnud sessiooniskriptide kataloogi!"
-#: gui/gdmlogin.c:715
+#: gui/gdmlogin.c:681
msgid "No session scripts found. Aborting!"
msgstr "Ei leidnud sessiooniskripte. Lõpetame!"
-#: gui/gdmlogin.c:719
+#: gui/gdmlogin.c:685
#, c-format
msgid "No default session link found. Using %s.\n"
msgstr "Ei leidnud vaikimisi sessiooni linki. Kasutame %s.\n"
-#: gui/gdmlogin.c:733
+#: gui/gdmlogin.c:699
#, c-format
msgid "%s language selected"
msgstr "valitud keel %s"
-#: gui/gdmlogin.c:765
+#: gui/gdmlogin.c:731
msgid "A-M"
msgstr "A-M"
-#: gui/gdmlogin.c:771
+#: gui/gdmlogin.c:737
msgid "N-Z"
msgstr "N-Z"
-#: gui/gdmlogin.c:777
+#: gui/gdmlogin.c:743
msgid "Other"
msgstr "Muu"
-#: gui/gdmlogin.c:1080
+#: gui/gdmlogin.c:1062
msgid "Session"
msgstr "Sessioon"
-#: gui/gdmlogin.c:1087
+#: gui/gdmlogin.c:1069
msgid "Language"
msgstr "Keel"
-#: gui/gdmlogin.c:1094
+#: gui/gdmlogin.c:1076
msgid "Reboot..."
msgstr "Alglaadimine..."
-#: gui/gdmlogin.c:1101
+#: gui/gdmlogin.c:1083
msgid "Halt..."
msgstr "Seiskamine..."
-#: gui/gdmlogin.c:1108
+#: gui/gdmlogin.c:1090
msgid "System"
msgstr "Süsteem"
-#: gui/gdmlogin.c:1116
+#: gui/gdmlogin.c:1098
#, c-format
msgid "Can't open icon file: %s. Suspending iconify feature!"
msgstr "Ei õnnestu avada ikoonifaili: %s. Lülitame ikooniks tegemise välja!"
-#: gui/gdmlogin.c:1119
+#: gui/gdmlogin.c:1101
msgid "Iconify"
msgstr "Ikooniks"
-#: gui/gdmlogin.c:1283
+#: gui/gdmlogin.c:1265
msgid "Please enter your login"
msgstr "Palun sisestage oma kasutajanimi"
-#: gui/gdmlogin.c:1464
+#: gui/gdmlogin.c:1446
#, c-format
msgid "Can't open DefaultImage: %s. Suspending face browser!"
msgstr "Ei õnnestu avada DefaultImage: %s. Lülitame nägude valiku välja!"
-#: gui/gdmlogin.c:1543
+#: gui/gdmlogin.c:1528
msgid "main: Error setting up HUP signal handler"
msgstr "main: Viga signaali HUP händleri ülesseadmisel"
-#: gui/gdmlogin.c:1546
+#: gui/gdmlogin.c:1531
msgid "main: Error setting up INT signal handler"
msgstr "main: Viga signaali INT händleri ülesseadmisel"
-#: gui/gdmlogin.c:1549
+#: gui/gdmlogin.c:1534
msgid "main: Error setting up TERM signal handler"
msgstr "main: Viga signaali TERM händleri ülesseadmisel"
+
+#~ msgid ""
+#~ "According to %s, gdm was already running (%d),\n"
+#~ "but seems to have been murdered mysteriously.\n"
+#~ msgstr ""
+#~ "Vastavalt %s gdm kord juba töötas (%d),\n"
+#~ "kuid mõrvati salapärastel asjaoludel.\n"
+
+#~ msgid "gdm_server_stop: Could not unlink auth file: %s!"
+#~ msgstr "gdm_server_stop: Ei saanud unlinkida auth faili: %s!"
+
+#~ msgid "gdm_server_restart: Error setting up ALARM signal handler"
+#~ msgstr "gdm_server_restart: Viga signaali ALARM händleri ülesseadmisel"
+
+#~ msgid "gdm_slave_session_init: User '%s' not found. Aborting."
+#~ msgstr "gdm_slave_session_init: Kasutaja '%s' on tundmatu. Lõpetame."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index c4b33025..dd8d6db0 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -3,7 +3,7 @@
msgid ""
msgstr ""
"Project-Id-Version: 1.0.0\n"
-"POT-Creation-Date: 1999-09-29 17:33-0300\n"
+"POT-Creation-Date: 1999-12-27 13:01+0100\n"
"PO-Revision-Date: 1999-09-29 18:28-03:00\n"
"Last-Translator: Alexandre Hautequest <hquest@fesppr.br>\n"
"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
@@ -11,74 +11,76 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: daemon/gdm.c:166
+#: daemon/gdm.c:169
#, c-format
msgid "gdm_config_parse: No configuration file: %s. Aborting."
msgstr "gdm_config_parse: Nenhum arquivo de configuração: %s. Abortando."
#: daemon/gdm.c:217
-msgid "gdm_config_parse: No greeter specified and default not found."
+#, fuzzy
+msgid "gdm_config_parse: No greeter specified."
msgstr "gdm_config_parse: No greeter specified and default not found."
-#: daemon/gdm.c:229
-msgid "gdm_config_parse: No authdir specified and default not found."
+#: daemon/gdm.c:220
+#, fuzzy
+msgid "gdm_config_parse: No authdir specified."
msgstr ""
"gdm_config_parse: Diretório de autenticação não especificado e padrão não \n"
"encontrado."
-#: daemon/gdm.c:247
-msgid ""
-"gdm_config_parse: No sessions directory specified and default not found."
+#: daemon/gdm.c:226
+#, fuzzy
+msgid "gdm_config_parse: No sessions directory specified."
msgstr ""
"gdm_config_parse: Nenhum diretório de sessão especificado e o padrão não foi "
"encontrado."
-#: daemon/gdm.c:259
+#: daemon/gdm.c:238
msgid "gdm_config_parse: Invalid server line in config file. Ignoring!"
msgstr ""
"gdm_config_parse: Linha inválida no arquivo de configuração do servidor. "
"Ignorando!"
-#: daemon/gdm.c:265
+#: daemon/gdm.c:244
msgid ""
"gdm_config_parse: Xdmcp disabled and no local servers defined. Aborting!"
msgstr ""
"gdm_config_parse: Xdmcp desativado e nenhum servidor local definido. "
"Abortando!"
-#: daemon/gdm.c:270
+#: daemon/gdm.c:251
#, c-format
msgid "gdm_config_parse: Can't find the gdm user (%s). Aborting!"
msgstr ""
"gdm_config_parse: Não foi possível encontrar o usuário do gdm (%s). "
"Abortando!"
-#: daemon/gdm.c:275
+#: daemon/gdm.c:256
msgid "gdm_config_parse: The gdm user should not be root. Aborting!"
msgstr "gdm_config_parse: O usuário gdm não pode ser o root. Abortando!"
-#: daemon/gdm.c:280
+#: daemon/gdm.c:261
#, c-format
msgid "gdm_config_parse: Can't find the gdm group (%s). Aborting!"
msgstr ""
"gdm_config_parse: Não foi possível encontrar o grupo gdm (%s). Abortando!"
-#: daemon/gdm.c:285
+#: daemon/gdm.c:266
msgid "gdm_config_parse: The gdm group should not be root. Aborting!"
msgstr "gdm_config_parse: O grupo gdm não pode ser o root. Abortando!"
-#: daemon/gdm.c:292
+#: daemon/gdm.c:302
#, c-format
msgid "gdm_config_parse: Authdir %s does not exist. Aborting."
msgstr "gdm_config_parse: Diretório %s de autenticação não existe. Abortando."
-#: daemon/gdm.c:295
+#: daemon/gdm.c:305
#, c-format
msgid "gdm_config_parse: Authdir %s is not a directory. Aborting."
msgstr ""
"gdm_config_parse: Diretório %s de autenticação não é um diretório. Abortando."
-#: daemon/gdm.c:298
+#: daemon/gdm.c:308
#, c-format
msgid ""
"gdm_config_parse: Authdir %s is not owned by user %s, group %s. Aborting."
@@ -86,7 +88,7 @@ msgstr ""
"gdm_config_parse: Diretório %s de autenticação não pertente ao usuário %s, "
"grupo %s. Abortando."
-#: daemon/gdm.c:302
+#: daemon/gdm.c:312
#, c-format
msgid ""
"gdm_config_parse: Authdir %s has wrong permissions. Should be 750. Aborting."
@@ -94,549 +96,542 @@ msgstr ""
"gdm_config_parse: Diretório %s de autenticação tem permissões erradas. Deve "
"ser 750. Abortando."
-#: daemon/gdm.c:363
+#: daemon/gdm.c:389
#, c-format
msgid "gdm_display_manage: Failed forking gdm slave process for %d"
msgstr ""
"gdm_display_manage: Falha na inicialização (fork) de um processo gdm escravo "
"para %d"
-#: daemon/gdm.c:442
+#: daemon/gdm.c:478
#, c-format
msgid "gdm_child_action: Aborting display %s"
msgstr "gdm_child_action: Abortando tela %s"
-#: daemon/gdm.c:447
+#: daemon/gdm.c:483
msgid "gdm_child_action: Master rebooting..."
msgstr "gdm_child_action: Reinicialização Principal..."
-#: daemon/gdm.c:453
+#: daemon/gdm.c:489
#, c-format
msgid "gdm_child_action: Reboot failed: %s"
msgstr "gdm_child_action: Falha de reinicialização: %s"
-#: daemon/gdm.c:457
+#: daemon/gdm.c:493
msgid "gdm_child_action: Master halting..."
msgstr "gdm_child_action: Suspendenção Principal..."
-#: daemon/gdm.c:463
+#: daemon/gdm.c:499
#, c-format
msgid "gdm_child_action: Halt failed: %s"
msgstr "gdm_child_action: Falha na suspensão: %s"
-#: daemon/gdm.c:560
+#: daemon/gdm.c:619
msgid "gdm_daemonify: fork() failed!"
msgstr "gdm_daemonify: Falha no fork()!"
-#: daemon/gdm.c:563
+#: daemon/gdm.c:622
#, c-format
msgid "gdm_daemonify: setsid() failed: %s!"
msgstr "gdm_daemonify: Falha no setsid(): %s!"
-#. XDM compliant error message
-#: daemon/gdm.c:589
+#: daemon/gdm.c:651
msgid "Only root wants to run x^hgdm\n"
msgstr "Apenas o root deseja rodar o gdm\n"
-#: daemon/gdm.c:610
-msgid ""
-"gdm already running. Aborting!\n"
-"\n"
+#: daemon/gdm.c:672
+#, fuzzy
+msgid "gdm already running. Aborting!"
msgstr ""
"O gdm já está em execução. Abortando!\n"
"\n"
-#: daemon/gdm.c:616
-#, c-format
-msgid ""
-"According to %s, gdm was already running (%d),\n"
-"but seems to have been murdered mysteriously.\n"
-msgstr ""
-"De acordo com %s, o gdm já estava rodando (%d),\n"
-"mas parece que morreu misteriosamente.\n"
-
-#: daemon/gdm.c:638
+#: daemon/gdm.c:693
msgid "gdm_main: Error setting up TERM signal handler"
msgstr "gdm_main: Erro ajustando o tratador do sinal TERM"
-#: daemon/gdm.c:641
+#: daemon/gdm.c:696
msgid "gdm_main: Error setting up INT signal handler"
msgstr "gdm_main: Erro ajustando o tratador do sinal INT"
-#: daemon/gdm.c:649
+#: daemon/gdm.c:704
msgid "gdm_main: Error setting up CHLD signal handler"
msgstr "gdm_main: Erro ajustando o tratador do sinal CHLD"
#. Really no need to clean up here - this process is a goner anyway
-#: daemon/auth.c:215 daemon/auth.c:240
+#: daemon/auth.c:228 daemon/auth.c:255
#, c-format
msgid "gdm_auth_user_add: Could not open cookie file %s"
msgstr "gdm_auth_user_add: Não é possível abrir arquivo `cookie' %s"
-#: daemon/auth.c:229
+#: daemon/auth.c:243
#, c-format
msgid "gdm_auth_user_add: Could not lock cookie file %s"
msgstr "gdm_auth_user_add: Não é possível travar (lock) de `cookie' %s"
-#: daemon/auth.c:300
+#: daemon/auth.c:325
#, c-format
msgid "gdm_auth_user_remove: Ignoring suspiciously looking cookie file %s"
msgstr "gdm_auth_user_remove: Ignorando o cookie parecendo muito suspeito %s"
-#: daemon/filecheck.c:58
+#: daemon/filecheck.c:51
#, c-format
msgid "%s: Directory %s does not exist."
msgstr "%s: Diretório %s não existe."
-#: daemon/filecheck.c:64 daemon/filecheck.c:105
+#: daemon/filecheck.c:57 daemon/filecheck.c:98
#, c-format
msgid "%s: %s is not owned by uid %d."
msgstr "%s: %s não pertence ao uid %d."
-#: daemon/filecheck.c:70 daemon/filecheck.c:112
+#: daemon/filecheck.c:63 daemon/filecheck.c:105
#, c-format
msgid "%s: %s is writable by group."
msgstr "%s: %s é gravável pelo grupo."
-#: daemon/filecheck.c:76
+#: daemon/filecheck.c:69
#, c-format
msgid "%s: %s is writable by other."
msgstr "%s: %s é gravável por outros."
-#: daemon/filecheck.c:90
+#: daemon/filecheck.c:83
#, c-format
msgid "%s: does not exist and must."
msgstr "%s: não existe e é necessário."
-#: daemon/filecheck.c:98
+#: daemon/filecheck.c:91
#, c-format
msgid "%s: %s is not a regular file."
msgstr "%s: %s não é um arquivo normal."
-#: daemon/filecheck.c:119
+#: daemon/filecheck.c:112
#, c-format
msgid "%s: %s is writable by group/other."
msgstr "%s: %s é gravável por grupo/outros."
-#: daemon/filecheck.c:126
+#: daemon/filecheck.c:119
#, c-format
msgid "%s: %s is bigger than sysadmin specified maximum file size."
msgstr ""
"%s: %s é maior que o tamanho máximo de arquivo especificado pelo "
"administrador."
-#: daemon/misc.c:128
-#, c-format
-msgid "gdm_exec_script: Failed starting: %s"
-msgstr "gdm_exec_script: Falha inicializando: %s"
-
-#: daemon/misc.c:132
-msgid "gdm_exec_script: Can't fork script process!"
-msgstr ""
-"gdm_exec_script: Não foi possível inicializar (fork) o processo do script!"
-
-#: daemon/server.c:84 daemon/server.c:208
+#: daemon/server.c:95
msgid "gdm_server_start: Error setting up USR1 signal handler"
msgstr "gdm_server_start: Erro ajustando o tratador do sinal USR1"
-#: daemon/server.c:101
-#, c-format
-msgid "gdm_server_start: Could not open logfile for display %s!"
+#: daemon/server.c:179
+#, fuzzy
+msgid "gdm_server_start: Error setting up CHLD signal handler"
+msgstr "gdm_server_start: Erro ajustando o tratador do sinal USR1"
+
+#: daemon/server.c:196
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Could not open logfile for display %s!"
msgstr ""
"gdm_server_start: Não foi possível abrir arquivo de registro para\n"
"a tela %s!"
-#: daemon/server.c:130
-msgid "gdm_server_start: Error setting USR1 to SIG_IGN"
+#: daemon/server.c:221
+#, fuzzy
+msgid "gdm_server_spawn: Error setting USR1 to SIG_IGN"
msgstr "gdm_server_start: Erro ajustando USR1 para SIG_IGN"
-#: daemon/server.c:147
-#, c-format
-msgid "gdm_server_start: Xserver not found: %s"
+#: daemon/server.c:237
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Xserver not found: %s"
msgstr "gdm_servers_start: XServer não encontrado: %s"
-#: daemon/server.c:153
-msgid "gdm_server_start: Can't fork Xserver process!"
+#: daemon/server.c:242
+#, fuzzy
+msgid "gdm_server_spawn: Can't fork Xserver process!"
msgstr "gdm_server_start: Não foi possível inicializar o Xserver!"
-#: daemon/server.c:179
-#, c-format
-msgid "gdm_server_stop: Could not unlink auth file: %s!"
-msgstr "gdm_auth_secure_display: Não foi possível desvincular o arquivo de autorização: %s!"
-
-#: daemon/server.c:234
-msgid "gdm_server_restart: Error setting up ALARM signal handler"
-msgstr "gdm_server_restart: Erro na configuração do tratador do sinal ALARM"
-
-#: daemon/slave.c:120
+#: daemon/slave.c:115
msgid "gdm_slave_init: Error setting up TERM/INT signal handler"
msgstr "gdm_slave_init: Erro ajustando o tratador do sinal TERM/INT"
-#: daemon/slave.c:128
+#: daemon/slave.c:123
msgid "gdm_slave_init: Error setting up CHLD signal handler"
msgstr "gdm_slave_init: Erro ajustando o tratador do sinal CHLD"
-#: daemon/slave.c:179
+#: daemon/slave.c:172
msgid "gdm_slave_greeter: Can't init pipe to gdmgreeter"
msgstr ""
"gdm_slave_greeter: Não foi possível iniciar o duto (pipe) para o gdmgreeter"
-#: daemon/slave.c:204
+#: daemon/slave.c:197
#, c-format
msgid "gdm_slave_greeter: Couldn't set groupid to %d"
msgstr "gdm_slave_greeter: Não foi possível configurar o groupid para %d"
-#: daemon/slave.c:207
+#: daemon/slave.c:200
#, c-format
msgid "gdm_slave_greeter: Couldn't set userid to %d"
msgstr "gdm_slave_greeter: Não foi possível configurar o userid para %d"
-#: daemon/slave.c:217
+#: daemon/slave.c:210
#, c-format
msgid "gdm_slave_greeter: Error starting greeter on display %s"
msgstr "gdm_slave_greeter: Erro inicializando anfitrião na tela %s"
-#: daemon/slave.c:220
+#: daemon/slave.c:213
msgid "gdm_slave_greeter: Can't fork gdmgreeter process"
msgstr ""
"gdm_slave_greeter: Não foi possível inicializar (fork) o processo gdmgreeter"
-#: daemon/slave.c:298
+#: daemon/slave.c:262
#, c-format
-msgid "gdm_slave_session_init: User '%s' not found. Aborting."
-msgstr "gdm_slave_session_init: Usuário '%s' não encontrado. Abortando."
+msgid "gdm_slave_session_start: User passed auth but getpwnam(%s) failed!"
+msgstr ""
-#: daemon/slave.c:323
+#: daemon/slave.c:351
+#, fuzzy
msgid ""
-"gdm_slave_session_init: Execution of PreSession script returned > 0. "
+"gdm_slave_session_start: Execution of PreSession script returned > 0. "
"Aborting."
msgstr ""
"gdm_slave_session_init: Execução do script pré-sessão retornou > 0. "
"Abortando."
-#: daemon/slave.c:347
-msgid "gdm_slave_session_init: Error forking user session"
+#: daemon/slave.c:375
+#, fuzzy
+msgid "gdm_slave_session_start: Error forking user session"
msgstr ""
"gdm_slave_session_init: Erro inicializando (forking) a sessão do usuário"
-#: daemon/slave.c:355
-#, c-format
-msgid "gdm_slave_session_init: Could not setgid %d. Aborting."
+#: daemon/slave.c:384
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not setgid %d. Aborting."
msgstr "gdm_slave_session_init: Não foi possível setgid %d. Abortando."
-#: daemon/slave.c:358
-#, c-format
-msgid "gdm_slave_session_init: initgroups() failed for %s. Aborting."
+#: daemon/slave.c:388
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: initgroups() failed for %s. Aborting."
msgstr "gdm_slave_session_init: initgroups() falhou para %s. Abortando."
-#: daemon/slave.c:361
-#, c-format
-msgid "gdm_slave_session_init: Could not become %s. Aborting."
+#: daemon/slave.c:392
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not become %s. Aborting."
msgstr "gdm_slave_session_init: Não foi possível virar %s. Abortando."
-#: daemon/slave.c:403
-#, c-format
-msgid "gdm_slave_session_init: Could not start session `%s'"
+#: daemon/slave.c:428
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not start session `%s'"
msgstr "gdm_slave_session_init: Não foi possível iniciar a sessão `%s'"
-#: daemon/slave.c:578
+#: daemon/slave.c:609
#, c-format
msgid "gdm_slave_windows_kill_ioerror_handler: Fatal X error - Restarting %s"
msgstr ""
"gdm_slave_windows_kill_ioerror_handler: Erro fata no X - Reinicializando %s"
-#: daemon/slave.c:610
+#: daemon/slave.c:641
msgid "gdm_slave_xsync_ping: Error setting up ALARM signal handler"
msgstr "gdm_slave_xsync_ping: Erro na configuração do tratador do sinal ALARM"
-#: daemon/verify.c:129 daemon/verify.c:201 gui/gdmlogin.c:1248
+#: daemon/slave.c:743
+#, fuzzy, c-format
+msgid "gdm_slave_exec_script: Failed starting: %s"
+msgstr "gdm_exec_script: Falha inicializando: %s"
+
+#: daemon/slave.c:747
+#, fuzzy
+msgid "gdm_slave_exec_script: Can't fork script process!"
+msgstr ""
+"gdm_exec_script: Não foi possível inicializar (fork) o processo do script!"
+
+#. Ask gdmgreeter for the user's login. Just for good measure
+#: daemon/verify-crypt.c:58 daemon/verify-pam.c:123 daemon/verify-shadow.c:60
+#: gui/gdmlogin.c:1230
msgid "Login:"
msgstr "Login:"
-#: daemon/verify.c:135
+#: daemon/verify-pam.c:130
msgid "Can't find /etc/pam.d/gdm!"
msgstr "Não foi possível encontrar /etc/pam.d/gdm!"
-#: daemon/verify.c:140
+#: daemon/verify-pam.c:136
#, c-format
msgid "Can't set PAM_TTY=%s"
msgstr "Não foi possível ajustar PAM_TTY=%s"
-#: daemon/verify.c:145 daemon/verify.c:222
+#: daemon/verify-crypt.c:71 daemon/verify-pam.c:142 daemon/verify-shadow.c:81
#, c-format
msgid "Couldn't authenticate %s"
msgstr "Não foi possível autenticar %s"
-#: daemon/verify.c:150
+#: daemon/verify-pam.c:153
#, c-format
msgid "Couldn't set acct. mgmt for %s"
msgstr "Não foi possível ajustar o gerenciamento de contas para %s"
-#: daemon/verify.c:155
+#: daemon/verify-pam.c:159
#, c-format
msgid "Couldn't set credentials for %s"
msgstr "Não foi possível ajustar as credenciais para %s"
-#: daemon/verify.c:160
+#: daemon/verify-pam.c:165
#, c-format
msgid "Couldn't open session for %s"
msgstr "Não foi possível abrir sessão para %s"
-#: daemon/verify.c:217
+#: daemon/verify-pam.c:232
+msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
+msgstr "gdm_verify_check: Não encontrei configuração da PAM para o gdm"
+
+#. Request the user's password
+#: daemon/verify-crypt.c:64 daemon/verify-shadow.c:74
msgid "Password:"
msgstr "Password:"
-#: daemon/verify.c:223
+#: daemon/verify-crypt.c:72 daemon/verify-shadow.c:82
msgid "User unknown"
msgstr "Usuário desconhecido"
-#: daemon/verify.c:228
+#: daemon/verify-crypt.c:77 daemon/verify-shadow.c:87
#, c-format
msgid "Root login disallowed on display '%s'"
msgstr "Acesso root desabilitado na tela '%s'"
-#: daemon/verify.c:229
+#: daemon/verify-crypt.c:78 daemon/verify-shadow.c:88
msgid "Root login disallowed"
msgstr "Acesso root desabilitado"
-#: daemon/verify.c:237
+#: daemon/verify-crypt.c:87 daemon/verify-shadow.c:97
msgid "Incorrect password"
msgstr "Senha incorreta"
-#: daemon/verify.c:256
-msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
-msgstr "gdm_verify_check: Não encontrei configuração da PAM para o gdm"
-
-#: daemon/xdmcp.c:184
+#: daemon/xdmcp.c:178
#, c-format
msgid "gdm_xdmcp_init: Could not get server hostname: %s!"
msgstr ""
"gdm_xdmcp_init: Não foi possível obter o nome de máquina do servidor: %s!"
-#: daemon/xdmcp.c:198
+#: daemon/xdmcp.c:192
msgid "gdm_xdmcp_init: Could not create socket!"
msgstr "gdm_xdmcp_init: Não foi possível criar o soquete!"
-#: daemon/xdmcp.c:205
+#: daemon/xdmcp.c:199
msgid "gdm_xdmcp_init: Could not bind to XDMCP socket!"
msgstr "gdm_xdmcp_init: Não foi possível conectar ao soquete XDMCP!"
-#: daemon/xdmcp.c:214
+#: daemon/xdmcp.c:208
msgid "gdm_xdmcp_init: Can't alloc fifopath"
msgstr "gdm_xdmcp_init: Não foi possível alocar um soquete!"
-#: daemon/xdmcp.c:219
+#: daemon/xdmcp.c:213
msgid "gdm_xdmcp_init: Could not make FIFO for chooser"
msgstr "gdm_xdmcp_init: Não foi possível criar um FIFO para o seletor!"
-#: daemon/xdmcp.c:224
+#: daemon/xdmcp.c:218
msgid "gdm_xdmcp_init: Could not open FIFO for chooser"
msgstr "gdm_xdmcp_init: Não foi possível abrir um FIFO para o seletor!"
-#: daemon/xdmcp.c:284
+#: daemon/xdmcp.c:278
msgid "gdm_xdmcp_decode: Could not create XDMCP buffer!"
msgstr "gdm_xdmcp_decode: Não foi possível criar o buffer XDMCP!"
-#: daemon/xdmcp.c:289
+#: daemon/xdmcp.c:283
msgid "gdm_xdmcp_decode: Could not read XDMCP header!"
msgstr "gdm_xdmcp_decode: Não foi possível ler o cabeçalho XDMCP!"
-#: daemon/xdmcp.c:294
+#: daemon/xdmcp.c:288
msgid "gdm_xdmcp_decode: Incorrect XDMCP version!"
msgstr "gdm_xdmcp_decode: Versão incorrect do XDMCP!"
-#: daemon/xdmcp.c:333
+#: daemon/xdmcp.c:328
#, c-format
msgid "gdm_xdmcp_decode_packet: Unknown opcode from host %s"
msgstr "gdm_xdmcp_decode_packet: Opcode desconhecido da máquina %s"
-#: daemon/xdmcp.c:351
+#: daemon/xdmcp.c:346
msgid "gdm_xdmcp_handle_query: Could not extract authlist from packet"
msgstr ""
-"gdm_xdmcp_handle_query: Não foi possível obter lista de autenticação "
-"do pacote"
+"gdm_xdmcp_handle_query: Não foi possível obter lista de autenticação do "
+"pacote"
-#: daemon/xdmcp.c:362
+#: daemon/xdmcp.c:357
msgid "gdm_xdmcp_handle_query: Error in checksum"
msgstr "gdm_xdmcp_handle_query: Erro de validação"
-#: daemon/xdmcp.c:433
+#: daemon/xdmcp.c:428
msgid "gdm_xdmcp_handle_forward_query: Could not read display address"
-msgstr "gdm_xdmcp_handle_forward_query: Não foi possível ler o endereço da tela"
+msgstr ""
+"gdm_xdmcp_handle_forward_query: Não foi possível ler o endereço da tela"
-#: daemon/xdmcp.c:439
+#: daemon/xdmcp.c:434
msgid "gdm_xdmcp_handle_forward_query: Could not read display port number"
msgstr "gdm_xdmcp_handle_forward_query: Não foi possível ler a porta da tela"
-#: daemon/xdmcp.c:445
+#: daemon/xdmcp.c:440
msgid "gdm_xdmcp_handle_forward_query: Could not extract authlist from packet"
msgstr ""
"gdm_xdmcp_handle_forward_query: Não foi possível obter lista de autenticação "
"do pacote"
-#: daemon/xdmcp.c:460
+#: daemon/xdmcp.c:455
msgid "gdm_xdmcp_handle_forward_query: Error in checksum"
msgstr "gdm_xdmcp_handle_forward__query: Erro de validação"
-#: daemon/xdmcp.c:523
+#: daemon/xdmcp.c:518
#, c-format
msgid "Denied XDMCP query from host %s"
msgstr "Pesquisa XDMCP negada pela máquina %s"
-#: daemon/xdmcp.c:525
+#: daemon/xdmcp.c:520
msgid "Display not authorized to connect"
msgstr "Tela não autorizada a conectar"
-#: daemon/xdmcp.c:558
+#: daemon/xdmcp.c:553
#, c-format
msgid "gdm_xdmcp_handle_request: Got REQUEST from banned host %s"
msgstr "gdm_xdmcp_handle_request: Interceptado REQUEST da máquina %s banida."
-#: daemon/xdmcp.c:565
+#: daemon/xdmcp.c:560
msgid "gdm_xdmcp_handle_request: Could not read Display Number"
msgstr "gdm_xdmcp_handle_request: Não foi possível ler o número da tela"
-#: daemon/xdmcp.c:571
+#: daemon/xdmcp.c:566
msgid "gdm_xdmcp_handle_request: Could not read Connection Type"
msgstr "gdm_xdmcp_handle_request: Não foi possível ler o tipo da conexão"
-#: daemon/xdmcp.c:577
+#: daemon/xdmcp.c:572
msgid "gdm_xdmcp_handle_request: Could not read Client Address"
msgstr "gdm_xdmcp_handle_request: Não foi possível ler o endereço do cliente"
-#: daemon/xdmcp.c:583
+#: daemon/xdmcp.c:578
msgid "gdm_xdmcp_handle_request: Could not read Authentication Names"
msgstr ""
"gdm_xdmcp_handle_request: Não foi possível ler os nomes de autenticação"
-#: daemon/xdmcp.c:589
+#: daemon/xdmcp.c:584
msgid "gdm_xdmcp_handle_request: Could not read Authentication Data"
msgstr ""
"gdm_xdmcp_handle_request: Não foi possível ler os dados de autenticação"
-#: daemon/xdmcp.c:595
+#: daemon/xdmcp.c:590
msgid "gdm_xdmcp_handle_request: Could not read Authorization List"
msgstr "gdm_xdmcp_handle_request: Não foi possível ler a lista de autorização"
-#: daemon/xdmcp.c:606
+#: daemon/xdmcp.c:601
msgid "gdm_xdmcp_handle_request: Could not read Manufacturer ID"
msgstr ""
"gdm_xdmcp_handle_request: Não foi possível ler a identificação do fabricante"
-#: daemon/xdmcp.c:624
+#: daemon/xdmcp.c:619
#, c-format
msgid "gdm_xdmcp_handle_request: Failed checksum from %s"
msgstr "gdm_xdmcp_handle_request: Checksum incorreto de %s"
-#: daemon/xdmcp.c:737
+#: daemon/xdmcp.c:732
#, c-format
msgid "gdm_xdmcp_handle_manage: Got Manage from banned host %s"
msgstr "gdm_xdmcp_handle_manage: Interceptado Manage da máquina %s banida"
-#: daemon/xdmcp.c:744
+#: daemon/xdmcp.c:739
msgid "gdm_xdmcp_handle_manage: Could not read Session ID"
msgstr ""
"gdm_xdmcp_handle_manage: Não foi possível ler o identificador da sessão"
-#: daemon/xdmcp.c:750
+#: daemon/xdmcp.c:745
msgid "gdm_xdmcp_handle_manage: Could not read Display Number"
msgstr "gdm_xdmcp_handle_manage: Não foi possível ler o Número da Tela"
-#: daemon/xdmcp.c:759
+#: daemon/xdmcp.c:754
msgid "gdm_xdmcp_manage: Could not read Display Class"
msgstr "gdm_xdmcp_manage: Não foi possível ler a Classe Display"
-#: daemon/xdmcp.c:780
+#: daemon/xdmcp.c:775
#, c-format
msgid "gdm_xdmcp_handle_manage: Could not open logfile for display %s!"
msgstr ""
"gdm_xdmcp_handle_manage: Não foi possível abrir arquivo de registro para\n"
"a tela %s!"
-#: daemon/xdmcp.c:852
+#: daemon/xdmcp.c:847
#, c-format
msgid "gdm_xdmcp_handle_keepalive: Got KEEPALIVE from banned host %s"
msgstr ""
"gdm_xdmcp_handle_keepalive: Interceptado KEEPALIVE da máquina %s banida."
-#: daemon/xdmcp.c:859
+#: daemon/xdmcp.c:854
msgid "gdm_xdmcp_handle_keepalive: Could not read Display Number"
msgstr "gdm_xdmcp_handle_keepalive: Não foi possível ler o Número da Tela"
-#: daemon/xdmcp.c:865
+#: daemon/xdmcp.c:860
msgid "gdm_xdmcp_handle_keepalive: Could not read Session ID"
msgstr ""
"gdm_xdmcp_handle_keepalive: Não foi possível ler o identificador da sessão"
-#: gui/gdmchooser.c:342
+#: gui/gdmchooser.c:340
#, c-format
msgid "gdm_chooser_parse_config: No configuration file: %s. Aborting."
msgstr ""
"gdm_greeter_parse_config: Nenhum arquivo de configuração: %s. Abortando."
-#: gui/gdmchooser.c:451
+#: gui/gdmchooser.c:449
#, c-format
msgid "Can't open default host icon: %s"
msgstr "Não foi possível abrir ícone da máquina: %s"
#. Buttons
-#: gui/gdmchooser.c:518
+#: gui/gdmchooser.c:516
msgid "Connect"
msgstr "Conectar"
-#: gui/gdmchooser.c:525
+#: gui/gdmchooser.c:523
msgid "Rescan"
msgstr "Reprocurar"
-#: gui/gdmchooser.c:531
+#: gui/gdmchooser.c:529
msgid "Cancel"
msgstr "Cancelar"
-#: gui/gdmchooser.c:582
+#: gui/gdmchooser.c:580
msgid "gdm_signals_init: Error setting up HUP signal handler"
msgstr "gdm_signals_init: Erro ajustando o tratador do sinal HUP"
-#: gui/gdmchooser.c:585
+#: gui/gdmchooser.c:583
msgid "gdm_signals_init: Error setting up INT signal handler"
msgstr "gdm_signals_init: Erro ajustando o tratador do sinal INT"
-#: gui/gdmchooser.c:588
+#: gui/gdmchooser.c:586
msgid "gdm_signals_init: Error setting up TERM signal handler"
msgstr "gdm_signals_init: Erro ajustando o tratador do sinal TERM"
-#: gui/gdmchooser.c:596 gui/gdmlogin.c:1557
+#: gui/gdmchooser.c:594 gui/gdmlogin.c:1542
msgid "Could not set signal mask!"
msgstr "Não pude ajustar máscara de sinal!"
-#: gui/gdmlogin.c:271
+#: gui/gdmlogin.c:268
msgid "gdm_parse_enriched_string: String too long!"
msgstr "gdm_parse_enriched_string: String muito grande!"
-#: gui/gdmlogin.c:272
+#: gui/gdmlogin.c:269
#, c-format
msgid "Welcome to %s"
msgstr "Bem-vindo a %s"
-#: gui/gdmlogin.c:276
+#: gui/gdmlogin.c:273
msgid "gdm_parse_enriched_string: Could not malloc temporary buffer!"
msgstr ""
"gdm_parse_enriched_string: Não foi possível malloc o buffer temporário!"
-#: gui/gdmlogin.c:358
+#: gui/gdmlogin.c:355
msgid "Are you sure you want to reboot the machine?"
msgstr "Tem certeza que você deseja reinicializar a máquina?"
-#: gui/gdmlogin.c:371
+#: gui/gdmlogin.c:368
msgid "Are you sure you want to halt the machine?"
msgstr "Tem certeza que você deseja suspender a máquina?"
-#: gui/gdmlogin.c:388
+#: gui/gdmlogin.c:385
#, c-format
msgid "gdm_login_parse_config: No configuration file: %s. Aborting."
-msgstr ""
-"gdm_login_parse_config: Nenhum arquivo de configuração: %s. Abortando."
+msgstr "gdm_login_parse_config: Nenhum arquivo de configuração: %s. Abortando."
-#: gui/gdmlogin.c:524
+#: gui/gdmlogin.c:481
#, c-format
msgid ""
"Your preferred session type %s is not installed on this machine.\n"
@@ -645,7 +640,7 @@ msgstr ""
"Seu tipo de sessão preferido %s não está instalado nessa máquina.\n"
"Você deseja que %s seja o padrão para futuras sessões?"
-#: gui/gdmlogin.c:543 gui/gdmlogin.c:573
+#: gui/gdmlogin.c:496 gui/gdmlogin.c:538
#, c-format
msgid ""
"You have chosen %s for this session, but your default setting is %s.\n"
@@ -654,95 +649,112 @@ msgstr ""
"Você escolheu %s para esta sessão, mas sua opção padrão é %s.\n"
"Você deseja que %s seja o padrão para futuras sessões?"
-#: gui/gdmlogin.c:631
+#: gui/gdmlogin.c:597
#, c-format
msgid "%s session selected"
msgstr "Sessão %s selecionada"
-#: gui/gdmlogin.c:647 gui/gdmlogin.c:750
+#: gui/gdmlogin.c:613 gui/gdmlogin.c:716
msgid "Last"
msgstr "Último"
-#: gui/gdmlogin.c:662
+#: gui/gdmlogin.c:628
msgid "gdm_login_session_init: Session script directory not found!"
-msgstr ""
-"gdm_login_session_init: Diretório de scripts de sessão não encontrado!"
+msgstr "gdm_login_session_init: Diretório de scripts de sessão não encontrado!"
-#: gui/gdmlogin.c:715
+#: gui/gdmlogin.c:681
msgid "No session scripts found. Aborting!"
msgstr "Scripts de sessão não encontrados. Abortando!"
-#: gui/gdmlogin.c:719
+#: gui/gdmlogin.c:685
#, c-format
msgid "No default session link found. Using %s.\n"
msgstr "Nenhum vínculo padrão para sessão encontrado. Usando %s.\n"
-#: gui/gdmlogin.c:733
+#: gui/gdmlogin.c:699
#, c-format
msgid "%s language selected"
msgstr "Linguagem %s selecionada"
-#: gui/gdmlogin.c:765
+#: gui/gdmlogin.c:731
msgid "A-M"
msgstr "A-M"
-#: gui/gdmlogin.c:771
+#: gui/gdmlogin.c:737
msgid "N-Z"
msgstr "N-Z"
-#: gui/gdmlogin.c:777
+#: gui/gdmlogin.c:743
msgid "Other"
msgstr "Outros"
-#: gui/gdmlogin.c:1080
+#: gui/gdmlogin.c:1062
msgid "Session"
msgstr "Sessões"
-#: gui/gdmlogin.c:1087
+#: gui/gdmlogin.c:1069
msgid "Language"
msgstr "Idiomas"
-#: gui/gdmlogin.c:1094
+#: gui/gdmlogin.c:1076
msgid "Reboot..."
msgstr "Reinicializar..."
-#: gui/gdmlogin.c:1101
+#: gui/gdmlogin.c:1083
msgid "Halt..."
msgstr "Parar..."
-#: gui/gdmlogin.c:1108
+#: gui/gdmlogin.c:1090
msgid "System"
msgstr "Sistema"
-#: gui/gdmlogin.c:1116
+#: gui/gdmlogin.c:1098
#, c-format
msgid "Can't open icon file: %s. Suspending iconify feature!"
msgstr ""
"Não foi possível abrir o arquivo de ícones: %s. Encerrando a capacidade de "
"iconização!"
-#: gui/gdmlogin.c:1119
+#: gui/gdmlogin.c:1101
msgid "Iconify"
msgstr "Iconizar"
-#: gui/gdmlogin.c:1283
+#: gui/gdmlogin.c:1265
msgid "Please enter your login"
msgstr "Por favor digite seu acesso"
-#: gui/gdmlogin.c:1464
+#: gui/gdmlogin.c:1446
#, c-format
msgid "Can't open DefaultImage: %s. Suspending face browser!"
msgstr ""
"Não é possível abrir DefaultImage: %s. Suspendendo o navegador de faces!"
-#: gui/gdmlogin.c:1543
+#: gui/gdmlogin.c:1528
msgid "main: Error setting up HUP signal handler"
msgstr "main: Erro ajustando o tratador do sinal HUP"
-#: gui/gdmlogin.c:1546
+#: gui/gdmlogin.c:1531
msgid "main: Error setting up INT signal handler"
msgstr "main: Erro ajustando o tratador do sinal INT"
-#: gui/gdmlogin.c:1549
+#: gui/gdmlogin.c:1534
msgid "main: Error setting up TERM signal handler"
msgstr "main: Erro ajustando o tratador do sinal TERM"
+
+#~ msgid ""
+#~ "According to %s, gdm was already running (%d),\n"
+#~ "but seems to have been murdered mysteriously.\n"
+#~ msgstr ""
+#~ "De acordo com %s, o gdm já estava rodando (%d),\n"
+#~ "mas parece que morreu misteriosamente.\n"
+
+#~ msgid "gdm_server_stop: Could not unlink auth file: %s!"
+#~ msgstr ""
+#~ "gdm_auth_secure_display: Não foi possível desvincular o arquivo de "
+#~ "autorização: %s!"
+
+#~ msgid "gdm_server_restart: Error setting up ALARM signal handler"
+#~ msgstr "gdm_server_restart: Erro na configuração do tratador do sinal ALARM"
+
+#~ msgid "gdm_slave_session_init: User '%s' not found. Aborting."
+#~ msgstr "gdm_slave_session_init: Usuário '%s' não encontrado. Abortando."
diff --git a/po/sv.po b/po/sv.po
index 836d4a78..ea8089e9 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: gdm 0.5\n"
-"POT-Creation-Date: 1999-09-24 11:23+0200\n"
+"POT-Creation-Date: 1999-12-27 13:01+0100\n"
"PO-Revision-Date: 1999-09-27 21:20+0200\n"
"Last-Translator: Richard Hult <rhult@hem2.passagen.se>\n"
"Language-Team: Swedish <sv@li.org>\n"
@@ -13,77 +13,79 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8-bit\n"
-#: daemon/gdm.c:166
+#: daemon/gdm.c:169
#, c-format
msgid "gdm_config_parse: No configuration file: %s. Aborting."
msgstr "gdm_config_parse: Ingen konfigurationsfil kunde hittas: %s. Avbryter."
#: daemon/gdm.c:217
-msgid "gdm_config_parse: No greeter specified and default not found."
+#, fuzzy
+msgid "gdm_config_parse: No greeter specified."
msgstr ""
"gdm_config_parse: Ingen hälsare angiven och standardhälsare kunde inte "
"hittas."
-#: daemon/gdm.c:229
-msgid "gdm_config_parse: No authdir specified and default not found."
+#: daemon/gdm.c:220
+#, fuzzy
+msgid "gdm_config_parse: No authdir specified."
msgstr ""
"gdm_config_parse: Ingen authdir angiven och standardauthdir kunde inte "
"hittas."
-#: daemon/gdm.c:247
-msgid ""
-"gdm_config_parse: No sessions directory specified and default not found."
+#: daemon/gdm.c:226
+#, fuzzy
+msgid "gdm_config_parse: No sessions directory specified."
msgstr ""
"gdm_config_parse: Ingen sessions-katalog angiven och standardkatalog kunde "
"inte hittas."
-#: daemon/gdm.c:259
+#: daemon/gdm.c:238
msgid "gdm_config_parse: Invalid server line in config file. Ignoring!"
msgstr "gdm_config_parse: Ogiltig server-rad i konfigurationsfil. Ignorerar!"
-#: daemon/gdm.c:265
+#: daemon/gdm.c:244
msgid ""
"gdm_config_parse: Xdmcp disabled and no local servers defined. Aborting!"
msgstr ""
"gdm_config_parse: Xdmcp avaktiverat och inga lokala servrar är definierade. "
"Avbryter!"
-#: daemon/gdm.c:270
+#: daemon/gdm.c:251
#, c-format
msgid "gdm_config_parse: Can't find the gdm user (%s). Aborting!"
msgstr "gdm_config_parse: Kan inte hitta gdm-användaren (%s). Avbryter!"
-#: daemon/gdm.c:275
+#: daemon/gdm.c:256
msgid "gdm_config_parse: The gdm user should not be root. Aborting!"
msgstr "gdm_config_parse: gdm-användaren ska inte vara root. Avbryter!"
-#: daemon/gdm.c:280
+#: daemon/gdm.c:261
#, c-format
msgid "gdm_config_parse: Can't find the gdm group (%s). Aborting!"
msgstr "gdm_config_parse: Kan inte hitta gdm-gruppen (%s). Avbryter!"
-#: daemon/gdm.c:285
+#: daemon/gdm.c:266
msgid "gdm_config_parse: The gdm group should not be root. Aborting!"
msgstr "gdm_config_parse: gdm-gruppen ska inte vara root. Avbryter!"
-#: daemon/gdm.c:292
+#: daemon/gdm.c:302
#, c-format
msgid "gdm_config_parse: Authdir %s does not exist. Aborting."
msgstr "gdm_config_parse Authdir %s existerar inte. Avbryter."
-#: daemon/gdm.c:295
+#: daemon/gdm.c:305
#, c-format
msgid "gdm_config_parse: Authdir %s is not a directory. Aborting."
msgstr "gdm_config_parse: Authdir %s är inte en katalog. Avbryter."
-#: daemon/gdm.c:298
+#: daemon/gdm.c:308
#, c-format
msgid ""
"gdm_config_parse: Authdir %s is not owned by user %s, group %s. Aborting."
msgstr ""
"gdm_config_parse: Authdir %s ägs inte av användare %s, grupp %s. Avbryter."
-#: daemon/gdm.c:302
+#: daemon/gdm.c:312
#, c-format
msgid ""
"gdm_config_parse: Authdir %s has wrong permissions. Should be 750. Aborting."
@@ -91,527 +93,520 @@ msgstr ""
"gdm_config_parse: Authdir %s har felaktiga rättigheter. Ska vara 750. "
"Avbryter."
-#: daemon/gdm.c:363
+#: daemon/gdm.c:389
#, c-format
msgid "gdm_display_manage: Failed forking gdm slave process for %d"
msgstr "gdm_display_manage: Kunde inte dela gdm-slav-process för %d"
-#: daemon/gdm.c:442
+#: daemon/gdm.c:478
#, c-format
msgid "gdm_child_action: Aborting display %s"
msgstr "gdm_child_action: Avbryter %s"
-#: daemon/gdm.c:447
+#: daemon/gdm.c:483
msgid "gdm_child_action: Master rebooting..."
msgstr "gdm_child_action: Master startar om..."
-#: daemon/gdm.c:453
+#: daemon/gdm.c:489
#, c-format
msgid "gdm_child_action: Reboot failed: %s"
msgstr "gdm_child_action: Kunde inte starta om: %s"
-#: daemon/gdm.c:457
+#: daemon/gdm.c:493
msgid "gdm_child_action: Master halting..."
msgstr "gdm_child_action: Master stannar..."
-#: daemon/gdm.c:463
+#: daemon/gdm.c:499
#, c-format
msgid "gdm_child_action: Halt failed: %s"
msgstr "gdm_child_action: Kunde inte stanna: %s"
-#: daemon/gdm.c:560
+#: daemon/gdm.c:619
msgid "gdm_daemonify: fork() failed!"
msgstr "gdm_daemonify: fork() misslyckades!"
-#: daemon/gdm.c:563
+#: daemon/gdm.c:622
#, c-format
msgid "gdm_daemonify: setsid() failed: %s!"
msgstr "gdm_daemonify: setsid() misslyckades: %s!"
-#. XDM compliant error message
-#: daemon/gdm.c:589
+#: daemon/gdm.c:651
msgid "Only root wants to run x^hgdm\n"
msgstr "Endast root ska köra x^gdm\n"
-#: daemon/gdm.c:610
-msgid ""
-"gdm already running. Aborting!\n"
-"\n"
+#: daemon/gdm.c:672
+#, fuzzy
+msgid "gdm already running. Aborting!"
msgstr ""
"gdm körs redan. Avbryter!\n"
"\n"
-#: daemon/gdm.c:616
-#, c-format
-msgid ""
-"According to %s, gdm was already running (%d),\n"
-"but seems to have been murdered mysteriously.\n"
-msgstr ""
-"Enligt %s, kördes gdm redan (%d),\n"
-"men gdm verkar ha avslutats på nåt konstigt sätt.\n"
-
-#: daemon/gdm.c:638
+#: daemon/gdm.c:693
msgid "gdm_main: Error setting up TERM signal handler"
msgstr "gdm_main: Fel vid installering av TERM signal-hanterare"
-#: daemon/gdm.c:641
+#: daemon/gdm.c:696
msgid "gdm_main: Error setting up INT signal handler"
msgstr "gdm_main: Fel vid installering av TERM signal-hanterare"
-#: daemon/gdm.c:649
+#: daemon/gdm.c:704
msgid "gdm_main: Error setting up CHLD signal handler"
msgstr "gdm_main: Fel vid installering av CHLD signal-hanterare"
#. Really no need to clean up here - this process is a goner anyway
-#: daemon/auth.c:215 daemon/auth.c:240
+#: daemon/auth.c:228 daemon/auth.c:255
#, c-format
msgid "gdm_auth_user_add: Could not open cookie file %s"
msgstr "gdm_auth_secure_display: Kunde inte öppna cookie-fil %s"
-#: daemon/auth.c:229
+#: daemon/auth.c:243
#, c-format
msgid "gdm_auth_user_add: Could not lock cookie file %s"
msgstr "gdm_auth_secure_display: Kunde låsa cookie-fil %s"
-#: daemon/auth.c:300
+#: daemon/auth.c:325
#, c-format
msgid "gdm_auth_user_remove: Ignoring suspiciously looking cookie file %s"
msgstr "gdm_auth_user_remove: Cookie filen %s ser skum ut. Ignorerar den"
-#: daemon/filecheck.c:58
+#: daemon/filecheck.c:51
#, c-format
msgid "%s: Directory %s does not exist."
msgstr "%s: Katalogen %s finns inte."
-#: daemon/filecheck.c:64 daemon/filecheck.c:105
+#: daemon/filecheck.c:57 daemon/filecheck.c:98
#, c-format
msgid "%s: %s is not owned by uid %d."
msgstr "%s: %s ägs inte av uid %d."
-#: daemon/filecheck.c:70 daemon/filecheck.c:112
+#: daemon/filecheck.c:63 daemon/filecheck.c:105
#, c-format
msgid "%s: %s is writable by group."
msgstr "%s: %s kan skrivas av grupp/annan."
-#: daemon/filecheck.c:76
+#: daemon/filecheck.c:69
#, c-format
msgid "%s: %s is writable by other."
msgstr "%s: %s kan skrivas av grupp/annan."
-#: daemon/filecheck.c:90
+#: daemon/filecheck.c:83
#, c-format
msgid "%s: does not exist and must."
msgstr "%s: finns inte, vilket den måste göra."
-#: daemon/filecheck.c:98
+#: daemon/filecheck.c:91
#, c-format
msgid "%s: %s is not a regular file."
msgstr "%s: %s är inte en vanlig fil."
-#: daemon/filecheck.c:119
+#: daemon/filecheck.c:112
#, c-format
msgid "%s: %s is writable by group/other."
msgstr "%s: %s kan skrivas av grupp/annan."
-#: daemon/filecheck.c:126
+#: daemon/filecheck.c:119
#, c-format
msgid "%s: %s is bigger than sysadmin specified maximum file size."
msgstr ""
"%s: %s är större än den av sysadmin specificerade maximala filstorleken. "
-#: daemon/misc.c:128
-#, c-format
-msgid "gdm_exec_script: Failed starting: %s"
-msgstr "gdm_exec_script: Fel vid start av: %s"
-
-#: daemon/misc.c:132
-msgid "gdm_exec_script: Can't fork script process!"
-msgstr "gdm_exec_script: Kan inte dela script-process"
-
-#: daemon/server.c:84 daemon/server.c:208
+#: daemon/server.c:95
msgid "gdm_server_start: Error setting up USR1 signal handler"
msgstr "gdm_server_start: Fel vid installering av USR1 signal-hanterare"
-#: daemon/server.c:101
-#, c-format
-msgid "gdm_server_start: Could not open logfile for display %s!"
+#: daemon/server.c:179
+#, fuzzy
+msgid "gdm_server_start: Error setting up CHLD signal handler"
+msgstr "gdm_server_start: Fel vid installering av USR1 signal-hanterare"
+
+#: daemon/server.c:196
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Could not open logfile for display %s!"
msgstr "gdm_server_start: Kan inte öppna logg-fil för %s!"
-#: daemon/server.c:130
-msgid "gdm_server_start: Error setting USR1 to SIG_IGN"
+#: daemon/server.c:221
+#, fuzzy
+msgid "gdm_server_spawn: Error setting USR1 to SIG_IGN"
msgstr "gdm_server_start: Kunde inte sätta USR1 till SIG_IGNORE"
-#: daemon/server.c:147
-#, c-format
-msgid "gdm_server_start: Xserver not found: %s"
+#: daemon/server.c:237
+#, fuzzy, c-format
+msgid "gdm_server_spawn: Xserver not found: %s"
msgstr "gdm_server_start: Xserver kan inte hittas: %s"
-#: daemon/server.c:153
-msgid "gdm_server_start: Can't fork Xserver process!"
+#: daemon/server.c:242
+#, fuzzy
+msgid "gdm_server_spawn: Can't fork Xserver process!"
msgstr "gdm_server_start: Kan inte dela script-process"
-#: daemon/server.c:179
-#, c-format
-msgid "gdm_server_stop: Could not unlink auth file: %s!"
-msgstr "gdm_server_stop: Kunde inte avlänka %s fil: %s!"
-
-#: daemon/server.c:234
-msgid "gdm_server_restart: Error setting up ALARM signal handler"
-msgstr "gdm_server_restart: Fel vid installering av ALARM-signalhanterare"
-
-#: daemon/slave.c:120
+#: daemon/slave.c:115
msgid "gdm_slave_init: Error setting up TERM/INT signal handler"
msgstr "gdm_slave_init: Fel vid installering av TERM/INT signal-hanterare"
-#: daemon/slave.c:128
+#: daemon/slave.c:123
msgid "gdm_slave_init: Error setting up CHLD signal handler"
msgstr "gdm_slave_init: Fel vid installering av CHLD signal-hanterare"
-#: daemon/slave.c:179
+#: daemon/slave.c:172
msgid "gdm_slave_greeter: Can't init pipe to gdmgreeter"
msgstr "gdm_slave_greeter: Kan inte sätta upp pipe till gdmgreeter"
-#: daemon/slave.c:204
+#: daemon/slave.c:197
#, c-format
msgid "gdm_slave_greeter: Couldn't set groupid to %d"
msgstr "gdm_slave_greeter: Kan inte sätta gruppid till %d"
-#: daemon/slave.c:207
+#: daemon/slave.c:200
#, c-format
msgid "gdm_slave_greeter: Couldn't set userid to %d"
msgstr "gdm_slave_greeter: Kan inte sätta användarid till %d"
-#: daemon/slave.c:217
+#: daemon/slave.c:210
#, c-format
msgid "gdm_slave_greeter: Error starting greeter on display %s"
msgstr "gdm_slave_greeter: Fel vid start av hälsare på %s"
-#: daemon/slave.c:220
+#: daemon/slave.c:213
msgid "gdm_slave_greeter: Can't fork gdmgreeter process"
msgstr "gdm_slave_greeter: Kan inte dela gdmgreeter-process"
-#: daemon/slave.c:298
+#: daemon/slave.c:262
#, c-format
-msgid "gdm_slave_session_init: User '%s' not found. Aborting."
-msgstr "gdm_slave_session_init: Användare '%s' kund inte hittas. Avbryter."
+msgid "gdm_slave_session_start: User passed auth but getpwnam(%s) failed!"
+msgstr ""
-#: daemon/slave.c:323
+#: daemon/slave.c:351
+#, fuzzy
msgid ""
-"gdm_slave_session_init: Execution of PreSession script returned > 0. "
+"gdm_slave_session_start: Execution of PreSession script returned > 0. "
"Aborting."
msgstr ""
"gdm_slave_session_init: Körning av PreSession-script returnerade > 0. "
"Avbryter."
-#: daemon/slave.c:347
-msgid "gdm_slave_session_init: Error forking user session"
+#: daemon/slave.c:375
+#, fuzzy
+msgid "gdm_slave_session_start: Error forking user session"
msgstr "gdm_slave_session_init: Fel vid delning av användarsession"
-#: daemon/slave.c:355
-#, c-format
-msgid "gdm_slave_session_init: Could not setgid %d. Aborting."
+#: daemon/slave.c:384
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not setgid %d. Aborting."
msgstr "gdm_slave_session_init: Kunde inte setgid %d. Avbryter."
-#: daemon/slave.c:358
-#, c-format
-msgid "gdm_slave_session_init: initgroups() failed for %s. Aborting."
+#: daemon/slave.c:388
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: initgroups() failed for %s. Aborting."
msgstr "gdm_slave_session_init: initgroups() misslyckades för %s. Avbryter."
-#: daemon/slave.c:361
-#, c-format
-msgid "gdm_slave_session_init: Could not become %s. Aborting."
+#: daemon/slave.c:392
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not become %s. Aborting."
msgstr "gdm_slave_session_init: Kunde inte bli %s. Avbryter."
-#: daemon/slave.c:403
-#, c-format
-msgid "gdm_slave_session_init: Could not start session `%s'"
+#: daemon/slave.c:428
+#, fuzzy, c-format
+msgid "gdm_slave_session_start: Could not start session `%s'"
msgstr "gdm_slave_session_init: Kunde inte starta session '%s'"
-#: daemon/slave.c:578
+#: daemon/slave.c:609
#, c-format
msgid "gdm_slave_windows_kill_ioerror_handler: Fatal X error - Restarting %s"
msgstr ""
"gdm_slave_windows_kill_ioerror_handler: Ödesdigert X-fel - Startar om %s"
-#: daemon/slave.c:610
+#: daemon/slave.c:641
msgid "gdm_slave_xsync_ping: Error setting up ALARM signal handler"
msgstr "gdm_slave_xsync_ping: Fel vid installering av ALARM-signalhanterare"
-#: daemon/verify.c:129 daemon/verify.c:201 gui/gdmlogin.c:1248
+#: daemon/slave.c:743
+#, fuzzy, c-format
+msgid "gdm_slave_exec_script: Failed starting: %s"
+msgstr "gdm_exec_script: Fel vid start av: %s"
+
+#: daemon/slave.c:747
+#, fuzzy
+msgid "gdm_slave_exec_script: Can't fork script process!"
+msgstr "gdm_exec_script: Kan inte dela script-process"
+
+#. Ask gdmgreeter for the user's login. Just for good measure
+#: daemon/verify-crypt.c:58 daemon/verify-pam.c:123 daemon/verify-shadow.c:60
+#: gui/gdmlogin.c:1230
msgid "Login:"
msgstr "Användarnamn:"
-#: daemon/verify.c:135
+#: daemon/verify-pam.c:130
msgid "Can't find /etc/pam.d/gdm!"
msgstr "Kan inte hitta /etc/pam.d/gdm!"
-#: daemon/verify.c:140
+#: daemon/verify-pam.c:136
#, c-format
msgid "Can't set PAM_TTY=%s"
msgstr "Kan inte ändra PAM_TTY till %s"
-#: daemon/verify.c:145 daemon/verify.c:222
+#: daemon/verify-crypt.c:71 daemon/verify-pam.c:142 daemon/verify-shadow.c:81
#, c-format
msgid "Couldn't authenticate %s"
msgstr "Kan inte verifiera %s"
-#: daemon/verify.c:150
+#: daemon/verify-pam.c:153
#, c-format
msgid "Couldn't set acct. mgmt for %s"
msgstr "Kan inte sätta kontohantering för %s"
-#: daemon/verify.c:155
+#: daemon/verify-pam.c:159
#, c-format
msgid "Couldn't set credentials for %s"
msgstr "Kan inte sätta rättigheter för %s"
-#: daemon/verify.c:160
+#: daemon/verify-pam.c:165
#, c-format
msgid "Couldn't open session for %s"
msgstr "Kan inte öppna session för %s"
-#: daemon/verify.c:217
+#: daemon/verify-pam.c:232
+msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
+msgstr "gdm_verify_check: Kan ej hitta PAM-konfigurationsfil för gdm"
+
+#. Request the user's password
+#: daemon/verify-crypt.c:64 daemon/verify-shadow.c:74
msgid "Password:"
msgstr "Lösenord:"
-#: daemon/verify.c:223
+#: daemon/verify-crypt.c:72 daemon/verify-shadow.c:82
msgid "User unknown"
msgstr "Användaren är okänd"
-#: daemon/verify.c:228
+#: daemon/verify-crypt.c:77 daemon/verify-shadow.c:87
#, c-format
msgid "Root login disallowed on display '%s'"
msgstr "Root får inte logga in på '%s'"
-#: daemon/verify.c:229
+#: daemon/verify-crypt.c:78 daemon/verify-shadow.c:88
msgid "Root login disallowed"
msgstr "Root får inte logga in"
-#: daemon/verify.c:237
+#: daemon/verify-crypt.c:87 daemon/verify-shadow.c:97
msgid "Incorrect password"
msgstr "Ogiltigt lösenord"
-#: daemon/verify.c:256
-msgid "gdm_verify_check: Can't find PAM configuration file for gdm"
-msgstr "gdm_verify_check: Kan ej hitta PAM-konfigurationsfil för gdm"
-
-#: daemon/xdmcp.c:184
+#: daemon/xdmcp.c:178
#, c-format
msgid "gdm_xdmcp_init: Could not get server hostname: %s!"
msgstr "gdm_xdmcp_init: Kan inte hitta server-namn: %s!"
-#: daemon/xdmcp.c:198
+#: daemon/xdmcp.c:192
msgid "gdm_xdmcp_init: Could not create socket!"
msgstr "gdm_xdmcp_init: Kan inte skapa socket!"
-#: daemon/xdmcp.c:205
+#: daemon/xdmcp.c:199
msgid "gdm_xdmcp_init: Could not bind to XDMCP socket!"
msgstr "gdm_xdmcp_init: Kan inte binda till XDMCP-socket!"
-#: daemon/xdmcp.c:214
+#: daemon/xdmcp.c:208
msgid "gdm_xdmcp_init: Can't alloc fifopath"
msgstr "gdm_xdmcp_init: Kan inte allokera fifo-katalog!"
-#: daemon/xdmcp.c:219
+#: daemon/xdmcp.c:213
msgid "gdm_xdmcp_init: Could not make FIFO for chooser"
msgstr "gdm_xdmcp_init: Kan inte skapa FIFO för väljare!"
-#: daemon/xdmcp.c:224
+#: daemon/xdmcp.c:218
msgid "gdm_xdmcp_init: Could not open FIFO for chooser"
msgstr "gdm_xdmcp_init: Kan inte öppna FIFO för väljare"
-#: daemon/xdmcp.c:284
+#: daemon/xdmcp.c:278
msgid "gdm_xdmcp_decode: Could not create XDMCP buffer!"
msgstr "gdm_xdmcp_decode: Kan inte skapa XDMCP-buffer"
-#: daemon/xdmcp.c:289
+#: daemon/xdmcp.c:283
msgid "gdm_xdmcp_decode: Could not read XDMCP header!"
msgstr "gdm_xdmcp_decode: Kan inte läsa XDMCP-header!"
-#: daemon/xdmcp.c:294
+#: daemon/xdmcp.c:288
msgid "gdm_xdmcp_decode: Incorrect XDMCP version!"
msgstr "gdm_xdmcp_decode: Ogiltig XDMCP-version!"
-#: daemon/xdmcp.c:333
+#: daemon/xdmcp.c:328
#, c-format
msgid "gdm_xdmcp_decode_packet: Unknown opcode from host %s"
msgstr "gdm_xdmcp_decode_packet: Okänd opcode från värd %s"
-#: daemon/xdmcp.c:351
+#: daemon/xdmcp.c:346
msgid "gdm_xdmcp_handle_query: Could not extract authlist from packet"
msgstr "gdm_xdmcp_handle_query: Kunde inte läsa verifieringslista från packet"
-#: daemon/xdmcp.c:362
+#: daemon/xdmcp.c:357
msgid "gdm_xdmcp_handle_query: Error in checksum"
msgstr "gdm_xdmcp_handle_query: Checksumme-fel"
-#: daemon/xdmcp.c:433
+#: daemon/xdmcp.c:428
msgid "gdm_xdmcp_handle_forward_query: Could not read display address"
msgstr "gdm_xdmcp_handle_forward_query: Kan inte läsa display-adress"
-#: daemon/xdmcp.c:439
+#: daemon/xdmcp.c:434
msgid "gdm_xdmcp_handle_forward_query: Could not read display port number"
msgstr "gdm_xdmcp_handle_forward_query: Kan inte läsa display-port-nummer"
-#: daemon/xdmcp.c:445
+#: daemon/xdmcp.c:440
msgid "gdm_xdmcp_handle_forward_query: Could not extract authlist from packet"
msgstr ""
"gdm_xdmcp_handle_forward_query: Kunde inte läsa inloggningslista från packet"
-#: daemon/xdmcp.c:460
+#: daemon/xdmcp.c:455
msgid "gdm_xdmcp_handle_forward_query: Error in checksum"
msgstr "gdm_xdmcp_handle_forward_query: Checksumme-fel"
-#: daemon/xdmcp.c:523
+#: daemon/xdmcp.c:518
#, c-format
msgid "Denied XDMCP query from host %s"
msgstr "Nekade XDMCP-förfrågan från värd %s"
-#: daemon/xdmcp.c:525
+#: daemon/xdmcp.c:520
msgid "Display not authorized to connect"
msgstr "Display:en har inte anslutnings-rättigheter"
-#: daemon/xdmcp.c:558
+#: daemon/xdmcp.c:553
#, c-format
msgid "gdm_xdmcp_handle_request: Got REQUEST from banned host %s"
msgstr "gdm_xdmcp_handle_request: Fick REQUEST från utestängd värd %s"
-#: daemon/xdmcp.c:565
+#: daemon/xdmcp.c:560
msgid "gdm_xdmcp_handle_request: Could not read Display Number"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa display-nummer"
-#: daemon/xdmcp.c:571
+#: daemon/xdmcp.c:566
msgid "gdm_xdmcp_handle_request: Could not read Connection Type"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa anslutnings-typ"
-#: daemon/xdmcp.c:577
+#: daemon/xdmcp.c:572
msgid "gdm_xdmcp_handle_request: Could not read Client Address"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa klient-adress"
-#: daemon/xdmcp.c:583
+#: daemon/xdmcp.c:578
msgid "gdm_xdmcp_handle_request: Could not read Authentication Names"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa verifieringsnamn"
-#: daemon/xdmcp.c:589
+#: daemon/xdmcp.c:584
msgid "gdm_xdmcp_handle_request: Could not read Authentication Data"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa verifieringsdata"
-#: daemon/xdmcp.c:595
+#: daemon/xdmcp.c:590
msgid "gdm_xdmcp_handle_request: Could not read Authorization List"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa verifieringslistsa"
-#: daemon/xdmcp.c:606
+#: daemon/xdmcp.c:601
msgid "gdm_xdmcp_handle_request: Could not read Manufacturer ID"
msgstr "gdm_xdmcp_handle_request: Kan inte läsa tillverkar-ID"
-#: daemon/xdmcp.c:624
+#: daemon/xdmcp.c:619
#, c-format
msgid "gdm_xdmcp_handle_request: Failed checksum from %s"
msgstr "gdm_xdmcp_handle_request: Ogiltig checksumma från %s"
-#: daemon/xdmcp.c:737
+#: daemon/xdmcp.c:732
#, c-format
msgid "gdm_xdmcp_handle_manage: Got Manage from banned host %s"
msgstr "gdm_xdmcp_handle_mange: Fick MANAGE från utestängd värd %s"
-#: daemon/xdmcp.c:744
+#: daemon/xdmcp.c:739
msgid "gdm_xdmcp_handle_manage: Could not read Session ID"
msgstr "gdm_xdmcp_handle_manage: Kan inte läsa sessions-ID"
-#: daemon/xdmcp.c:750
+#: daemon/xdmcp.c:745
msgid "gdm_xdmcp_handle_manage: Could not read Display Number"
msgstr "gdm_xdmcp_handle_manage: Kan inte läsa display-nummer"
-#: daemon/xdmcp.c:759
+#: daemon/xdmcp.c:754
msgid "gdm_xdmcp_manage: Could not read Display Class"
msgstr "gdm_xdmcp_manage: Kan inte läsa display-klass"
-#: daemon/xdmcp.c:780
+#: daemon/xdmcp.c:775
#, c-format
msgid "gdm_xdmcp_handle_manage: Could not open logfile for display %s!"
msgstr "gdm_xdmcp_handle_manage: Kan inte öppna logg-fil för %s!"
-#: daemon/xdmcp.c:852
+#: daemon/xdmcp.c:847
#, c-format
msgid "gdm_xdmcp_handle_keepalive: Got KEEPALIVE from banned host %s"
msgstr "gdm_xdmcp_handle_keepalive: Fick KEEPALIVE från utestängd värd %s"
-#: daemon/xdmcp.c:859
+#: daemon/xdmcp.c:854
msgid "gdm_xdmcp_handle_keepalive: Could not read Display Number"
msgstr "gdm_xdmcp_handle_keepalive: Kan inte läsa display-nummer"
-#: daemon/xdmcp.c:865
+#: daemon/xdmcp.c:860
msgid "gdm_xdmcp_handle_keepalive: Could not read Session ID"
msgstr "gdm_xdmcp_handle_keepalive: Kan inte läsa sessions-id"
-#: gui/gdmchooser.c:342
+#: gui/gdmchooser.c:340
#, c-format
msgid "gdm_chooser_parse_config: No configuration file: %s. Aborting."
msgstr ""
"gdm_chooser_parse_config: Konfigurationsfil kunde inte hittas: %s. Avbryter."
-#: gui/gdmchooser.c:451
+#: gui/gdmchooser.c:449
#, c-format
msgid "Can't open default host icon: %s"
msgstr "Kan inte standard-ikon för %s"
#. Buttons
-#: gui/gdmchooser.c:518
+#: gui/gdmchooser.c:516
msgid "Connect"
msgstr "Anslut"
-#: gui/gdmchooser.c:525
+#: gui/gdmchooser.c:523
msgid "Rescan"
msgstr "Uppdatera"
-#: gui/gdmchooser.c:531
+#: gui/gdmchooser.c:529
msgid "Cancel"
msgstr "Avbryt"
-#: gui/gdmchooser.c:582
+#: gui/gdmchooser.c:580
msgid "gdm_signals_init: Error setting up HUP signal handler"
msgstr "gdm_signals_init: Fel vid installering av HUP signal-hanterare"
-#: gui/gdmchooser.c:585
+#: gui/gdmchooser.c:583
msgid "gdm_signals_init: Error setting up INT signal handler"
msgstr "gdm_signals_init: Fel vid installering av INT signal-hanterare"
-#: gui/gdmchooser.c:588
+#: gui/gdmchooser.c:586
msgid "gdm_signals_init: Error setting up TERM signal handler"
msgstr "gdm_signals_init: Fel vid installering av TERM signal-hanterare"
-#: gui/gdmchooser.c:596 gui/gdmlogin.c:1557
+#: gui/gdmchooser.c:594 gui/gdmlogin.c:1542
msgid "Could not set signal mask!"
msgstr "Kan inte sätta signalmask!"
-#: gui/gdmlogin.c:271
+#: gui/gdmlogin.c:268
msgid "gdm_parse_enriched_string: String too long!"
msgstr "gdm_parse_enriched_string: Strängen är för long!"
-#: gui/gdmlogin.c:272
+#: gui/gdmlogin.c:269
#, c-format
msgid "Welcome to %s"
msgstr "Välkommen till %s"
-#: gui/gdmlogin.c:276
+#: gui/gdmlogin.c:273
msgid "gdm_parse_enriched_string: Could not malloc temporary buffer!"
msgstr "gdm_parse_enriched_string: Kunde inte allokera temporär buffert!"
-#: gui/gdmlogin.c:358
+#: gui/gdmlogin.c:355
msgid "Are you sure you want to reboot the machine?"
msgstr "Vill du verkligen starta om datorn?"
-#: gui/gdmlogin.c:371
+#: gui/gdmlogin.c:368
msgid "Are you sure you want to halt the machine?"
msgstr "Vill du verkligen stanna datorn?"
-#: gui/gdmlogin.c:388
+#: gui/gdmlogin.c:385
#, c-format
msgid "gdm_login_parse_config: No configuration file: %s. Aborting."
msgstr ""
"gdm_login_parse_config: Konfigurationsfil kunde inte hittas: %s. Avbryter."
-#: gui/gdmlogin.c:524
+#: gui/gdmlogin.c:481
#, c-format
msgid ""
"Your preferred session type %s is not installed on this machine.\n"
@@ -620,7 +615,7 @@ msgstr ""
"Din föregående sessionstyp %s finns inte installerad på datorn.\n"
"Vill du ändra så att %s blir standard för framtida sessioner?"
-#: gui/gdmlogin.c:543 gui/gdmlogin.c:573
+#: gui/gdmlogin.c:496 gui/gdmlogin.c:538
#, c-format
msgid ""
"You have chosen %s for this session, but your default setting is %s.\n"
@@ -629,92 +624,107 @@ msgstr ""
"Du har valt %s för aktuell session, men ditt standardalternativ är %s.\n"
"Vill du ändra så att %s blir standard för framtida sessioner?"
-#: gui/gdmlogin.c:631
+#: gui/gdmlogin.c:597
#, c-format
msgid "%s session selected"
msgstr "Sessionen %s är vald"
-#: gui/gdmlogin.c:647 gui/gdmlogin.c:750
+#: gui/gdmlogin.c:613 gui/gdmlogin.c:716
msgid "Last"
msgstr "Sista"
-#: gui/gdmlogin.c:662
+#: gui/gdmlogin.c:628
msgid "gdm_login_session_init: Session script directory not found!"
msgstr "gdm_login_session_init: Kunde inte hitta script-katalog för sessioner!"
-#: gui/gdmlogin.c:715
+#: gui/gdmlogin.c:681
msgid "No session scripts found. Aborting!"
msgstr "Inga sessions-skript kunde hittas. Avbryter!"
-#: gui/gdmlogin.c:719
+#: gui/gdmlogin.c:685
#, c-format
msgid "No default session link found. Using %s.\n"
msgstr "Ingen länk för standard-session kunde hittas. Använder %s.\n"
-#: gui/gdmlogin.c:733
+#: gui/gdmlogin.c:699
#, c-format
msgid "%s language selected"
msgstr "Språket %s är valt"
-#: gui/gdmlogin.c:765
+#: gui/gdmlogin.c:731
msgid "A-M"
msgstr "A-M"
-#: gui/gdmlogin.c:771
+#: gui/gdmlogin.c:737
msgid "N-Z"
msgstr "N-Z"
-#: gui/gdmlogin.c:777
+#: gui/gdmlogin.c:743
msgid "Other"
msgstr "Annat"
-#: gui/gdmlogin.c:1080
+#: gui/gdmlogin.c:1062
msgid "Session"
msgstr "Sessioner"
-#: gui/gdmlogin.c:1087
+#: gui/gdmlogin.c:1069
msgid "Language"
msgstr "Språk"
-#: gui/gdmlogin.c:1094
+#: gui/gdmlogin.c:1076
msgid "Reboot..."
msgstr "Starta om..."
-#: gui/gdmlogin.c:1101
+#: gui/gdmlogin.c:1083
msgid "Halt..."
msgstr "Stanna..."
-#: gui/gdmlogin.c:1108
+#: gui/gdmlogin.c:1090
msgid "System"
msgstr "System"
-#: gui/gdmlogin.c:1116
+#: gui/gdmlogin.c:1098
#, c-format
msgid "Can't open icon file: %s. Suspending iconify feature!"
msgstr "Kan inte öppna ikon-fil: %s. Avaktiverar minimerafunktion"
-#: gui/gdmlogin.c:1119
+#: gui/gdmlogin.c:1101
msgid "Iconify"
msgstr "Minimera"
-#: gui/gdmlogin.c:1283
+#: gui/gdmlogin.c:1265
msgid "Please enter your login"
msgstr "Ange ditt användarnamn"
-#: gui/gdmlogin.c:1464
+#: gui/gdmlogin.c:1446
#, c-format
msgid "Can't open DefaultImage: %s. Suspending face browser!"
msgstr "Kan inte öppna DefaultImage: %s. Avaktiverar bildbläddrare"
-#: gui/gdmlogin.c:1543
+#: gui/gdmlogin.c:1528
msgid "main: Error setting up HUP signal handler"
msgstr "main: Fel vid installering av HUP signalhanterare"
-#: gui/gdmlogin.c:1546
+#: gui/gdmlogin.c:1531
msgid "main: Error setting up INT signal handler"
msgstr "main: Fel vid installering av INT signalhanterare"
-#: gui/gdmlogin.c:1549
+#: gui/gdmlogin.c:1534
msgid "main: Error setting up TERM signal handler"
msgstr "main: Fel vid installering av TERM signalhanterare"
+#~ msgid ""
+#~ "According to %s, gdm was already running (%d),\n"
+#~ "but seems to have been murdered mysteriously.\n"
+#~ msgstr ""
+#~ "Enligt %s, kördes gdm redan (%d),\n"
+#~ "men gdm verkar ha avslutats på nåt konstigt sätt.\n"
+
+#~ msgid "gdm_server_stop: Could not unlink auth file: %s!"
+#~ msgstr "gdm_server_stop: Kunde inte avlänka %s fil: %s!"
+
+#~ msgid "gdm_server_restart: Error setting up ALARM signal handler"
+#~ msgstr "gdm_server_restart: Fel vid installering av ALARM-signalhanterare"
+
+#~ msgid "gdm_slave_session_init: User '%s' not found. Aborting."
+#~ msgstr "gdm_slave_session_init: Användare '%s' kund inte hittas. Avbryter."