diff options
author | 1 <mkp@mkp.net> | 1999-08-11 22:46:07 +0000 |
---|---|---|
committer | Martin Peterson <mkp@src.gnome.org> | 1999-08-11 22:46:07 +0000 |
commit | 05e9b4862f94181d3ceb456e7ec6dc77c0b1c23f (patch) | |
tree | 07a67e40fbe2d895ef8a9947dc4679a7809378a6 /gui | |
parent | c8f25c94e4c3e63fcb8a84e497587c0e3e3607fa (diff) | |
download | gdm-05e9b4862f94181d3ceb456e7ec6dc77c0b1c23f.tar.gz |
Nailed down the bug that has been haunting me the past couple of days. gdm
1999-08-11 <mkp@mkp.net>
* daemon/auth.c: Nailed down the bug that has been haunting me the
past couple of days. gdm no longer corrupts ~user/.Xauthority if
it contains ``foreign'' cookies.
1999-08-08 <mkp@mkp.net>
Finally merged the Ottawa megapatch:
* daemon/auth.c: Real XAuth implementation. Doesn't rely on
/usr/bin/X11/xauth anymore.
* gui/gdmlogin.c: Implemented browser functionality.
* gui/gdmconfig.c: First shot at a graphical configuration tool.
* gui/gdmface.c: Face selector capplet.
1999-08-07 <mkp@mkp.net>
* Replaced gdm_putenv() with calls to setenv() as putenv() is
broken by specification.
1999-08-02 <mkp@mkp.net>
* md5.c, md5.h, cookie.c: Fixed MD5 endianness problem (Reported
by <gewrgiou@imbc.gr>, bugzilla 3898).
Diffstat (limited to 'gui')
-rw-r--r-- | gui/Makefile.am | 9 | ||||
-rw-r--r-- | gui/gdmchooser.c | 577 | ||||
-rw-r--r-- | gui/gdmlogin.c | 1636 |
3 files changed, 1305 insertions, 917 deletions
diff --git a/gui/Makefile.am b/gui/Makefile.am index 4a226477..1e96a2ce 100644 --- a/gui/Makefile.am +++ b/gui/Makefile.am @@ -10,15 +10,20 @@ INCLUDES = -I. -I.. -I$(top_srcdir)/daemon -I$(includedir) \ -DLOCALEDIR=\"$(datadir)/locale\" \ $(GNOME_INCLUDEDIR) -bin_PROGRAMS = gdmchooser gdmlogin +bin_PROGRAMS = gdmchooser gdmlogin gdmconfig gdmchooser_SOURCES = \ gdmchooser.c \ gdmchooser.h gdmlogin_SOURCES = \ - gdmlogin.c + gdmlogin.c \ + gdmlogin.h + +gdmconfig_SOURCES = \ + gdmconfig.c gdmchooser_LDADD = $(GNOME_LIBDIR) $(GNOME_LIBS) $(GNOMEUI_LIBS) -lXdmcp -lX11 $(INTLLIBS) gdmlogin_LDADD = ../daemon/filecheck.o $(GNOME_LIBDIR) $(GNOME_LIBS) $(GNOMEUI_LIBS) $(INTLLIBS) +gdmconfig_LDADD = $(GNOME_LIBDIR) $(GNOME_LIBS) $(GNOMEUI_LIBS) $(INTLLIBS) diff --git a/gui/gdmchooser.c b/gui/gdmchooser.c index f31a7a86..949e0c89 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@SunSITE.auc.dk> + * Copyright (C) 1998, 1999 Martin Kasper 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,22 +16,22 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* 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. + */ + #include <config.h> #include <gnome.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h> -#include <sys/stat.h> #include <unistd.h> -#include <X11/Xlib.h> +#include <gdk/gdkx.h> #include <X11/Xmd.h> #include <X11/Xdmcp.h> -#include <gdk/gdkx.h> -#include <gdk/gdkkeysyms.h> -#include <pwd.h> #include <syslog.h> -#include <ctype.h> #include <signal.h> #include <sys/socket.h> #include <netinet/in.h> @@ -44,16 +44,18 @@ #include <net/if.h> #include "gdmchooser.h" +#include "gdm.h" static const gchar RCSid[]="$Id$"; -static void gdm_chooser_decode_packet(void); static GdmChooserHost *gdm_chooser_host_alloc (gchar *hostname, gchar *description); -static void gdm_chooser_abort(const gchar *format, ...); -static void gdm_chooser_browser_update(void); -static void gdm_chooser_xdmcp_init(void); -static void gdm_chooser_host_dispose(GdmChooserHost *host); +static void gdm_chooser_decode_packet (void); +static void gdm_chooser_abort (const gchar *format, ...); +static void gdm_chooser_browser_update (void); +static void gdm_chooser_xdmcp_init (void); +static void gdm_chooser_host_dispose (GdmChooserHost *host); +/* Fixetyfix */ int XdmcpReallocARRAY8 (ARRAY8Ptr array, int length); @@ -68,204 +70,204 @@ static XdmAuthRec authlist = { }; -gint sockfd; +static gint sockfd; static XdmcpBuffer querybuf; -GSList *bcaddr; - -gint GdmIconMaxHeight; -gint GdmIconMaxWidth; -gint GdmDebug; -gint GdmRescanTime; -gint GdmDeadTime; -gchar *GdmHostIconDir; -gchar *GdmHostDefaultIcon; -gchar *GdmGtkRC; - -GtkWidget *chooser; -GtkWidget *manage; -GtkWidget *rescan; -GtkWidget *cancel; - -gint maxwidth=0; -guint tid; -GIOChannel *channel; - -GList *hosts=NULL; -GdkImlibImage *nohostimg; -GnomeIconList *browser; - -GdmChooserHost *curhost; +static GSList *bcaddr; + +static gint GdmIconMaxHeight; +static gint GdmIconMaxWidth; +static gint GdmDebug; +static gint GdmScanTime; +static gchar *GdmHostIconDir; +static gchar *GdmHostDefaultIcon; +static gchar *GdmGtkRC; + +static GtkWidget *chooser; +static GtkWidget *manage; +static GtkWidget *rescan; +static GtkWidget *cancel; + +static gint maxwidth = 0; +static guint tid = 0; +static GIOChannel *channel; +static GList *hosts = NULL; +static GdkImlibImage *defhostimg; +static GnomeIconList *browser; +static GdmChooserHost *curhost; static gint gdm_chooser_sort_func(gpointer d1, gpointer d2) { - GdmChooserHost *a=d1; - GdmChooserHost *b=d2; + GdmChooserHost *a = d1; + GdmChooserHost *b = d2; + + if (!d1 || !d2) + return (0); - return strcmp(a->name, b->name); + return (strcmp (a->name, b->name)); } static void -gdm_chooser_decode_packet(void) +gdm_chooser_decode_packet (void) { struct sockaddr_in clnt_sa; - gint sa_len=sizeof(clnt_sa); + gint sa_len = sizeof (clnt_sa); static XdmcpBuffer buf; XdmcpHeader header; struct hostent *he; - gchar *hostname, *status=NULL; + gchar *hostname = NULL; + gchar *status = NULL; ARRAY8 auth, host, stat; - if(!XdmcpFill(sockfd, &buf, &clnt_sa, &sa_len)) + if (! XdmcpFill (sockfd, &buf, &clnt_sa, &sa_len)) return; - if(!XdmcpReadHeader(&buf, &header)) + if (! XdmcpReadHeader (&buf, &header)) return; - if(header.version != XDM_PROTOCOL_VERSION) + if (header.version != XDM_PROTOCOL_VERSION) return; - if(header.opcode == WILLING) { - if(!XdmcpReadARRAY8(&buf, &auth)) + if (header.opcode == WILLING) { + + if (! XdmcpReadARRAY8 (&buf, &auth)) goto done; - if(!XdmcpReadARRAY8(&buf, &host)) + if (! XdmcpReadARRAY8 (&buf, &host)) goto done; - if(!XdmcpReadARRAY8(&buf, &stat)) + if (! XdmcpReadARRAY8 (&buf, &stat)) goto done; - status=g_strndup(stat.data, stat.length); + status = g_strndup (stat.data, stat.length); - he=gethostbyaddr((gchar *) &clnt_sa.sin_addr, - sizeof(struct in_addr), - AF_INET); + 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); + hostname = (he && he->h_name) ? he->h_name : inet_ntoa (clnt_sa.sin_addr); - hosts=g_list_insert_sorted(hosts, - gdm_chooser_host_alloc(hostname, (gchar *) status), - (GCompareFunc) gdm_chooser_sort_func); + 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); + XdmcpDisposeARRAY8 (&auth); + XdmcpDisposeARRAY8 (&host); + XdmcpDisposeARRAY8 (&stat); - g_free(status); + g_free (status); return; } - } /* Find broadcast address for all active, non pointopoint interfaces */ static void -gdm_chooser_find_bcaddr(void) +gdm_chooser_find_bcaddr (void) { - gint i=0; + gint i = 0; struct ifconf ifcfg; struct ifreq ifr[MAXIF]; struct in_addr *ia; - ifcfg.ifc_buf=(gchar *)𝔦 - ifcfg.ifc_len=sizeof(ifr); + ifcfg.ifc_buf = (gchar *) 𝔦 + ifcfg.ifc_len = sizeof (ifr); - memset(ifr, 0, sizeof(ifr)); + memset (ifr, 0, sizeof (ifr)); - if(ioctl(sockfd, SIOCGIFCONF, &ifcfg) < 0) - gdm_chooser_abort("Could not get SIOCIFCONF"); + if (ioctl (sockfd, SIOCGIFCONF, &ifcfg) < 0) + gdm_chooser_abort ("Could not get SIOCIFCONF"); - for(i=0 ; i < MAXIF ; i++) - if(strlen(ifr[i].ifr_name)) { + for (i=0 ; i < MAXIF ; i++) + if (strlen (ifr[i].ifr_name)) { struct ifreq *ifreq; struct sockaddr_in *ba; - ifreq=g_new0(struct ifreq, 1); + ifreq = g_new0 (struct ifreq, 1); - strncpy(ifreq->ifr_name, ifr[i].ifr_name, sizeof(ifr[i].ifr_name)); + strncpy (ifreq->ifr_name, ifr[i].ifr_name, sizeof (ifr[i].ifr_name)); - if(ioctl(sockfd, SIOCGIFFLAGS, ifreq) < 0) - gdm_chooser_abort("Could not get SIOCGIFFLAGS for %s", ifr[i].ifr_name); + if (ioctl (sockfd, SIOCGIFFLAGS, ifreq) < 0) + gdm_chooser_abort ("Could not get SIOCGIFFLAGS for %s", ifr[i].ifr_name); - if((ifreq->ifr_flags & IFF_UP) == 0) + if ((ifreq->ifr_flags & IFF_UP) == 0) goto done; - if((ifreq->ifr_flags & IFF_BROADCAST) == 0) + 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; + ba = (struct sockaddr_in *) &ifreq->ifr_broadaddr; - ia=g_new0(struct in_addr, 1); + ia = g_new0 (struct in_addr, 1); ia->s_addr = ba->sin_addr.s_addr; - bcaddr=g_slist_append(bcaddr, ia); + bcaddr = g_slist_append (bcaddr, ia); done: - g_free(ifreq); + g_free (ifreq); } } static gboolean -gdm_chooser_xdmcp_discover(void) +gdm_chooser_xdmcp_discover (void) { struct sockaddr_in sock; - GSList *bl=bcaddr; + GSList *bl = bcaddr; struct in_addr *ia; - GList *hl=hosts; + GList *hl = hosts; - gtk_widget_set_sensitive (chooser, FALSE); - gnome_icon_list_freeze(browser); - gnome_icon_list_clear(browser); + gtk_widget_set_sensitive (GTK_WIDGET (chooser), FALSE); + gnome_icon_list_freeze (GNOME_ICON_LIST (browser)); + gnome_icon_list_clear (GNOME_ICON_LIST (browser)); - while(hl) { - gdm_chooser_host_dispose((GdmChooserHost *) hl->data); - hl=hl->next; + while (hl) { + gdm_chooser_host_dispose ((GdmChooserHost *) hl->data); + hl = hl->next; } - g_list_free(hosts); + g_list_free (hosts); - hosts=NULL; + hosts = NULL; sock.sin_family = AF_INET; sock.sin_port = htons (XDM_UDP_PORT); - while(bl) { - ia = (struct in_addr *)bl->data; - + while (bl) { + ia = (struct in_addr *) bl->data; sock.sin_addr.s_addr = ia->s_addr; - XdmcpFlush (sockfd, &querybuf, &sock, sizeof(struct sockaddr_in)); - bl=bl->next; + XdmcpFlush (sockfd, &querybuf, &sock, sizeof (struct sockaddr_in)); + bl = bl->next; } - tid=g_timeout_add(GdmRescanTime*1000, - (GSourceFunc) gdm_chooser_browser_update, NULL); + tid = g_timeout_add (GdmScanTime*1000, + (GSourceFunc) gdm_chooser_browser_update, NULL); - return(TRUE); + return (TRUE); } static void -gdm_chooser_xdmcp_init(void) +gdm_chooser_xdmcp_init (void) { static XdmcpHeader header; - gint sockopts=1; + gint sockopts = 1; /* Open socket for communication */ - if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - gdm_chooser_abort("Could not create socket()!"); + if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) + gdm_chooser_abort ("Could not create socket()!"); - if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&sockopts, sizeof (sockopts)) < 0) - gdm_chooser_abort("Could not set socket options!"); + if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, (char *) &sockopts, sizeof (sockopts)) < 0) + gdm_chooser_abort ("Could not set socket options!"); gdm_chooser_find_bcaddr(); @@ -273,154 +275,151 @@ gdm_chooser_xdmcp_init(void) header.opcode = (CARD16) BROADCAST_QUERY; header.length = 1; header.version = XDM_PROTOCOL_VERSION; - XdmcpWriteHeader(&querybuf, &header); - XdmcpWriteARRAY8(&querybuf, &authlist.authentication); + XdmcpWriteHeader (&querybuf, &header); + XdmcpWriteARRAY8 (&querybuf, &authlist.authentication); - channel = g_io_channel_unix_new(sockfd); - g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, + channel = g_io_channel_unix_new (sockfd); + g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, (GIOFunc) gdm_chooser_decode_packet, - GINT_TO_POINTER(sockfd), NULL); - g_io_channel_unref(channel); + GINT_TO_POINTER (sockfd), NULL); + g_io_channel_unref (channel); gdm_chooser_xdmcp_discover(); } static gboolean -gdm_chooser_cancel(void) +gdm_chooser_cancel (void) { closelog(); gtk_main_quit(); - return(TRUE); + return (TRUE); } static gboolean -gdm_chooser_manage(void) +gdm_chooser_manage (void) { - if(curhost) - g_print("%s\n", curhost->name); + if (curhost) + g_print ("%s\n", curhost->name); closelog(); gtk_main_quit(); - return(TRUE); + return (TRUE); } static void -gdm_chooser_abort(const gchar *format, ...) +gdm_chooser_abort (const gchar *format, ...) { va_list args; gchar *s; - va_start(args, format); - s=g_strdup_vprintf(format, args); - va_end(args); + va_start (args, format); + s = g_strdup_vprintf (format, args); + va_end (args); - syslog(LOG_ERR, s); + syslog (LOG_ERR, s); + closelog (); - closelog(); - exit(EXIT_FAILURE); + exit (EXIT_FAILURE); } static void -gdm_chooser_parse_config(void) +gdm_chooser_parse_config (void) { struct stat unused; - if(stat(GDM_CONFIG_FILE, &unused) == -1) - gdm_chooser_abort(_("gdm_chooser_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE); + if (stat (GDM_CONFIG_FILE, &unused) == -1) + gdm_chooser_abort (_("gdm_chooser_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE); gnome_config_push_prefix ("=" GDM_CONFIG_FILE "=/"); - GdmGtkRC=gnome_config_get_string("appearance/gtkrc"); - - GdmRescanTime=gnome_config_get_int("chooser/rescantime=3"); - GdmDeadTime=gnome_config_get_int("chooser/deadtime=3"); - GdmHostDefaultIcon=gnome_config_get_string("chooser/defaultimage=nohost.xpm"); - GdmHostIconDir=gnome_config_get_string("chooser/imagedir"); - - GdmIconMaxWidth=gnome_config_get_int("system/UserIconMaxWidth=128"); - GdmIconMaxHeight=gnome_config_get_int("system/UserIconMaxHeight=128"); + GdmGtkRC = gnome_config_get_string (GDM_KEY_GTKRC); + GdmScanTime = gnome_config_get_int (GDM_KEY_SCAN); + GdmHostDefaultIcon = gnome_config_get_string (GDM_KEY_HOST); + GdmHostIconDir = gnome_config_get_string (GDM_KEY_HOSTDIR); + GdmIconMaxWidth = gnome_config_get_int (GDM_KEY_ICONWIDTH); + GdmIconMaxHeight = gnome_config_get_int (GDM_KEY_ICONHEIGHT); + GdmDebug = gnome_config_get_int (GDM_KEY_DEBUG); - GdmDebug=gnome_config_get_int("debug/enable=0"); - - gnome_config_pop_prefix (); + gnome_config_pop_prefix(); } static gboolean -gdm_chooser_browser_select(GtkWidget *widget, gint selected, GdkEvent *event) +gdm_chooser_browser_select (GtkWidget *widget, gint selected, GdkEvent *event) { - if(!event) - return(TRUE); - else - switch(event->type) { - - case GDK_BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - curhost=g_list_nth_data(hosts, selected); - gtk_widget_set_sensitive (manage, TRUE); - break; - - default: - break; - } + if (!widget || !event) + return (TRUE); - return(TRUE); + switch (event->type) { + + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + curhost = g_list_nth_data (hosts, selected); + gtk_widget_set_sensitive (manage, TRUE); + break; + + default: + break; + } + + return (TRUE); } static gboolean -gdm_chooser_browser_unselect(GtkWidget *widget, gint selected, GdkEvent *event) +gdm_chooser_browser_unselect (GtkWidget *widget, gint selected, GdkEvent *event) { - if(event) { - switch(event->type) { - - case GDK_BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - curhost=NULL; - gtk_widget_set_sensitive (manage, FALSE); - break; - - default: - break; - } + if (!event) + return(TRUE); + + switch (event->type) { + + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + curhost = NULL; + gtk_widget_set_sensitive (manage, FALSE); + break; + + default: + break; } - return(TRUE); + return (TRUE); } static void -gdm_chooser_browser_update(void) +gdm_chooser_browser_update (void) { - GList *list=hosts; + GList *list = hosts; - g_source_remove(tid); + g_source_remove (tid); - while(list) { + while (list) { GdmChooserHost *host; gchar *temp; - host=(GdmChooserHost *)list->data; + host = (GdmChooserHost *) list->data; - temp=g_strconcat(host->name, "\n", host->desc, NULL); - gnome_icon_list_append_imlib(browser, host->picture, temp); - g_free(temp); + temp = g_strconcat (host->name, "\n", host->desc, NULL); + gnome_icon_list_append_imlib (GNOME_ICON_LIST (browser), host->picture, temp); + g_free (temp); - list=list->next; + list = list->next; } - gnome_icon_list_thaw(browser); + gnome_icon_list_thaw (GNOME_ICON_LIST (browser)); - gtk_widget_set_sensitive(chooser, TRUE); - gtk_widget_set_sensitive(manage, FALSE); - gtk_widget_show_all(chooser); + gtk_widget_set_sensitive (GTK_WIDGET (chooser), TRUE); + gtk_widget_set_sensitive (GTK_WIDGET (manage), FALSE); + gtk_widget_show_all (GTK_WIDGET (chooser)); } @@ -440,52 +439,52 @@ gdm_chooser_gui_init (void) struct stat statbuf; /* Enable theme */ - if(GdmGtkRC) - gtk_rc_parse(GdmGtkRC); + if (GdmGtkRC) + gtk_rc_parse (GdmGtkRC); /* Load default host image */ - if(stat(GdmHostDefaultIcon, &statbuf)) - gdm_chooser_abort(_("Can't open default host icon: %s"), GdmHostDefaultIcon); + if (stat (GdmHostDefaultIcon, &statbuf)) + gdm_chooser_abort (_("Can't open default host icon: %s"), GdmHostDefaultIcon); else { - nohostimg=gdk_imlib_load_image(GdmHostDefaultIcon); - maxwidth=nohostimg->rgb_width; + defhostimg = gdk_imlib_load_image (GdmHostDefaultIcon); + maxwidth = defhostimg->rgb_width; } /* Root Window */ - rootwin=gdk_window_foreign_new (GDK_ROOT_WINDOW ()); + rootwin = gdk_window_foreign_new (GDK_ROOT_WINDOW ()); /* Main window */ - chooser = gtk_window_new(GTK_WINDOW_TOPLEVEL); + chooser = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_container_border_width (GTK_CONTAINER (chooser), 0); /* 3D frame for main window */ - frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME (frame), GTK_SHADOW_OUT); + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_container_border_width (GTK_CONTAINER (frame), 0); - gtk_container_add(GTK_CONTAINER (chooser), frame); + gtk_container_add (GTK_CONTAINER (chooser), frame); /* Vertical box containing browser box and button pane */ - vbox = gtk_vbox_new(FALSE, 10); + vbox = gtk_vbox_new (FALSE, 10); gtk_container_border_width (GTK_CONTAINER (vbox), 10); - gtk_container_add(GTK_CONTAINER (frame), vbox); + gtk_container_add (GTK_CONTAINER (frame), vbox); /* Find background style for browser */ style = gtk_style_copy (chooser->style); style->bg[GTK_STATE_NORMAL] = bbg; - gtk_widget_push_style(style); + gtk_widget_push_style (style); /* Icon list */ - if(maxwidth < GdmIconMaxWidth/2) - maxwidth=(gint) GdmIconMaxWidth/2; + if (maxwidth < GdmIconMaxWidth/2) + maxwidth = (gint) GdmIconMaxWidth/2; browser = GNOME_ICON_LIST (gnome_icon_list_new (maxwidth+20, NULL, FALSE)); gnome_icon_list_freeze (GNOME_ICON_LIST (browser)); - gnome_icon_list_set_separators (browser, " /-_."); - gnome_icon_list_set_row_spacing (browser, 2); - gnome_icon_list_set_col_spacing (browser, 2); - gnome_icon_list_set_icon_border (browser, 2); - gnome_icon_list_set_text_spacing (browser, 2); - gnome_icon_list_set_selection_mode (browser, GTK_SELECTION_SINGLE); + gnome_icon_list_set_separators (GNOME_ICON_LIST (browser), " /-_."); + gnome_icon_list_set_row_spacing (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_col_spacing (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_icon_border (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_text_spacing (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_selection_mode (GNOME_ICON_LIST (browser), GTK_SELECTION_SINGLE); gtk_signal_connect (GTK_OBJECT (browser), "select_icon", GTK_SIGNAL_FUNC (gdm_chooser_browser_select), NULL); gtk_signal_connect (GTK_OBJECT (browser), "unselect_icon", @@ -493,9 +492,9 @@ gdm_chooser_gui_init (void) gtk_widget_pop_style(); /* Browser 3D frame */ - bframe = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME (bframe), GTK_SHADOW_IN); - gtk_container_add(GTK_CONTAINER(bframe), GTK_WIDGET(browser)); + bframe = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (bframe), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER(bframe), GTK_WIDGET (browser)); /* Browser scroll bar */ adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); @@ -512,56 +511,56 @@ gdm_chooser_gui_init (void) gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (bbox), TRUE, TRUE, 0); /* Buttons */ - manage = gtk_button_new_with_label(_("Connect")); - gtk_signal_connect(GTK_OBJECT (manage), "clicked", - GTK_SIGNAL_FUNC (gdm_chooser_manage), NULL); - GTK_WIDGET_SET_FLAGS(manage, GTK_CAN_DEFAULT); - gtk_widget_set_sensitive (manage, FALSE); - gtk_widget_show(manage); - - rescan = gtk_button_new_with_label(_("Rescan")); + manage = gtk_button_new_with_label (_("Connect")); + gtk_signal_connect (GTK_OBJECT (manage), "clicked", + GTK_SIGNAL_FUNC (gdm_chooser_manage), NULL); + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (manage), GTK_CAN_DEFAULT); + gtk_widget_set_sensitive (GTK_WIDGET (manage), FALSE); + gtk_widget_show (GTK_WIDGET (manage)); + + rescan = gtk_button_new_with_label (_("Rescan")); gtk_signal_connect(GTK_OBJECT (rescan), "clicked", GTK_SIGNAL_FUNC (gdm_chooser_xdmcp_discover), NULL); - GTK_WIDGET_SET_FLAGS(rescan, GTK_CAN_DEFAULT); - gtk_widget_show(rescan); + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (rescan), GTK_CAN_DEFAULT); + gtk_widget_show (GTK_WIDGET (rescan)); - cancel = gtk_button_new_with_label(_("Cancel")); + cancel = gtk_button_new_with_label (_("Cancel")); gtk_signal_connect(GTK_OBJECT (cancel), "clicked", GTK_SIGNAL_FUNC (gdm_chooser_cancel), NULL); - GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT); - gtk_widget_show(cancel); + GTK_WIDGET_SET_FLAGS(GTK_WIDGET (cancel), GTK_CAN_DEFAULT); + gtk_widget_show (GTK_WIDGET (cancel)); /* Button pane */ buttonpane = gtk_hbox_new(TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER (buttonpane), 0); - gtk_box_pack_start(GTK_BOX (buttonpane), - manage, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX (buttonpane), - rescan, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX (buttonpane), - cancel, TRUE, TRUE, 0); - gtk_window_set_default(GTK_WINDOW(chooser), GTK_WIDGET(manage)); - gtk_widget_show_all(buttonpane); + gtk_container_set_border_width ( GTK_CONTAINER (buttonpane), 0); + gtk_box_pack_start (GTK_BOX (buttonpane), + GTK_WIDGET (manage), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (buttonpane), + GTK_WIDGET (rescan), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (buttonpane), + GTK_WIDGET (cancel), TRUE, TRUE, 0); + gtk_window_set_default (GTK_WINDOW (chooser), GTK_WIDGET (manage)); + gtk_widget_show_all (GTK_WIDGET (buttonpane)); /* Put button pane in main window */ - gtk_box_pack_end(GTK_BOX (vbox), - buttonpane, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (vbox), + GTK_WIDGET (buttonpane), FALSE, FALSE, 0); - gtk_widget_show(vbox); - gtk_widget_show(frame); + gtk_widget_show (GTK_WIDGET (vbox)); + gtk_widget_show (GTK_WIDGET (frame)); - gtk_window_set_policy(GTK_WINDOW (chooser), 1, 1, 1); - gtk_window_set_focus(GTK_WINDOW (chooser), manage); + gtk_window_set_policy (GTK_WINDOW (chooser), 1, 1, 1); + gtk_window_set_focus (GTK_WINDOW (chooser), GTK_WIDGET (manage)); /* Geometry fun */ - gtk_widget_show_all(GTK_WIDGET(browser)); + gtk_widget_show_all (GTK_WIDGET (browser)); gnome_icon_list_thaw (GNOME_ICON_LIST (browser)); - gtk_widget_set_usize(GTK_WIDGET (chooser), - (gint) gdk_screen_width() * 0.4, - (gint) gdk_screen_height() * 0.6); + gtk_widget_set_usize (GTK_WIDGET (chooser), + (gint) gdk_screen_width() * 0.4, + (gint) gdk_screen_height() * 0.6); - gtk_window_position(GTK_WINDOW (chooser), GTK_WIN_POS_CENTER); - gtk_widget_show_all(chooser); + gtk_window_position (GTK_WINDOW (chooser), GTK_WIN_POS_CENTER); + gtk_widget_show_all (GTK_WIDGET (chooser)); } @@ -573,26 +572,24 @@ gdm_chooser_signals_init(void) hup.sa_handler = (void *) gdm_chooser_cancel; hup.sa_flags = 0; - sigemptyset(&hup.sa_mask); + sigemptyset (&hup.sa_mask); - if(sigaction(SIGHUP, &hup, NULL) < 0) - gdm_chooser_abort(_("main: Error setting up HUP signal handler")); + if (sigaction (SIGHUP, &hup, NULL) < 0) + gdm_chooser_abort (_("gdm_signals_init: Error setting up HUP signal handler")); - if(sigaction(SIGINT, &hup, NULL) < 0) - gdm_chooser_abort(_("main: Error setting up INT signal handler")); + if (sigaction (SIGINT, &hup, NULL) < 0) + gdm_chooser_abort (_("gdm_signals_init: Error setting up INT signal handler")); - if(sigaction(SIGTERM, &hup, NULL) < 0) - gdm_chooser_abort(_("main: Error setting up TERM signal handler")); + if (sigaction (SIGTERM, &hup, NULL) < 0) + gdm_chooser_abort (_("gdm_signals_init: Error setting up TERM signal handler")); - sigfillset(&mask); - sigdelset(&mask, SIGTERM); - sigdelset(&mask, SIGHUP); - sigdelset(&mask, SIGINT); + sigfillset (&mask); + sigdelset (&mask, SIGTERM); + sigdelset (&mask, SIGHUP); + sigdelset (&mask, SIGINT); - if(sigprocmask(SIG_SETMASK, &mask, NULL) == -1) { - syslog(LOG_ERR, "Could not set signal mask!"); - exit(EXIT_FAILURE); - } + if (sigprocmask (SIG_SETMASK, &mask, NULL) == -1) + gdm_chooser_abort (_("Could not set signal mask!")); } static GdmChooserHost * @@ -600,57 +597,57 @@ gdm_chooser_host_alloc (gchar *hostname, gchar *description) { GdmChooserHost *host; GdkImlibImage *imlibimg; - gint w, h; gchar *hostimg; struct stat statbuf; - host=g_malloc(sizeof(GdmChooserHost)); - host->name=g_strdup(hostname); - host->desc=g_strdup(description); + host = g_malloc (sizeof (GdmChooserHost)); + host->name = g_strdup (hostname); + host->desc = g_strdup (description); - hostimg=g_strconcat(GdmHostIconDir, "/", hostname, NULL); + hostimg = g_strconcat (GdmHostIconDir, "/", hostname, NULL); - if (!stat(hostimg, &statbuf) && (imlibimg=gdk_imlib_load_image(hostimg))) { + if (!stat (hostimg, &statbuf) && (imlibimg = gdk_imlib_load_image (hostimg))) { + gint w, h; - w=imlibimg->rgb_width; - h=imlibimg->rgb_height; + w = imlibimg->rgb_width; + h = imlibimg->rgb_height; - if(w>h && w>GdmIconMaxWidth) { - h=h*((gfloat) GdmIconMaxWidth/w); - w=GdmIconMaxWidth; + if (w>h && w>GdmIconMaxWidth) { + h = h * ((gfloat) GdmIconMaxWidth/w); + w = GdmIconMaxWidth; } - else if(h>GdmIconMaxHeight) { - w=w*((gfloat) GdmIconMaxHeight/h); - h=GdmIconMaxHeight; + else if (h>GdmIconMaxHeight) { + w = w * ((gfloat) GdmIconMaxHeight/h); + h = GdmIconMaxHeight; } - maxwidth=MAX(maxwidth, w); + maxwidth = MAX (maxwidth, w); - host->picture=gdk_imlib_clone_scaled_image(imlibimg, w, h); + host->picture = gdk_imlib_clone_scaled_image (imlibimg, w, h); - gdk_imlib_destroy_image(imlibimg); + gdk_imlib_destroy_image (imlibimg); } else - host->picture=nohostimg; + host->picture = defhostimg; - g_free(hostimg); + g_free (hostimg); return (host); } static void -gdm_chooser_host_dispose(GdmChooserHost *host) +gdm_chooser_host_dispose (GdmChooserHost *host) { - if(!host) + if (!host) return; - if(host->picture != nohostimg) - gdk_imlib_destroy_image(host->picture); + if (host->picture != defhostimg) + gdk_imlib_destroy_image (host->picture); - g_free(host->name); - g_free(host->desc); - g_free(host); + g_free (host->name); + g_free (host->desc); + g_free (host); } @@ -660,21 +657,21 @@ main (int argc, char *argv[]) /* Avoid creating ~gdm/.gnome stuff */ gnome_do_not_create_directories = TRUE; - openlog("gdmchooser", LOG_PID, LOG_DAEMON); + openlog ("gdmchooser", LOG_PID, LOG_DAEMON); - gnome_init("gdmchooser", VERSION, argc, argv); + gnome_init ("gdmchooser", VERSION, argc, argv); gnome_sound_shutdown(); gnome_preferences_set_dialog_position(GTK_WIN_POS_CENTER); gdm_chooser_parse_config(); gdm_chooser_gui_init(); gdm_chooser_signals_init(); - gdm_chooser_xdmcp_init(); gtk_main(); - exit(EXIT_SUCCESS); + exit (EXIT_SUCCESS); } + /* EOF */ diff --git a/gui/gdmlogin.c b/gui/gdmlogin.c index 03411238..eb9c1537 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@SunSITE.auc.dk> + * Copyright (C) 1998, 1999 Martin Kasper 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,14 +16,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* gdmlogin is a stripped down greeter for environments where: - * - * 1. Users are not trusted (i.e. gdmlogin is less vulnerable to DoS - * attacks ) - * - * 2. Usernames should not be exposed - */ - #include <config.h> #include <gnome.h> #include <stdio.h> @@ -39,43 +31,52 @@ #include <pwd.h> #include <sys/utsname.h> +#include "gdmlogin.h" #include "gdm.h" static const gchar RCSid[]="$Id$"; -extern gboolean gdm_file_check(gchar *caller, uid_t user, gchar *dir, gchar *file, gboolean absentok); - -gint GdmDebug; -gint GdmIconify; -gint GdmShutdownMenu; -gint GdmVerboseAuth; -gint GdmQuiver; -gint GdmChooserMenu; -gint GdmRelaxPerms; -gint GdmUserMaxFile; -gchar *GdmLogoFilename; -gchar *GdmMessageText; -gchar *GdmMessageFont; -gchar *GdmConfigFilename=GDM_CONFIG_FILE; -gchar *GdmMessageFont; -gchar *GdmGtkRC; -gchar *GdmIconFile; -gchar *GdmSessionDir; -gchar *GdmLocaleFile; -gchar *GdmDefaultLocale; - -GtkWidget *login; -GtkWidget *label; -GtkWidget *entry; -GtkWidget *msg; -GtkWidget *win; -GtkWidget *sessmenu; -GtkWidget *langmenu; -GdkWindow *rootwin; +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; +static gint GdmIconMaxWidth; +static gint GdmQuiver; +static gint GdmRelaxPerms; +static gint GdmSystemMenu; +static gint GdmUserMaxFile; +static gchar *GdmLogo; +static gchar *GdmWelcome; +static gchar *GdmFont; +static gchar *GdmGtkRC; +static gchar *GdmIcon; +static gchar *GdmSessionDir; +static gchar *GdmLocaleFile; +static gchar *GdmDefaultLocale; +static gchar *GdmExclude; +static gchar *GdmGlobalFaceDir; +static gchar *GdmDefaultFace; + +static GtkWidget *login; +static GtkWidget *label; +static GtkWidget *entry; +static GtkWidget *msg; +static GtkWidget *win; +static GtkWidget *sessmenu; +static GtkWidget *langmenu; +static GdkWindow *rootwin; + +static GnomeIconList *browser; +static GdkImlibImage *defface; /* Eew. Loads of global vars. It's hard to be event controlled while maintaining state */ -GSList *sessions=NULL; -GSList *languages=NULL; +GSList *sessions = NULL; +GSList *languages = NULL; +GList *users = NULL; +GSList *exclude = NULL; gchar *defsess=NULL; gchar *cursess=NULL; @@ -88,89 +89,82 @@ gchar *language=NULL; gboolean savesess; gboolean savelang; - - -/* Log debug messages */ -void -static gdm_debug(const gchar *format, ...) -{ - va_list args; - gchar *s; - - if(GdmDebug) { - va_start(args, format); - s=g_strdup_vprintf(format, args); - va_end(args); - - syslog(LOG_DEBUG, s); - - g_free(s); - } -} - +gint maxwidth; static void -gdm_login_done(void) +gdm_login_done (void) { + gdk_keyboard_ungrab (CurrentTime); + closelog(); gtk_main_quit(); - exit(DISPLAY_SUCCESS); + + exit (DISPLAY_SUCCESS); } -typedef struct _cursoroffset {gint x,y;} CursorOffset; +typedef struct _cursoroffset { gint x,y; } CursorOffset; static void -gdm_login_icon_pressed(GtkWidget *widget, GdkEventButton *event) +gdm_login_icon_pressed (GtkWidget *widget, GdkEventButton *event) { CursorOffset *p; + + if (!widget || !event) + return; - if(event->type == GDK_2BUTTON_PRESS) { - gtk_widget_destroy(win); - gdk_window_show(login->window); + if (event->type == GDK_2BUTTON_PRESS) { + gtk_widget_destroy (GTK_WIDGET (win)); + gdk_window_show (login->window); return; } if (event->type != GDK_BUTTON_PRESS) return; - p=gtk_object_get_user_data(GTK_OBJECT (widget)); - p->x=(gint)event->x; - p->y=(gint)event->y; + p = gtk_object_get_user_data (GTK_OBJECT (widget)); + p->x = (gint) event->x; + p->y = (gint) event->y; - gtk_grab_add(widget); - gdk_pointer_grab(widget->window, TRUE, - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK, - NULL, NULL, 0); + gtk_grab_add (widget); + gdk_pointer_grab (widget->window, TRUE, + GDK_BUTTON_RELEASE_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK, + NULL, NULL, 0); } static void -gdm_login_icon_released(GtkWidget *widget) +gdm_login_icon_released (GtkWidget *widget) { - gtk_grab_remove(widget); - gdk_pointer_ungrab(0); + if(!widget) + return; + + gtk_grab_remove (widget); + gdk_pointer_ungrab (0); } static void -gdm_login_icon_motion(GtkWidget *widget, GdkEventMotion *event) +gdm_login_icon_motion (GtkWidget *widget, GdkEventMotion *event) { gint xp, yp; CursorOffset *p; GdkModifierType mask; - p=gtk_object_get_user_data(GTK_OBJECT (widget)); - gdk_window_get_pointer(rootwin, &xp, &yp, &mask); - gtk_widget_set_uposition(widget, xp-p->x, yp-p->y); + if(!widget || !event) + return; + + p = gtk_object_get_user_data (GTK_OBJECT (widget)); + gdk_window_get_pointer (rootwin, &xp, &yp, &mask); + gtk_widget_set_uposition (GTK_WIDGET (widget), xp-p->x, yp-p->y); } static gboolean -gdm_login_iconify_handler(GtkWidget *widget, gpointer data) +gdm_login_iconify_handler (GtkWidget *widget, gpointer data) { GtkWidget *fixed; GtkWidget *icon; @@ -179,143 +173,151 @@ gdm_login_iconify_handler(GtkWidget *widget, gpointer data) CursorOffset *icon_pos; gint rw, rh, iw, ih; - gdk_window_hide(login->window); - style=gtk_widget_get_default_style(); - gc=style->black_gc; - win=gtk_window_new(GTK_WINDOW_POPUP); + gdk_window_hide (login->window); + style = gtk_widget_get_default_style(); + gc = style->black_gc; + win = gtk_window_new (GTK_WINDOW_POPUP); - gtk_widget_set_events(win, - gtk_widget_get_events(win) | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK); + gtk_widget_set_events (win, + gtk_widget_get_events (GTK_WIDGET (win)) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK); - gtk_widget_realize(win); + gtk_widget_realize (GTK_WIDGET (win)); - fixed=gtk_fixed_new(); - gtk_container_add(GTK_CONTAINER (win), fixed); - gtk_widget_show(fixed); + fixed = gtk_fixed_new(); + gtk_container_add (GTK_CONTAINER (win), fixed); + gtk_widget_show (fixed); - icon=gnome_pixmap_new_from_file (GdmIconFile); + icon = gnome_pixmap_new_from_file (GdmIcon); gdk_window_get_size ((GdkWindow *) GNOME_PIXMAP (icon)->pixmap, &iw, &ih); - gtk_fixed_put(GTK_FIXED (fixed), icon, 0, 0); - gtk_widget_show(icon); + gtk_fixed_put(GTK_FIXED (fixed), GTK_WIDGET (icon), 0, 0); + gtk_widget_show(GTK_WIDGET (icon)); - gtk_signal_connect(GTK_OBJECT (win), "button_press_event", - GTK_SIGNAL_FUNC (gdm_login_icon_pressed),NULL); - gtk_signal_connect(GTK_OBJECT (win), "button_release_event", - GTK_SIGNAL_FUNC (gdm_login_icon_released),NULL); - gtk_signal_connect(GTK_OBJECT (win), "motion_notify_event", - GTK_SIGNAL_FUNC (gdm_login_icon_motion),NULL); + gtk_signal_connect (GTK_OBJECT (win), "button_press_event", + GTK_SIGNAL_FUNC (gdm_login_icon_pressed),NULL); + gtk_signal_connect (GTK_OBJECT (win), "button_release_event", + GTK_SIGNAL_FUNC (gdm_login_icon_released),NULL); + gtk_signal_connect (GTK_OBJECT (win), "motion_notify_event", + GTK_SIGNAL_FUNC (gdm_login_icon_motion),NULL); - icon_pos=g_new(CursorOffset, 1); - gtk_object_set_user_data(GTK_OBJECT(win), icon_pos); + icon_pos = g_new (CursorOffset, 1); + gtk_object_set_user_data (GTK_OBJECT (win), icon_pos); - gtk_widget_show(win); + gtk_widget_show (GTK_WIDGET (win)); - rw=gdk_screen_width(); - rh=gdk_screen_height(); + rw = gdk_screen_width(); + rh = gdk_screen_height(); - gtk_widget_set_uposition(win, rw-iw, rh-ih); + gtk_widget_set_uposition (GTK_WIDGET (win), rw-iw, rh-ih); return(TRUE); } static void -gdm_login_abort(const gchar *format, ...) +gdm_login_abort (const gchar *format, ...) { va_list args; gchar *s; - va_start(args, format); - s=g_strdup_vprintf(format, args); - va_end(args); + if (!format) + exit (DISPLAY_ABORT); + + va_start (args, format); + s = g_strdup_vprintf (format, args); + va_end (args); - syslog(LOG_ERR, s); + syslog (LOG_ERR, s); closelog(); - exit(DISPLAY_ABORT); + + exit (DISPLAY_ABORT); } +/* I *really* need to rewrite this crap */ static gchar * -gdm_parse_enriched_string(gchar *s) +gdm_parse_enriched_string (gchar *s) { gchar cmd, *buffer, *start; gchar hostbuf[256]; gchar *hostname, *temp1, *temp2, *display; struct utsname name; - display=getenv("DISPLAY"); + if (!s) + return(NULL); + + display = getenv ("DISPLAY"); if(!display) return(NULL); - temp1=strchr(display, '.'); - temp2=strchr(display, ':'); + temp1 = strchr (display, '.'); + temp2 = strchr (display, ':'); - if(temp1) - *temp1='\0'; - else if(temp2) - *temp2='\0'; + if (temp1) + *temp1 = '\0'; + else if (temp2) + *temp2 = '\0'; else - return(NULL); /* Display isn't */ + return (NULL); - gethostname(hostbuf, 255); - hostname=g_strdup(hostbuf); - - if(!hostname) - hostname=g_strdup("Gnome"); + gethostname (hostbuf, 255); + hostname = g_strdup (hostbuf); + + if (!hostname) + hostname = g_strdup ("Gnome"); - uname(&name); + uname (&name); - if(strlen(s) > 1023) { - syslog(LOG_ERR, _("gdm_parse_enriched_string: String too long!")); - return(g_strconcat(_("Welcome to "), hostname, NULL)); + if (strlen (s) > 1023) { + syslog (LOG_ERR, _("gdm_parse_enriched_string: String too long!")); + return (g_strconcat (_("Welcome to "), hostname, NULL)); } - if(!(buffer = g_malloc(4096))) { - syslog(LOG_ERR, _("gdm_parse_enriched_string: Could not malloc temporary buffer!")); - return(NULL); + if (!(buffer = g_malloc (4096))) { + syslog (LOG_ERR, _("gdm_parse_enriched_string: Could not malloc temporary buffer!")); + return (NULL); } start = buffer; - while(*s) { + while (*s) { - if(*s=='%' && (cmd = s[1]) != 0) { + if (*s=='%' && (cmd = s[1]) != 0) { s+=2; - switch(cmd) { + switch (cmd) { case 'h': - memcpy(buffer, hostname, strlen(hostname)); - buffer+=strlen(hostname); + memcpy (buffer, hostname, strlen (hostname)); + buffer += strlen (hostname); break; case 'd': - memcpy(buffer, display, strlen(display)); - buffer+=strlen(display); + memcpy (buffer, display, strlen (display)); + buffer += strlen (display); break; case 's': - memcpy(buffer, name.sysname, strlen(name.sysname)); - buffer+=strlen(name.sysname); + memcpy (buffer, name.sysname, strlen (name.sysname)); + buffer += strlen (name.sysname); break; case 'r': - memcpy(buffer, name.release, strlen(name.release)); - buffer+=strlen(name.release); + memcpy (buffer, name.release, strlen (name.release)); + buffer += strlen (name.release); break; case 'm': - memcpy(buffer, name.machine, strlen(name.machine)); - buffer+=strlen(name.machine); + memcpy (buffer, name.machine, strlen (name.machine)); + buffer += strlen (name.machine); break; case '%': - *buffer++='%'; + *buffer++ = '%'; break; default: @@ -323,144 +325,131 @@ gdm_parse_enriched_string(gchar *s) }; } else - *buffer++=*s++; + *buffer++ = *s++; } - *buffer=0; - - return(g_strdup(start)); -} + *buffer = 0; - -static void -gdm_login_about(void) -{ - const gchar *authors[]={"Martin Kasper Petersen <mkp@mkp.net>", NULL}; - - GtkWidget *about; - - about=gnome_about_new("Gnome Display Manager", - "" VERSION "", - "Copyright Martin K. Petersen (C) 1998, 1999", - authors, - _("gdm manages local and remote displays and provides the user with a login window."), - NULL); - - gtk_widget_show(about); + return (g_strdup (start)); } static gboolean -gdm_login_query(gchar *msg) +gdm_login_query (gchar *msg) { GtkWidget *req; - req=gnome_message_box_new(msg, - GNOME_MESSAGE_BOX_QUESTION, - GNOME_STOCK_BUTTON_YES, - GNOME_STOCK_BUTTON_NO, - NULL); + req = gnome_message_box_new (msg, + GNOME_MESSAGE_BOX_QUESTION, + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); - gtk_window_set_modal(GTK_WINDOW(req), TRUE); - gtk_window_set_position(GTK_WINDOW(req), GTK_WIN_POS_CENTER); + gtk_window_set_modal (GTK_WINDOW (req), TRUE); + gtk_window_set_position (GTK_WINDOW (req), GTK_WIN_POS_CENTER); - return(!gnome_dialog_run(GNOME_DIALOG(req))); + return (!gnome_dialog_run (GNOME_DIALOG(req))); } static gboolean -gdm_login_reboot_handler(void) +gdm_login_reboot_handler (void) { - if(gdm_login_query(_("Are you sure you want to reboot the machine?"))) { + if (gdm_login_query (_("Are you sure you want to reboot the machine?"))) { closelog(); - exit(DISPLAY_REBOOT); + + exit (DISPLAY_REBOOT); } - return(TRUE); + return (TRUE); } static gboolean -gdm_login_halt_handler(void) +gdm_login_halt_handler (void) { - if(gdm_login_query(_("Are you sure you want to halt the machine?"))) { + if (gdm_login_query (_("Are you sure you want to halt the machine?"))) { closelog(); - exit(DISPLAY_HALT); + + exit (DISPLAY_HALT); } - return(TRUE); + return (TRUE); } static void -gdm_login_parse_config(void) +gdm_login_parse_config (void) { gchar *display; struct stat unused; - if(stat(GDM_CONFIG_FILE, &unused) == -1) - gdm_login_abort(_("gdm_login_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE); + if (stat (GDM_CONFIG_FILE, &unused) == -1) + gdm_login_abort (_("gdm_login_parse_config: No configuration file: %s. Aborting."), GDM_CONFIG_FILE); gnome_config_push_prefix ("=" GDM_CONFIG_FILE "=/"); - GdmLogoFilename=gnome_config_get_string("appearance/logoimage"); - GdmMessageFont=gnome_config_get_string("appearance/msgfont=-adobe-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*"); - GdmGtkRC=gnome_config_get_string("appearance/gtkrc"); - GdmIconify=gnome_config_get_int("appearance/iconify=1"); - GdmIconFile=gnome_config_get_string("appearance/iconfile=gdm.xpm"); - GdmQuiver=gnome_config_get_int("appearance/quiver=1"); - - GdmChooserMenu=gnome_config_get_int("system/choosermenu=0"); - GdmShutdownMenu=gnome_config_get_int("system/shutdownmenu=0"); - GdmUserMaxFile=gnome_config_get_int("system/UserFileCutoffSize=65536"); - GdmRelaxPerms=gnome_config_get_int("system/relaxpermissions=0"); - - GdmLocaleFile=g_strdup(gnome_config_get_string("system/LocaleFile")); - GdmDefaultLocale=g_strdup(gnome_config_get_string("system/DefaultLocale=english")); - GdmSessionDir=gnome_config_get_string("daemon/sessiondir"); + GdmBrowser = gnome_config_get_int (GDM_KEY_BROWSER); + GdmLogo = gnome_config_get_string (GDM_KEY_LOGO); + GdmFont = gnome_config_get_string (GDM_KEY_FONT); + GdmIcon = gnome_config_get_string (GDM_KEY_ICON); + GdmQuiver = gnome_config_get_int (GDM_KEY_QUIVER); + GdmSystemMenu = gnome_config_get_int (GDM_KEY_SYSMENU); + GdmUserMaxFile = gnome_config_get_int (GDM_KEY_MAXFILE); + GdmRelaxPerms = gnome_config_get_int (GDM_KEY_RELAXPERM); + GdmLocaleFile = gnome_config_get_string (GDM_KEY_LOCFILE); + GdmDefaultLocale = gnome_config_get_string (GDM_KEY_LOCALE); + GdmSessionDir = gnome_config_get_string (GDM_KEY_SESSDIR); + GdmWelcome=gnome_config_get_string (GDM_KEY_WELCOME); + GdmGtkRC = gnome_config_get_string (GDM_KEY_GTKRC); + GdmExclude = gnome_config_get_string (GDM_KEY_EXCLUDE); + GdmGlobalFaceDir = gnome_config_get_string (GDM_KEY_FACEDIR); + GdmDefaultFace = gnome_config_get_string (GDM_KEY_FACE); + GdmDebug = gnome_config_get_int (GDM_KEY_DEBUG); + GdmUserMaxFile = gnome_config_get_int (GDM_KEY_MAXFILE); + GdmRelaxPerms = gnome_config_get_int (GDM_KEY_RELAXPERM); + GdmIconMaxWidth = gnome_config_get_int (GDM_KEY_ICONWIDTH); + GdmIconMaxHeight = gnome_config_get_int (GDM_KEY_ICONHEIGHT); + + gnome_config_pop_prefix(); + + if (stat (GdmLocaleFile, &unused) == -1) + gdm_login_abort ("gdm_login_parse_config: Could not open locale file %s. Aborting!", GdmLocaleFile); - GdmMessageText=gnome_config_get_string(_("messages/welcome=Welcome to %h")); - - GdmDebug=gnome_config_get_int("debug/enable=0"); - - gnome_config_pop_prefix (); - - if(stat(GdmLocaleFile, &unused) == -1) - gdm_login_abort("gdm_login_parse_config: Could not open locale file %s. Aborting!", GdmLocaleFile); /* Disable System menu on non-local displays */ - display=getenv("DISPLAY"); + display = getenv ("DISPLAY"); - if(!display) - gdm_login_abort("gdm_login_parse_config: DISPLAY variable not set!"); + if (!display) + gdm_login_abort ("gdm_login_parse_config: DISPLAY variable not set!"); - if(strncmp(display, ":", 1)) - GdmShutdownMenu=0; + if (strncmp (display, ":", 1)) + GdmSystemMenu = 0; } static gboolean -gdm_login_list_lookup(GSList *l, gchar *data) +gdm_login_list_lookup (GSList *l, gchar *data) { - GSList *list=l; + GSList *list = l; - if(!list || !data) + if (!list || !data) return(FALSE); - while(list) { + while (list) { - if(!strcasecmp(list->data, data)) - return(TRUE); + if (!strcasecmp (list->data, data)) + return (TRUE); - list=list->next; + list = list->next; } - return(FALSE); + return (FALSE); } static void -gdm_login_sesslang_lookup(void) /* Input validation sucks */ +gdm_login_sesslang_lookup (void) /* Input validation sucks */ { struct passwd *pwent; gboolean fileok; @@ -468,115 +457,119 @@ gdm_login_sesslang_lookup(void) /* Input validation sucks */ gchar *dir=NULL, *cfg=NULL; gchar *usrlang=NULL, *usrsess=NULL; - gtk_widget_set_sensitive(sessmenu, FALSE); - gtk_widget_set_sensitive(langmenu, FALSE); + if(!curuser) + gdm_login_abort("gdm_login_sesslang_lookup: curuser==NULL. Mail <mkp@mkp.net> with " \ + "information on your PAM setup"); + + gtk_widget_set_sensitive (GTK_WIDGET (sessmenu), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (langmenu), FALSE); /* Lookup verified user */ - pwent=getpwnam(curuser); + pwent = getpwnam (curuser); - dir=g_strconcat(pwent->pw_dir, "/.gnome", NULL); - fileok=gdm_file_check("gdm_login_sesslang_lookup", pwent->pw_uid, dir, "gdm", TRUE); - g_free(dir); + dir = g_strconcat (pwent->pw_dir, "/.gnome", NULL); + fileok = gdm_file_check ("gdm_login_sesslang_lookup", pwent->pw_uid, dir, "gdm", TRUE, GdmUserMaxFile, GdmRelaxPerms); + g_free (dir); - if(!fileok) { /* User's settings can't be retrieved */ + if (!fileok) { /* User's settings can't be retrieved */ /* If cursess==last use system default session */ - if(!strcasecmp(cursess, lastsess)) - session=defsess; + if (!strcasecmp (cursess, lastsess)) + session = defsess; else - session=cursess; + session = cursess; /* If curlang==last use default */ - if(!strcasecmp(curlang, lastlang)) - language=GdmDefaultLocale; + if (!strcasecmp (curlang, lastlang)) + language = GdmDefaultLocale; else - language=curlang; + language = curlang; - savesess=FALSE; - savelang=FALSE; + savesess = FALSE; + savelang = FALSE; return; } /* Find user's last session and language if available */ - cfg=g_strconcat("=", pwent->pw_dir, "/.gnome/gdm=/session/last", NULL); - usrsess=gnome_config_get_string(cfg); - g_free(cfg); + cfg = g_strconcat ("=", pwent->pw_dir, "/.gnome/gdm=/session/last", NULL); + usrsess = gnome_config_get_string (cfg); + g_free (cfg); - cfg=g_strconcat("=", pwent->pw_dir, "/.gnome/gdm=/session/lang", NULL); - usrlang=gnome_config_get_string(cfg); - g_free(cfg); + cfg = g_strconcat ("=", pwent->pw_dir, "/.gnome/gdm=/session/lang", NULL); + usrlang = gnome_config_get_string (cfg); + g_free (cfg); /* If ``Last'' session is selected */ - if(!strcasecmp(cursess, lastsess)) { + if (!strcasecmp (cursess, lastsess)) { /* User has no saved session. Use default. */ - if(!usrsess) { - session=defsess; - savesess=TRUE; + if (!usrsess) { + session = defsess; + savesess = TRUE; } /* User's saved session exists on this box */ - else if(gdm_login_list_lookup(sessions, usrsess)) { - session=usrsess; - savesess=FALSE; + else if (gdm_login_list_lookup (sessions, usrsess)) { + session = usrsess; + savesess = FALSE; } /* User's saved session type unknown */ else { - session=defsess; - g_snprintf(msg, 1023, - _("Your preferred session type %s is not installed on this machine.\n" \ - "Do you wish to make %s the default for future sessions?"), - usrsess, defsess); - savesess=gdm_login_query(msg); + session = defsess; + g_snprintf (msg, 1023, + _("Your preferred session type %s is not installed on this machine.\n" \ + "Do you wish to make %s the default for future sessions?"), + usrsess, defsess); + savesess = gdm_login_query (msg); } } /* One of the other available session types is selected */ else { - session=cursess; + session = cursess; /* User has no saved session type. Use current */ - if(!usrsess) - savesess=TRUE; + if (!usrsess) + savesess = TRUE; /* User's saved session is also the chosen one */ - else if(!strcasecmp(usrsess, cursess)) - savesess=FALSE; + else if (!strcasecmp (usrsess, cursess)) + savesess = FALSE; /* User selected a new session type */ else { - g_snprintf(msg, 1023, - _("You have chosen %s for this session, but your default setting is %s.\n" \ - "Do you wish to make %s the default for future sessions?"), - cursess, usrsess, cursess); - savesess=gdm_login_query(msg); + g_snprintf (msg, 1023, + _("You have chosen %s for this session, but your default setting is %s.\n" \ + "Do you wish to make %s the default for future sessions?"), + cursess, usrsess, cursess); + savesess = gdm_login_query (msg); } } /* If ``Last'' language is selected */ - if(!strcasecmp(curlang, lastlang)) { + if (!strcasecmp (curlang, lastlang)) { /* User has no saved language. Use default. */ - if(!usrlang) { - language=GdmDefaultLocale; - savelang=TRUE; + if (!usrlang) { + language = GdmDefaultLocale; + savelang = TRUE; } else { - language=usrlang; - savelang=FALSE; + language = usrlang; + savelang = FALSE; } } /* One of the available languages is selected */ else { - language=curlang; + language = curlang; /* User has no saved language. Use current */ - if(!usrlang) - savelang=TRUE; + if (!usrlang) + savelang = TRUE; /* User selected a new language */ else { - g_snprintf(msg, 1023, - _("You have chosen %s for this session, but your default setting is %s.\n" \ - "Do you wish to make %s the default for future sessions?"), - curlang, usrlang, curlang); - savelang=gdm_login_query(msg); + g_snprintf (msg, 1023, + _("You have chosen %s for this session, but your default setting is %s.\n" \ + "Do you wish to make %s the default for future sessions?"), + curlang, usrlang, curlang); + savelang = gdm_login_query (msg); } } @@ -587,42 +580,39 @@ gdm_login_sesslang_lookup(void) /* Input validation sucks */ static gboolean gdm_login_entry_handler (GtkWidget *widget, GdkEventKey *event) { - if(!event) + if (!event) return(TRUE); - switch(event->keyval) { + switch (event->keyval) { case GDK_Return: - gtk_widget_set_sensitive(entry, FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (entry), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE); /* Save login. I'm making the assumption that login is always * the first thing entered. This might not be true for all PAM * setups. Needs thinking! */ - if(!curuser) - curuser=g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))); + 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 ("%s\n", gtk_entry_get_text (GTK_ENTRY (entry))); break; case GDK_Up: case GDK_Down: case GDK_Tab: - gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event"); - break; - + gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event"); break; - case GDK_F1: - gdm_login_about(); break; default: break; } - return(TRUE); + return (TRUE); } @@ -631,17 +621,17 @@ gdm_login_session_handler (GtkWidget *widget) { gchar *s; - gtk_label_get(GTK_LABEL(GTK_BIN(widget)->child), &cursess); - s=g_strdup_printf(_("%s session selected"), cursess); - gtk_label_set(GTK_LABEL(msg), s); - g_free(s); + gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &cursess); + s = g_strdup_printf (_("%s session selected"), cursess); + gtk_label_set (GTK_LABEL (msg), s); + g_free (s); } static void -gdm_login_session_init(GtkWidget *menu) +gdm_login_session_init (GtkWidget *menu) { - GSList *sessgrp=NULL; + GSList *sessgrp = NULL; GtkWidget *item; DIR *sessdir; struct dirent *dent; @@ -650,71 +640,71 @@ gdm_login_session_init(GtkWidget *menu) lastsess=_("Last"); - cursess=lastsess; - item = gtk_radio_menu_item_new_with_label(NULL, lastsess); - sessgrp = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item)); - gtk_menu_append(GTK_MENU(menu), item); - gtk_signal_connect(GTK_OBJECT(item), "activate", gdm_login_session_handler, NULL); - gtk_widget_show(item); + cursess = lastsess; + item = gtk_radio_menu_item_new_with_label (NULL, lastsess); + sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item)); + gtk_menu_append (GTK_MENU (menu), item); + gtk_signal_connect (GTK_OBJECT (item), "activate", gdm_login_session_handler, NULL); + gtk_widget_show (GTK_WIDGET (item)); item = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), item); - gtk_widget_show(item); + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (GTK_WIDGET (item)); /* Check that session dir is readable */ - if (access(GdmSessionDir, R_OK|X_OK)) - gdm_login_abort(_("gdm_login_session_init: Session script directory not found!")); + if (access (GdmSessionDir, R_OK|X_OK)) + gdm_login_abort (_("gdm_login_session_init: Session script directory not found!")); /* Read directory entries in session dir */ - sessdir=opendir(GdmSessionDir); - dent=readdir(sessdir); + sessdir = opendir (GdmSessionDir); + dent = readdir (sessdir); - while(dent != NULL) { + while (dent != NULL) { gchar *s; - s=g_strconcat(GdmSessionDir, "/", dent->d_name, NULL); - lstat(s, &statbuf); + s = g_strconcat (GdmSessionDir, "/", dent->d_name, NULL); + lstat (s, &statbuf); /* If default session link exists, find out what it points to */ - if(S_ISLNK(statbuf.st_mode) && !strcasecmp(dent->d_name, "default")) { + if (S_ISLNK (statbuf.st_mode) && !strcasecmp (dent->d_name, "default")) { gchar t[_POSIX_PATH_MAX]; - linklen=readlink(s, t, _POSIX_PATH_MAX); - t[linklen]=0; - defsess=g_strdup(t); + linklen = readlink (s, t, _POSIX_PATH_MAX); + t[linklen] = 0; + defsess = g_strdup (t); } /* If session script is readable/executable add it to the list */ - if(S_ISREG(statbuf.st_mode)) { + if (S_ISREG (statbuf.st_mode)) { - if((statbuf.st_mode & (S_IRUSR|S_IXUSR)) == (S_IRUSR|S_IXUSR) && - (statbuf.st_mode & (S_IRGRP|S_IXGRP)) == (S_IRGRP|S_IXGRP) && - (statbuf.st_mode & (S_IROTH|S_IXOTH)) == (S_IROTH|S_IXOTH)) + if ((statbuf.st_mode & (S_IRUSR|S_IXUSR)) == (S_IRUSR|S_IXUSR) && + (statbuf.st_mode & (S_IRGRP|S_IXGRP)) == (S_IRGRP|S_IXGRP) && + (statbuf.st_mode & (S_IROTH|S_IXOTH)) == (S_IROTH|S_IXOTH)) { - item=gtk_radio_menu_item_new_with_label(sessgrp, dent->d_name); - sessgrp=gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM (item)); - sessions=g_slist_append(sessions, dent->d_name); - gtk_menu_append(GTK_MENU(menu), item); - gtk_signal_connect(GTK_OBJECT (item), "activate", - GTK_SIGNAL_FUNC (gdm_login_session_handler), NULL); - gtk_widget_show(item); + item = gtk_radio_menu_item_new_with_label (sessgrp, dent->d_name); + sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item)); + sessions = g_slist_append (sessions, dent->d_name); + gtk_menu_append (GTK_MENU (menu), item); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (gdm_login_session_handler), NULL); + gtk_widget_show (GTK_WIDGET (item)); } else - syslog(LOG_ERR, "Wrong permissions on %s/%s. Should be readable/executable for all.", - GdmSessionDir, dent->d_name); + syslog (LOG_ERR, "Wrong permissions on %s/%s. Should be readable/executable for all.", + GdmSessionDir, dent->d_name); } - dent=readdir(sessdir); - g_free(s); + dent = readdir (sessdir); + g_free (s); } - if(!g_slist_length(sessgrp)) - gdm_login_abort(_("No session scripts found. Aborting!")); + if (!g_slist_length (sessgrp)) + gdm_login_abort (_("No session scripts found. Aborting!")); - if(!defsess) { - gtk_label_get(GTK_LABEL(GTK_BIN(g_slist_nth_data(sessgrp, 0))->child), &defsess); - syslog(LOG_WARNING, _("No default session link found. Using %s.\n"), defsess); + if (!defsess) { + gtk_label_get (GTK_LABEL (GTK_BIN (g_slist_nth_data (sessgrp, 0))->child), &defsess); + syslog (LOG_WARNING, _("No default session link found. Using %s.\n"), defsess); } } @@ -724,374 +714,765 @@ gdm_login_language_handler (GtkWidget *widget) { gchar *s; - gtk_label_get(GTK_LABEL(GTK_BIN(widget)->child), &curlang); - s=g_strdup_printf(_("%s language selected"), curlang); - gtk_label_set(GTK_LABEL(msg), s); - g_free(s); + if (!widget) + return; + + gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &curlang); + s = g_strdup_printf (_("%s language selected"), curlang); + gtk_label_set (GTK_LABEL (msg), s); + g_free (s); } static void -gdm_login_language_init(GtkWidget *menu) +gdm_login_language_init (GtkWidget *menu) { GtkWidget *item, *ammenu, *nzmenu, *omenu; FILE *langlist; char curline[256]; char *ctmp, *ctmp1, *ctmp2; - lastlang=_("Last"); - curlang=lastlang; - - item=gtk_radio_menu_item_new_with_label(NULL, lastlang); - languages=gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item)); - gtk_menu_append(GTK_MENU(menu), item); - gtk_signal_connect(GTK_OBJECT(item), "activate", gdm_login_language_handler, NULL); - gtk_widget_show(item); - - item=gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), item); - gtk_widget_show(item); - - item=gtk_menu_item_new_with_label(_("A-M")); - ammenu=gtk_menu_new(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), ammenu); - gtk_menu_append(GTK_MENU(menu), item); - gtk_widget_show(item); - - item=gtk_menu_item_new_with_label(_("N-Z")); - nzmenu=gtk_menu_new(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), nzmenu); - gtk_menu_append(GTK_MENU(menu), item); - gtk_widget_show(item); + if (!menu) + return; - item=gtk_menu_item_new_with_label(_("Other")); - omenu=gtk_menu_new(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), omenu); - gtk_menu_append(GTK_MENU(menu), item); - gtk_widget_show(item); + lastlang = _("Last"); + curlang = lastlang; - langlist = fopen(GdmLocaleFile, "r"); + item = gtk_radio_menu_item_new_with_label (NULL, lastlang); + languages = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item)); + gtk_menu_append (GTK_MENU(menu), item); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (gdm_login_language_handler), + NULL); + gtk_widget_show (GTK_WIDGET (item)); - if(!langlist) + item = gtk_menu_item_new(); + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (GTK_WIDGET (item)); + + item = gtk_menu_item_new_with_label (_("A-M")); + ammenu = gtk_menu_new(); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), GTK_WIDGET (ammenu)); + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (GTK_WIDGET (item)); + + item = gtk_menu_item_new_with_label (_("N-Z")); + nzmenu = gtk_menu_new(); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), nzmenu); + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show(GTK_WIDGET (item)); + + item = gtk_menu_item_new_with_label (_("Other")); + omenu = gtk_menu_new(); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), omenu); + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (GTK_WIDGET (item)); + + langlist = fopen (GdmLocaleFile, "r"); + + if (!langlist) return; - while(fgets(curline, sizeof(curline), langlist)) { + while (fgets (curline, sizeof (curline), langlist)) { - if(!isalpha(curline[0])) + if (!isalpha (curline[0])) continue; - ctmp1 = strchr(curline, ' '); - ctmp2 = strchr(curline, '\t'); - ctmp = curline + strlen(curline) - 1; + ctmp1 = strchr (curline, ' '); + ctmp2 = strchr (curline, '\t'); + ctmp = curline + strlen (curline) - 1; - if(ctmp1 && (ctmp1 < ctmp)) + if (ctmp1 && (ctmp1 < ctmp)) ctmp = ctmp1; - if(ctmp2 && (ctmp2 < ctmp)) + if (ctmp2 && (ctmp2 < ctmp)) ctmp = ctmp2; *ctmp = '\0'; - curline[0] = toupper(curline[0]); + curline[0] = toupper (curline[0]); - item=gtk_radio_menu_item_new_with_label(languages, curline); - languages=gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item)); + item = gtk_radio_menu_item_new_with_label (languages, curline); + languages = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item)); - if(curline[0] >= 'A' && curline[0] <= 'M') - gtk_menu_append(GTK_MENU(ammenu), item); - else if(curline[0] >= 'N' && curline[0] <= 'Z') - gtk_menu_append(GTK_MENU(nzmenu), item); + if (curline[0] >= 'A' && curline[0] <= 'M') + gtk_menu_append (GTK_MENU (ammenu), item); + else if (curline[0] >= 'N' && curline[0] <= 'Z') + gtk_menu_append (GTK_MENU (nzmenu), item); else - gtk_menu_append(GTK_MENU(omenu), item); + gtk_menu_append (GTK_MENU (omenu), item); - gtk_signal_connect(GTK_OBJECT(item), "activate", gdm_login_language_handler, NULL); - gtk_widget_show(item); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (gdm_login_language_handler), + NULL); + gtk_widget_show (GTK_WIDGET (item)); } - fclose(langlist); + fclose (langlist); } static gboolean -gdm_login_ctrl_handler(GIOChannel *source, GIOCondition cond, gint fd) +gdm_login_ctrl_handler (GIOChannel *source, GIOCondition cond, gint fd) { gchar buf[PIPE_SIZE]; gint len; gint i, x, y; - if(cond != G_IO_IN) - return(TRUE); + if (cond != G_IO_IN) + return (TRUE); - g_io_channel_read(source, buf, 1, &len); + g_io_channel_read (source, buf, 1, &len); - if(len!=1) - return(TRUE); + if (len!=1) + return (TRUE); - switch(buf[0]) { + switch (buf[0]) { case GDM_PROMPT: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); - buf[len-1]='\0'; - gtk_label_set(GTK_LABEL(label), buf); - gtk_widget_show(label); - gtk_entry_set_text(GTK_ENTRY(entry), ""); - gtk_entry_set_visibility(GTK_ENTRY(entry), TRUE); - gtk_widget_set_sensitive(entry, TRUE); - gtk_widget_grab_focus(entry); - gtk_widget_show(entry); + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); + buf[len-1] = '\0'; + gtk_label_set (GTK_LABEL (label), buf); + gtk_widget_show (GTK_WIDGET (label)); + gtk_entry_set_text (GTK_ENTRY (entry), ""); + gtk_entry_set_visibility (GTK_ENTRY (entry), TRUE); + gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE); + gtk_widget_grab_focus (GTK_WIDGET (entry)); + gtk_widget_show (GTK_WIDGET (entry)); break; case GDM_NOECHO: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); - buf[len-1]='\0'; - gtk_label_set(GTK_LABEL(label), buf); - gtk_widget_show(label); - gtk_entry_set_text(GTK_ENTRY(entry), ""); - gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); - gtk_widget_set_sensitive(entry, TRUE); - gtk_widget_grab_focus(entry); - gtk_widget_show(entry); + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); + buf[len-1] = '\0'; + gtk_label_set (GTK_LABEL(label), buf); + gtk_widget_show (GTK_WIDGET (label)); + gtk_entry_set_text (GTK_ENTRY (entry), ""); + gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE); + gtk_widget_grab_focus (GTK_WIDGET (entry)); + gtk_widget_show (GTK_WIDGET (entry)); break; case GDM_MSGERR: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); - buf[len-1]='\0'; - gtk_label_set(GTK_LABEL(msg), buf); - gtk_widget_show(msg); - g_print("\n"); + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); + 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 */ + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */ gdm_login_sesslang_lookup(); /* Lookup session and language */ - g_print("%s\n", session); + g_print ("%s\n", session); break; case GDM_LANG: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */ - g_print("%s\n", language); + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */ + g_print ("%s\n", language); break; case GDM_SSESS: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */ + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */ - if(savesess) - g_print("Y\n"); + if (savesess) + g_print ("Y\n"); else - g_print("\n"); + g_print ("\n"); break; case GDM_SLANG: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); /* Empty */ + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); /* Empty */ - if(savelang) - g_print("Y\n"); + if (savelang) + g_print ("Y\n"); else - g_print("\n"); + g_print ("\n"); break; case GDM_RESET: - g_io_channel_read(source, buf, PIPE_SIZE-1, &len); - buf[len-1]='\0'; + g_io_channel_read (source, buf, PIPE_SIZE-1, &len); + buf[len-1] = '\0'; - if(GdmQuiver) { - gdk_window_get_position(login->window, &x, &y); + if (GdmQuiver) { + gdk_window_get_position (login->window, &x, &y); for (i=32 ; i > 0 ; i=i/2) { - gdk_window_move(login->window, i+x, y); - gdk_window_move(login->window, x, y); - gdk_window_move(login->window, -i+x, y); - gdk_window_move(login->window, x, y); + gdk_window_move (login->window, i+x, y); + gdk_window_move (login->window, x, y); + gdk_window_move (login->window, -i+x, y); + gdk_window_move (login->window, x, y); } } - if(curuser) { - g_free(curuser); + if (curuser) { + g_free (curuser); curuser=NULL; } - g_print("\n"); + gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE); + gtk_widget_set_sensitive (GTK_WIDGET (browser), TRUE); + + g_print ("\n"); break; case GDM_QUIT: - exit(EXIT_SUCCESS); + exit (EXIT_SUCCESS); break; default: break; } - return(TRUE); + return (TRUE); +} + + +static void +gdm_login_browser_update (void) +{ + GList *list = users; + + gnome_icon_list_clear (GNOME_ICON_LIST (browser)); + + while (list) { + GdmLoginUser *user = list->data; + + gnome_icon_list_append_imlib (GNOME_ICON_LIST (browser), user->picture, user->login); + list = list->next; + } + + gnome_icon_list_thaw (GNOME_ICON_LIST (browser)); +} + + +static gboolean +gdm_login_browser_select (GtkWidget *widget, gint selected, GdkEvent *event) +{ + GdmLoginUser *user; + + if (!widget || !event) + return (TRUE); + + switch (event->type) { + + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + user = g_list_nth_data (users, selected); + + if (user && user->login) + gtk_entry_set_text (GTK_ENTRY (entry), user->login); + + break; + + case GDK_2BUTTON_PRESS: + user = g_list_nth_data (users, selected); + + if (user && user->login) + gtk_entry_set_text (GTK_ENTRY (entry), user->login); + + gtk_widget_set_sensitive (GTK_WIDGET (browser), FALSE); + g_print ("%s\n", gtk_entry_get_text (GTK_ENTRY (entry))); + break; + + default: + break; + } + + return (TRUE); +} + + +static gboolean +gdm_login_browser_unselect (GtkWidget *widget, gint selected, GdkEvent *event) +{ + if (!widget || !event) + return (TRUE); + + switch (event->type) { + + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + gtk_entry_set_text (GTK_ENTRY (entry), ""); + break; + + default: + break; + } + + return (TRUE); } static void -gdm_login_gui_init(void) +gdm_login_gui_init (void) { + GtkWidget *frame1, *frame2; + GtkWidget *mbox, *menu, *menubar, *item, *welcome; + GtkWidget *table, *stack, *hline1, *hline2; + GtkWidget *bbox = NULL; + GtkWidget *logoframe = NULL; GtkStyle *style; - GtkWidget *frame, *frame2, *hbox, *hline, *item, *lebox, *logo, *logobox; - GtkWidget *logoframe, *mbox, *menu, *menubar, *vbox, *welcome; gchar *greeting; + gint cols, rows; if(GdmGtkRC) - gtk_rc_parse(GdmGtkRC); - - rootwin=gdk_window_foreign_new (GDK_ROOT_WINDOW ()); - - login=gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_container_border_width(GTK_CONTAINER(login), 0); - - frame=gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); - gtk_container_border_width(GTK_CONTAINER(frame), 0); - gtk_container_add(GTK_CONTAINER(login), frame); - gtk_widget_show(frame); - - frame2=gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_IN); - gtk_container_border_width(GTK_CONTAINER(frame2), 2); - gtk_container_add(GTK_CONTAINER(frame), frame2); - gtk_widget_show(frame2); - - mbox=gtk_vbox_new(FALSE,0); - gtk_container_add(GTK_CONTAINER(frame2), mbox); - gtk_widget_show(mbox); - - menubar=gtk_menu_bar_new(); - gtk_box_pack_start(GTK_BOX(mbox), menubar, FALSE, FALSE, 0); - - menu=gtk_menu_new(); - gdm_login_session_init(menu); - sessmenu=gtk_menu_item_new_with_label(_("Session")); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), sessmenu); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(sessmenu), menu); - gtk_widget_show(sessmenu); - - menu=gtk_menu_new(); - gdm_login_language_init(menu); - langmenu=gtk_menu_item_new_with_label(_("Language")); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), langmenu); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(langmenu), menu); - gtk_widget_show(langmenu); - - if(GdmShutdownMenu) { - menu=gtk_menu_new(); - item=gtk_menu_item_new_with_label(_("Reboot...")); - gtk_menu_append(GTK_MENU(menu), item); - gtk_signal_connect(GTK_OBJECT (item), "activate", - GTK_SIGNAL_FUNC(gdm_login_reboot_handler), NULL); - gtk_widget_show(item); + gtk_rc_parse (GdmGtkRC); + + rootwin = gdk_window_foreign_new (GDK_ROOT_WINDOW ()); + + login = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_ref (login); + gtk_object_set_data_full (GTK_OBJECT (login), "login", login, + (GtkDestroyNotify) gtk_widget_unref); + gtk_window_set_title (GTK_WINDOW (login), "GDM Login"); + + frame1 = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_OUT); + gtk_container_border_width (GTK_CONTAINER (frame1), 0); + gtk_container_add (GTK_CONTAINER (login), frame1); + gtk_object_set_data_full (GTK_OBJECT (login), "frame1", frame1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_ref (GTK_WIDGET (frame1)); + gtk_widget_show (GTK_WIDGET (frame1)); + + frame2 = gtk_frame_new(NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN); + gtk_container_border_width (GTK_CONTAINER (frame2), 2); + gtk_container_add (GTK_CONTAINER (frame1), frame2); + gtk_object_set_data_full (GTK_OBJECT (login), "frame2", frame2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_ref (GTK_WIDGET (frame2)); + gtk_widget_show (GTK_WIDGET (frame2)); + + mbox = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (mbox); + gtk_object_set_data_full (GTK_OBJECT (login), "mbox", mbox, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (mbox); + gtk_container_add (GTK_CONTAINER (frame2), mbox); + + menubar = gtk_menu_bar_new(); + gtk_widget_ref (GTK_WIDGET (menubar)); + gtk_box_pack_start (GTK_BOX (mbox), menubar, FALSE, FALSE, 0); + + menu = gtk_menu_new(); + gdm_login_session_init (menu); + sessmenu = gtk_menu_item_new_with_label (_("Session")); + gtk_menu_bar_append (GTK_MENU_BAR(menubar), sessmenu); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (sessmenu), menu); + gtk_widget_show (GTK_WIDGET (sessmenu)); + + menu = gtk_menu_new(); + gdm_login_language_init (menu); + langmenu = gtk_menu_item_new_with_label (_("Language")); + gtk_menu_bar_append (GTK_MENU_BAR (menubar), langmenu); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (langmenu), menu); + gtk_widget_show (GTK_WIDGET (langmenu)); + + if (GdmSystemMenu) { + menu = gtk_menu_new(); + item = gtk_menu_item_new_with_label (_("Reboot...")); + gtk_menu_append (GTK_MENU (menu), item); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (gdm_login_reboot_handler), + NULL); + gtk_widget_show (GTK_WIDGET (item)); - item=gtk_menu_item_new_with_label(_("Halt...")); - gtk_menu_append(GTK_MENU(menu), item); - gtk_signal_connect(GTK_OBJECT(item), "activate", - GTK_SIGNAL_FUNC(gdm_login_halt_handler), NULL); - gtk_widget_show(item); + item = gtk_menu_item_new_with_label (_("Halt...")); + gtk_menu_append (GTK_MENU (menu), item); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (gdm_login_halt_handler), + NULL); + gtk_widget_show (GTK_WIDGET (item)); - item=gtk_menu_item_new_with_label(_("System")); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), item); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu); - gtk_widget_show(item); + item = gtk_menu_item_new_with_label (_("System")); + gtk_menu_bar_append (GTK_MENU_BAR (menubar), item); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu); + gtk_widget_show (GTK_WIDGET (item)); } - if(GdmChooserMenu) { - item=gtk_menu_item_new_with_label(_("Host chooser")); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), item); - gtk_widget_show(item); - } - - if(GdmIconify) { - if(access(GdmIconFile, R_OK)) { - syslog(LOG_WARNING, _("Can't open icon file: %s. Suspending iconify feature!"), GdmIconFile); - GdmIconify=0; + if (GdmIcon) { + if (access (GdmIcon, R_OK)) { + syslog (LOG_WARNING, _("Can't open icon file: %s. Suspending iconify feature!"), GdmIcon); } else { - item=gtk_menu_item_new_with_label(_("Iconify")); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), item); - gtk_signal_connect(GTK_OBJECT(item), "activate", - GTK_SIGNAL_FUNC(gdm_login_iconify_handler), NULL); - gtk_widget_show(item); + item = gtk_menu_item_new_with_label (_("Iconify")); + gtk_menu_bar_append (GTK_MENU_BAR (menubar), item); + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (gdm_login_iconify_handler), + NULL); + gtk_widget_show (GTK_WIDGET (item)); } } - hbox=gtk_hbox_new(FALSE, 0); - gtk_container_border_width(GTK_CONTAINER(hbox), 10); - gtk_box_pack_end(GTK_BOX(mbox), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - if (GdmLogoFilename && !access(GdmLogoFilename, R_OK)) { - logobox=gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), logobox, FALSE, FALSE, 0); + if (GdmBrowser) + rows = 2; + else + rows = 1; + + if (GdmLogo) + cols = 2; + else + cols = 1; + + table = gtk_table_new (rows, cols, FALSE); + gtk_widget_ref (table); + gtk_object_set_data_full (GTK_OBJECT (login), "table", table, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (table); + gtk_box_pack_start (GTK_BOX (mbox), table, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (table), 10); + gtk_table_set_row_spacings (GTK_TABLE (table), 10); + gtk_table_set_col_spacings (GTK_TABLE (table), 10); + + if (GdmBrowser) { + GtkStyle *style; + GdkColor bbg = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; + GtkWidget *bframe; + GtkWidget *scrollbar; + + /* Find background style for browser */ + style = gtk_style_copy (login->style); + style->bg[GTK_STATE_NORMAL] = bbg; + gtk_widget_push_style (style); + + /* Icon list */ + if (maxwidth < GdmIconMaxWidth/2) + maxwidth = (gint) GdmIconMaxWidth/2; + + browser = GNOME_ICON_LIST (gnome_icon_list_new (maxwidth+20, NULL, FALSE)); + gnome_icon_list_freeze (GNOME_ICON_LIST (browser)); + gnome_icon_list_set_separators (GNOME_ICON_LIST (browser), " /-_."); + gnome_icon_list_set_row_spacing (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_col_spacing (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_icon_border (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_text_spacing (GNOME_ICON_LIST (browser), 2); + gnome_icon_list_set_selection_mode (GNOME_ICON_LIST (browser), GTK_SELECTION_SINGLE); + gtk_signal_connect (GTK_OBJECT (browser), "select_icon", + GTK_SIGNAL_FUNC (gdm_login_browser_select), NULL); + gtk_signal_connect (GTK_OBJECT (browser), "unselect_icon", + GTK_SIGNAL_FUNC (gdm_login_browser_unselect), NULL); + gtk_widget_pop_style(); + + /* Browser 3D frame */ + bframe = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (bframe), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER(bframe), GTK_WIDGET (browser)); + + /* Browser scroll bar */ + scrollbar = gtk_vscrollbar_new (browser->adj); + + /* Box containing all browser functionality */ + bbox = gtk_hbox_new (0, 0); + gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (bframe), 1, 1, 0); + gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (scrollbar), 0, 0, 0); + gtk_widget_show_all (GTK_WIDGET (bbox)); + } - logoframe=gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(logoframe), GTK_SHADOW_IN); - gtk_box_pack_start(GTK_BOX(logobox), logoframe, FALSE, FALSE, 0); - gtk_widget_show(logoframe); + if (GdmLogo && !access (GdmLogo, R_OK)) { + GtkWidget *logo; - logo=gnome_pixmap_new_from_file(GdmLogoFilename); - gtk_container_add(GTK_CONTAINER(logoframe), logo); - gtk_widget_show(logo); + logoframe = gtk_frame_new (NULL); + gtk_widget_ref (logoframe); + gtk_object_set_data_full (GTK_OBJECT (login), "logoframe", logoframe, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (logoframe); + gtk_frame_set_shadow_type (GTK_FRAME (logoframe), GTK_SHADOW_IN); - gtk_widget_show(logobox); + logo = gnome_pixmap_new_from_file (GdmLogo); + gtk_container_add (GTK_CONTAINER (logoframe), logo); + gtk_widget_show (GTK_WIDGET (logo)); } - vbox=gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); - gtk_container_border_width(GTK_CONTAINER(vbox), 10); - gtk_widget_show(vbox); + stack = gtk_table_new (6, 1, FALSE); + gtk_widget_ref (stack); + gtk_object_set_data_full (GTK_OBJECT (login), "stack", stack, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (stack); style = gtk_style_new(); - gdk_font_unref(style->font); - style->font = gdk_font_load (GdmMessageFont); - gtk_widget_push_style(style); - greeting=gdm_parse_enriched_string(GdmMessageText); - welcome=gtk_label_new(greeting); + gdk_font_unref (style->font); + style->font = gdk_font_load (GdmFont); + gtk_widget_push_style (style); + + greeting = gdm_parse_enriched_string (GdmWelcome); + welcome = gtk_label_new (greeting); + gtk_widget_set_name(welcome, "Welcome"); g_free(greeting); - gtk_box_pack_start(GTK_BOX(vbox), welcome, TRUE, FALSE, 10); - gtk_widget_show(welcome); - gtk_widget_pop_style(); - - msg=gtk_label_new("Please enter your login"); - gtk_box_pack_end(GTK_BOX(vbox), msg, FALSE, TRUE, 0); - gtk_widget_show(msg); - - hline=gtk_hseparator_new(); - gtk_box_pack_end(GTK_BOX(vbox), hline, FALSE, FALSE, 10); - gtk_widget_show(hline); - - lebox=gtk_vbox_new(FALSE, 0); - gtk_container_border_width(GTK_CONTAINER(lebox), 5); - gtk_box_pack_end(GTK_BOX(vbox), lebox, FALSE, FALSE, 5); - gtk_widget_show(lebox); - - label=gtk_label_new("Login:"); - gtk_box_pack_start(GTK_BOX(lebox), label, FALSE, FALSE, 5); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_widget_show(label); - - entry=gtk_entry_new_with_max_length(32); - gtk_box_pack_start(GTK_BOX(lebox), entry, FALSE, FALSE, 5); - gtk_entry_set_text(GTK_ENTRY(entry), ""); - gtk_signal_connect_object(GTK_OBJECT(entry), - "key_press_event", - GTK_SIGNAL_FUNC(gdm_login_entry_handler), - NULL); - gtk_widget_show(entry); - - hline=gtk_hseparator_new(); - gtk_box_pack_end(GTK_BOX(vbox), hline, FALSE, FALSE, 10); - gtk_widget_show(hline); - - gtk_widget_grab_focus(entry); - gtk_window_set_focus(GTK_WINDOW (login), entry); - gtk_window_set_policy(GTK_WINDOW (login), 1, 1, 1); - gtk_window_position(GTK_WINDOW (login), GTK_WIN_POS_CENTER); - - gtk_widget_set_usize(GTK_WIDGET(login), - (gint)gdk_screen_width() * 0.5, - 0); - - gtk_widget_show_all(login); + gtk_widget_ref (welcome); + gtk_object_set_data_full (GTK_OBJECT (login), "welcome", welcome, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (welcome); + gtk_table_attach (GTK_TABLE (stack), welcome, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + + gtk_widget_pop_style (); + + hline1 = gtk_hseparator_new (); + gtk_widget_ref (hline1); + gtk_object_set_data_full (GTK_OBJECT (login), "hline1", hline1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hline1); + gtk_table_attach (GTK_TABLE (stack), hline1, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 10); + + label = gtk_label_new (_("Login:")); + gtk_widget_ref (label); + gtk_object_set_data_full (GTK_OBJECT (login), "label", label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (stack), label, 0, 1, 2, 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + gtk_misc_set_padding (GTK_MISC (label), 10, 5); + + entry = gtk_entry_new_with_max_length (32); + gtk_widget_ref (entry); + gtk_object_set_data_full (GTK_OBJECT (login), "entry", entry, + (GtkDestroyNotify) gtk_widget_unref); + gtk_entry_set_text (GTK_ENTRY (entry), ""); + gtk_widget_show (entry); + gtk_table_attach (GTK_TABLE (stack), entry, 0, 1, 3, 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 10, 0); + gtk_signal_connect_object (GTK_OBJECT(entry), + "key_press_event", + GTK_SIGNAL_FUNC (gdm_login_entry_handler), + NULL); + + hline2 = gtk_hseparator_new (); + gtk_widget_ref (hline2); + gtk_object_set_data_full (GTK_OBJECT (login), "hline2", hline2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hline2); + gtk_table_attach (GTK_TABLE (stack), hline2, 0, 1, 4, 5, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 10); + + msg = gtk_label_new (_("Please enter your login")); + gtk_widget_set_name(msg, "Message"); + gtk_widget_ref (msg); + gtk_object_set_data_full (GTK_OBJECT (login), "msg", msg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (msg); + gtk_table_attach (GTK_TABLE (stack), msg, 0, 1, 5, 6, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 10, 10); + + /* Put it nicely together */ + + if (GdmBrowser && GdmLogo) { + gtk_table_attach (GTK_TABLE (table), bbox, 0, 2, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + gtk_table_attach (GTK_TABLE (table), logoframe, 0, 1, 1, 2, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), 0, 0); + gtk_table_attach (GTK_TABLE (table), stack, 1, 2, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + } + else if (GdmBrowser) { + gtk_table_attach (GTK_TABLE (table), bbox, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + gtk_table_attach (GTK_TABLE (table), stack, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + } + else if (GdmLogo) { + gtk_table_attach (GTK_TABLE (table), logoframe, 0, 1, 0, 1, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), 0, 0); + gtk_table_attach (GTK_TABLE (table), stack, 1, 2, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + } + else + gtk_table_attach (GTK_TABLE (table), stack, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + + gtk_widget_grab_focus (GTK_WIDGET (entry)); + gtk_window_set_focus (GTK_WINDOW (login), entry); + gtk_window_set_policy (GTK_WINDOW (login), 1, 1, 1); + gtk_window_position (GTK_WINDOW (login), GTK_WIN_POS_CENTER); + + if (GdmBrowser) + gtk_widget_set_usize (GTK_WIDGET (login), + (gint) gdk_screen_width() * 0.6, + (gint) gdk_screen_height() * 0.8); + else + gtk_widget_set_usize (GTK_WIDGET (login), + (gint) gdk_screen_width() * 0.5, + 0); + + gtk_widget_show_all (GTK_WIDGET (login)); + gdk_keyboard_grab (rootwin, TRUE, CurrentTime); +} + + +static gint +gdm_login_sort_func (gpointer d1, gpointer d2) +{ + GdmLoginUser *a = d1; + GdmLoginUser *b = d2; + + if (!d1 || !d2) + return (0); + + return (strcmp (a->login, b->login)); +} + + +static GdmLoginUser * +gdm_login_user_alloc (gchar *logname, uid_t uid, gchar *homedir) +{ + GdmLoginUser *user; + gboolean fileok; + gchar *gnomedir = NULL; + GdkImlibImage *img = NULL; + + user = g_new0 (GdmLoginUser, 1); + + if (!user) + return (NULL); + + user->uid = uid; + user->login = g_strdup (logname); + user->homedir = g_strdup (homedir); + + gnomedir = g_strconcat (homedir, "/.gnome", NULL); + + fileok = gdm_file_check ("gdm_login_user_alloc", uid, gnomedir, "photo", + FALSE, GdmUserMaxFile, GdmRelaxPerms); + + if (fileok) { + gchar *filename; + + filename = g_strconcat (gnomedir, "/photo", NULL); + img = gdk_imlib_load_image (filename); + g_free (filename); + } + else { + gchar *filename; + + filename = g_strconcat (GdmGlobalFaceDir, "/", logname, NULL); + + if (access (filename, R_OK) == 0) + img = gdk_imlib_load_image (filename); + + g_free (filename); + } + + g_free (gnomedir); + + if(img) { + gint w, h; + + w = img->rgb_width; + h = img->rgb_height; + + if (w>h && w > GdmIconMaxWidth) { + h = h * ((gfloat) GdmIconMaxWidth/w); + w = GdmIconMaxWidth; + } + else if (h>GdmIconMaxHeight) { + w = w * ((gfloat) GdmIconMaxHeight/h); + h = GdmIconMaxHeight; + } + + maxwidth = MAX (maxwidth, w); + user->picture = gdk_imlib_clone_scaled_image (img, w, h); + gdk_imlib_destroy_image (img); + } + else + user->picture=defface; + + return (user); +} + + +static gint +gdm_login_check_exclude (gchar *logname) +{ + GSList *list = exclude; + + while (list && list->data) { + if (! strcasecmp (logname, (gchar *) list->data)) + return (TRUE); + + list = list->next; + } + + return (FALSE); +} + + +static gint +gdm_login_check_shell (gchar *usersh) +{ + gint found = 0; + gchar *csh; + + setusershell (); + + while ((csh = getusershell ()) != NULL) + if (! strcmp (csh, usersh)) + found = 1; + + endusershell (); + + return (found); +} + + +static void +gdm_login_users_init (void) +{ + GdmLoginUser *user; + struct passwd *pwent; + + if (access (GdmDefaultFace, R_OK)) { + syslog (LOG_WARNING, _("Can't open DefaultImage: %s. Suspending face browser!"), GdmDefaultFace); + GdmBrowser = 0; + return; + } + else + defface = gdk_imlib_load_image (GdmDefaultFace); + + if (GdmExclude) { + gchar *s = strtok (GdmExclude, ","); + exclude = g_slist_append (exclude, g_strdup (s)); + + while ((s = strtok (NULL, ","))) + exclude = g_slist_append (exclude, g_strdup (s)); + } + + pwent = getpwent(); + + while (pwent != NULL) { + + if (pwent->pw_shell && + gdm_login_check_shell (pwent->pw_shell) && + !gdm_login_check_exclude (pwent->pw_name)) { + + user = gdm_login_user_alloc(pwent->pw_name, + pwent->pw_uid, + pwent->pw_dir); + + if (user) + users = g_list_insert_sorted(users, user, + (GCompareFunc) gdm_login_sort_func); + } + + pwent = getpwent(); + } } @@ -1105,45 +1486,50 @@ main (int argc, char *argv[]) /* Avoid creating ~gdm/.gnome stuff */ gnome_do_not_create_directories = TRUE; - openlog("gdmlogin", LOG_PID, LOG_DAEMON); + openlog ("gdmlogin", LOG_PID, LOG_DAEMON); - gnome_init("gdmlogin", VERSION, argc, argv); - gnome_sound_shutdown (); - gnome_preferences_set_dialog_position(GTK_WIN_POS_CENTER); + gnome_init ("gdmlogin", VERSION, argc, argv); + gnome_sound_shutdown(); + gnome_preferences_set_dialog_position (GTK_WIN_POS_CENTER); gdm_login_parse_config(); + + if (GdmBrowser) + gdm_login_users_init (); + gdm_login_gui_init(); + if (GdmBrowser) + gdm_login_browser_update(); + hup.sa_handler = (void *) gdm_login_done; hup.sa_flags = 0; sigemptyset(&hup.sa_mask); - if(sigaction(SIGHUP, &hup, NULL) < 0) - gdm_login_abort(_("main: Error setting up HUP signal handler")); + if (sigaction (SIGHUP, &hup, NULL) < 0) + gdm_login_abort (_("main: Error setting up HUP signal handler")); - if(sigaction(SIGINT, &hup, NULL) < 0) - gdm_login_abort(_("main: Error setting up INT signal handler")); + if (sigaction (SIGINT, &hup, NULL) < 0) + gdm_login_abort (_("main: Error setting up INT signal handler")); - if(sigaction(SIGTERM, &hup, NULL) < 0) - gdm_login_abort(_("main: Error setting up TERM signal handler")); + if (sigaction (SIGTERM, &hup, NULL) < 0) + gdm_login_abort (_("main: Error setting up TERM signal handler")); - sigfillset(&mask); - sigdelset(&mask, SIGTERM); - sigdelset(&mask, SIGHUP); - sigdelset(&mask, SIGINT); + sigfillset (&mask); + sigdelset (&mask, SIGTERM); + sigdelset (&mask, SIGHUP); + sigdelset (&mask, SIGINT); - if(sigprocmask(SIG_SETMASK, &mask, NULL) == -1) { - syslog(LOG_ERR, "Could not set signal mask!"); - exit(EXIT_FAILURE); - } - - ctrlch = g_io_channel_unix_new(STDIN_FILENO); - g_io_channel_init(ctrlch); - g_io_add_watch(ctrlch, - G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, - (GIOFunc) gdm_login_ctrl_handler, - NULL); - g_io_channel_unref(ctrlch); + if (sigprocmask (SIG_SETMASK, &mask, NULL) == -1) + gdm_login_abort (_("Could not set signal mask!")); + + ctrlch = g_io_channel_unix_new (STDIN_FILENO); + g_io_channel_init (ctrlch); + g_io_add_watch (ctrlch, + G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, + (GIOFunc) gdm_login_ctrl_handler, + NULL); + g_io_channel_unref (ctrlch); gtk_main(); |