diff options
author | 9 <mkp@mkp.net> | 1999-12-29 21:06:27 +0000 |
---|---|---|
committer | Martin Peterson <mkp@src.gnome.org> | 1999-12-29 21:06:27 +0000 |
commit | dd1777839a7c07d2f168b1a3163dae2f6c898d42 (patch) | |
tree | c47e9f1500822f34947510bbb302510f7d229e90 | |
parent | b9dcc8c3c357b613fde6c9ad5983d136c5380976 (diff) | |
download | gdm-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.
40 files changed, 2664 insertions, 1906 deletions
@@ -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. @@ -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 @@ -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" @@ -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." @@ -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." |