rpms/gdm/devel gdm-2.6.0.8-fix-halt-command.patch, NONE, 1.1 gdm-2.6.0.8-process-all-messages.patch, NONE, 1.1 gdm.spec, 1.78, 1.79

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Thu Apr 28 20:44:54 UTC 2005


Author: rstrode

Update of /cvs/dist/rpms/gdm/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv29292

Modified Files:
	gdm.spec 
Added Files:
	gdm-2.6.0.8-fix-halt-command.patch 
	gdm-2.6.0.8-process-all-messages.patch 
Log Message:
- Fix halt command (bug 156299)
- Process all messages sent to the greeter in a read, not just
  the first


gdm-2.6.0.8-fix-halt-command.patch:
 gdm.h |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

--- NEW FILE gdm-2.6.0.8-fix-halt-command.patch ---
--- gdm-2.6.0.8/daemon/gdm.h.fix-halt-command	2005-04-28 10:50:38.000000000 -0400
+++ gdm-2.6.0.8/daemon/gdm.h	2005-04-28 10:50:10.000000000 -0400
@@ -136,7 +136,7 @@ enum {
 #define GDM_KEY_ADD_GTK_MODULES "daemon/AddGtkModules=false"
 #define GDM_KEY_GTK_MODULES_LIST "daemon/GtkModulesList="
 #define GDM_KEY_GROUP "daemon/Group=gdm"
-#define GDM_KEY_HALT "daemon/DefaultPath=" HALT_COMMAND
+#define GDM_KEY_HALT "daemon/HaltCommand=" HALT_COMMAND
 #define GDM_KEY_INITDIR "daemon/DisplayInitDir=" EXPANDED_SYSCONFDIR "/gdm/Init"
 #define GDM_KEY_KILLIC "daemon/KillInitClients=true"
 #define GDM_KEY_LOGDIR "daemon/LogDir=" EXPANDED_LOGDIR

gdm-2.6.0.8-process-all-messages.patch:
 greeter.c | 1042 +++++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 700 insertions(+), 342 deletions(-)

--- NEW FILE gdm-2.6.0.8-process-all-messages.patch ---
Note this patch needs to be refactored.

It contains too much repetitive code.
--- gdm-2.6.0.8/gui/greeter/greeter.c.process-all-messages	2005-04-28 15:42:20.000000000 -0400
+++ gdm-2.6.0.8/gui/greeter/greeter.c	2005-04-28 15:42:31.000000000 -0400
@@ -226,362 +226,720 @@ greeter_parse_config (void)
     }
 }
 
-static gboolean
-greeter_ctrl_handler (GIOChannel *source,
-		      GIOCondition cond,
-		      gint fd)
+static void
+greeter_ctrl_handle_messages (const gchar *messages)
 {
-    gchar buf[PIPE_SIZE];
-    gsize len;
     GtkWidget *dlg;
-    char *tmp;
+    const gchar *p, *q;
     char *session;
+    char *tmp;
+    gchar *args;
+    gint length;
     GreeterItemInfo *conversation_info;
     static GnomeCanvasItem *disabled_cover = NULL;
-    gchar *language;
-
-    /* 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_chars (source, buf, 1, &len, NULL);
-      
-      if (len != 1)
-	return TRUE;
-    }  while (buf[0] && buf[0] != STX);
-
-    /* Read opcode */
-    g_io_channel_read_chars (source, buf, 1, &len, NULL);
-
-    /* If opcode couldn't be read */
-    if (len != 1)
-      return TRUE;
-
-    /* Parse opcode */
-    switch (buf[0]) {
-    case GDM_SETLOGIN:
-	/* somebody is trying to fool us this is the user that
-	 * wants to log in, and well, we are the gullible kind */
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL);
-	buf[len-1] = '\0';
-	
-	greeter_item_pam_set_user (buf);
-	if (ve_string_empty (buf))
-	  greeter_item_ulist_enable ();
-	else
-	  greeter_item_ulist_disable ();
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_PROMPT:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL);
-	buf[len-1] = '\0';
-
-	tmp = ve_locale_to_utf8 (buf);
-	if (tmp != NULL && strcmp (tmp, _("Username:")) == 0) {
-		gdm_common_login_sound ();
-		greeter_probably_login_prompt = TRUE;
-	} else {
-		greeter_probably_login_prompt = FALSE;
-	}
-	greeter_item_pam_prompt (tmp, 128, TRUE);
-	g_free (tmp);
-	break;
-
-    case GDM_NOECHO:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL);
-	buf[len-1] = '\0';
-
-	tmp = ve_locale_to_utf8 (buf);
-	greeter_item_pam_prompt (tmp, 128, FALSE);
-	g_free (tmp);
-	break;
-
-    case GDM_MSG:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL);
-	buf[len-1] = '\0';
-	tmp = ve_locale_to_utf8 (buf);
-	greeter_item_pam_message (tmp);
-	g_free (tmp);
-	printf ("%c\n", STX);
-	fflush (stdout);
-
-	break;
-
-    case GDM_ERRBOX:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL);
-	buf[len-1] = '\0';
-
-	tmp = ve_locale_to_utf8 (buf);
-	greeter_item_pam_error (tmp);
-	g_free (tmp);
-	
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_ERRDLG:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL);
-	buf[len-1] = '\0';
-
-	/* we should be now fine for focusing new windows */
-	gdm_wm_focus_new_windows (TRUE);
-
-	tmp = ve_locale_to_utf8 (buf);
-	dlg = ve_hig_dialog_new (NULL /* parent */,
-				 GTK_DIALOG_MODAL /* flags */,
-				 GTK_MESSAGE_ERROR,
-				 GTK_BUTTONS_OK,
-				 FALSE /* markup */,
-				 tmp,
-				 /* avoid warning */ "%s", "");
-	g_free (tmp);
-
-	gdm_wm_center_window (GTK_WINDOW (dlg));
-
-	gdm_wm_no_login_focus_push ();
-	gtk_dialog_run (GTK_DIALOG (dlg));
-	gtk_widget_destroy (dlg);
-	gdm_wm_no_login_focus_pop ();
-	
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_SESS:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-	buf[len-1] = '\0';
-
-	tmp = ve_locale_to_utf8 (buf);
-	session = greeter_session_lookup (tmp);
-	g_free (tmp);
-	tmp = ve_locale_from_utf8 (session);
-	printf ("%c%s\n", STX, tmp);
-	fflush (stdout);
-	g_free (session);
-	g_free (tmp);
-	break;
-
-    case GDM_LANG:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-	buf[len-1] = '\0';
-	language = greeter_language_get_language (buf);
-	printf ("%c%s\n", STX, language);
-	fflush (stdout);
-	g_free (language);
-	break;
-
-    case GDM_SSESS:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	if (greeter_save_session ())
-	  printf ("%cY\n", STX);
-	else
-	  printf ("%c\n", STX);
-	fflush (stdout);
-	
-	break;
-
-    case GDM_SLANG:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	if (greeter_language_get_save_language ())
-	    printf ("%cY\n", STX);
-	else
-	    printf ("%c\n", STX);
-	fflush (stdout);
-
-	break;
-
-    case GDM_RESET:
-	/* fall thru to reset */
-
-    case GDM_RESETOK:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-	buf[len-1] = '\0';
-
-	conversation_info = greeter_lookup_id ("pam-conversation");
-	
-	if (conversation_info)
-	  {
-	    tmp = ve_locale_to_utf8 (buf);
-	    g_object_set (G_OBJECT (conversation_info->item),
-			  "text", tmp,
-			  NULL);
-	    g_free (tmp);
-	  }
-
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_QUIT:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	greeter_item_timed_stop ();
-
-	if (require_quarter) {
-		/* we should be now fine for focusing new windows */
-		gdm_wm_focus_new_windows (TRUE);
-
-		dlg = ve_hig_dialog_new (NULL /* parent */,
-					 GTK_DIALOG_MODAL /* flags */,
-					 GTK_MESSAGE_INFO,
-					 GTK_BUTTONS_OK,
-					 FALSE /* markup */,
-					 /* translators:  This is a nice and evil eggie text, translate
-					  * to your favourite currency */
-					 _("Please insert 25 cents "
-					   "to log in."),
-					 /* avoid warning */ "%s", "");
-		gdm_wm_center_window (GTK_WINDOW (dlg));
-
-		gdm_wm_no_login_focus_push ();
-		gtk_dialog_run (GTK_DIALOG (dlg));
-		gtk_widget_destroy (dlg);
-		gdm_wm_no_login_focus_pop ();
-	}
-
-	greeter_item_pam_leftover_messages ();
-
-	gdk_flush ();
-
-	printf ("%c\n", STX);
-	fflush (stdout);
-
-	/* screw gtk_main_quit, we want to make sure we definately die */
-	_exit (EXIT_SUCCESS);
-	break;
-
-    case GDM_STARTTIMER:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	greeter_item_timed_start ();
-	
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_STOPTIMER:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	greeter_item_timed_stop ();
-
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_STARTTHROBBER:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-    	greeter_item_throbber_start (len > 1);
-
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
+    gchar *language, opcode;
+    gint message_count = 0;
+    
+    for (p = messages; *p != '\0'; p++) {
 
-    case GDM_STOPTHROBBER:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
+          while (*p != '\0' && *p != STX)
+            p++;
 
-	greeter_item_throbber_stop ();
+          if (*p == '\0')
+            goto out;
 
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break; 
+          p++;
+
+          if (*p == '\0')
+            goto out;
+
+          args = "";
+          opcode = *p;
+          message_count++;
+          /* Parse opcode */
+          switch (opcode) {
+            case GDM_SETLOGIN:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+                
+              greeter_item_pam_set_user (args);
+              if (ve_string_empty (args))
+                greeter_item_ulist_enable ();
+              else
+                greeter_item_ulist_disable ();
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_PROMPT:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              tmp = ve_locale_to_utf8 (args);
+              if (tmp != NULL && strcmp (tmp, _("Username:")) == 0) {
+                    gdm_common_login_sound ();
+                    greeter_probably_login_prompt = TRUE;
+              } else {
+                    greeter_probably_login_prompt = FALSE;
+              }
+              greeter_item_pam_prompt (tmp, 128, TRUE);
+              g_free (tmp);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_NOECHO:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              tmp = ve_locale_to_utf8 (args);
+              greeter_item_pam_prompt (tmp, 128, FALSE);
+              g_free (tmp);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_MSG:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              tmp = ve_locale_to_utf8 (args);
+              greeter_item_pam_message (tmp);
+              g_free (tmp);
+              printf ("%c\n", STX);
+              fflush (stdout);
+
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_ERRBOX:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              tmp = ve_locale_to_utf8 (args);
+              greeter_item_pam_error (tmp);
+              g_free (tmp);
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_ERRDLG:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              /* we should be now fine for focusing new windows */
+              gdm_wm_focus_new_windows (TRUE);
+
+              tmp = ve_locale_to_utf8 (args);
+              dlg = ve_hig_dialog_new (NULL /* parent */,
+                                       GTK_DIALOG_MODAL /* flags */,
+                                       GTK_MESSAGE_ERROR,
+                                       GTK_BUTTONS_OK,
+                                       FALSE /* markup */,
+                                       tmp,
+                                       /* avoid warning */ "%s", "");
+              g_free (tmp);
+
+              gdm_wm_center_window (GTK_WINDOW (dlg));
+
+              gdm_wm_no_login_focus_push ();
+              gtk_dialog_run (GTK_DIALOG (dlg));
+              gtk_widget_destroy (dlg);
+              gdm_wm_no_login_focus_pop ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_SESS:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              tmp = ve_locale_to_utf8 (args);
+              session = greeter_session_lookup (tmp);
+              g_free (tmp);
+              tmp = ve_locale_from_utf8 (session);
+              printf ("%c%s\n", STX, tmp);
+              fflush (stdout);
+              g_free (session);
+              g_free (tmp);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_LANG:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              language = greeter_language_get_language (args);
+              printf ("%c%s\n", STX, language);
+              fflush (stdout);
+              g_free (language);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_SSESS:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              if (greeter_save_session ())
+                printf ("%cY\n", STX);
+              else
+                printf ("%c\n", STX);
+              fflush (stdout);
+
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_SLANG:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              if (greeter_language_get_save_language ())
+                printf ("%cY\n", STX);
+              else
+                printf ("%c\n", STX);
+              fflush (stdout);
+
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_RESET:
+              /* fall thru to reset */
+
+            case GDM_RESETOK:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              conversation_info = greeter_lookup_id ("pam-conversation");
+
+              if (conversation_info)
+                {
+                  tmp = ve_locale_to_utf8 (args);
+                  g_object_set (G_OBJECT (conversation_info->item),
+                                "text", tmp,
+                                NULL);
+                  g_free (tmp);
+                }
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_QUIT:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              greeter_item_timed_stop ();
+
+              if (require_quarter) {
+                    /* we should be now fine for focusing new windows */
+                    gdm_wm_focus_new_windows (TRUE);
+
+                    dlg = ve_hig_dialog_new (NULL /* parent */,
+                                             GTK_DIALOG_MODAL /* flags */,
+                                             GTK_MESSAGE_INFO,
+                                             GTK_BUTTONS_OK,
+                                             FALSE /* markup */,
+                                             /* translators:  This is a nice and evil eggie text, translate
+                                              * to your favourite currency */
+                                             _("Please insert 25 cents "
+                                               "to log in."),
+                                             /* avoid warning */ "%s", "");
+                    gdm_wm_center_window (GTK_WINDOW (dlg));
+
+                    gdm_wm_no_login_focus_push ();
+                    gtk_dialog_run (GTK_DIALOG (dlg));
+                    gtk_widget_destroy (dlg);
+                    gdm_wm_no_login_focus_pop ();
+              }
+
+              greeter_item_pam_leftover_messages ();
+
+              gdk_flush ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+
+              /* screw gtk_main_quit, we want to make sure we definately die */
+              _exit (EXIT_SUCCESS);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_STARTTIMER:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              greeter_item_timed_start ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_STOPTIMER:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              greeter_item_timed_stop ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_STARTTHROBBER:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              greeter_item_throbber_start (length > 1);
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_STOPTHROBBER:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              greeter_item_throbber_stop ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break; 
+
+            case GDM_DISABLE:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              gtk_widget_set_sensitive (window, FALSE);
+
+              if (disabled_cover == NULL)
+                {
+                  disabled_cover = gnome_canvas_item_new
+                      (gnome_canvas_root (GNOME_CANVAS (canvas)),
+                       GNOME_TYPE_CANVAS_RECT,
+                       "x1", 0.0,
+                       "y1", 0.0,
+                       "x2", (double)canvas->allocation.width,
+                       "y2", (double)canvas->allocation.height,
+                       "fill_color_rgba", (guint)0x00000088,
+                       NULL);
+                }
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_ENABLE:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              gtk_widget_set_sensitive (window, TRUE);
+
+              if (disabled_cover != NULL)
+                {
+                  gtk_object_destroy (GTK_OBJECT (disabled_cover));
+                  disabled_cover = NULL;
+                }
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+              /* These are handled separately so ignore them here and send
+               * back a NULL response so that the daemon quits sending them */
+            case GDM_NEEDPIC:
+            case GDM_READPIC:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_NOFOCUS:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              gdm_wm_no_login_focus_push ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_FOCUS:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              gdm_wm_no_login_focus_pop ();
+
+              printf ("%c\n", STX);
+              fflush (stdout);
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            case GDM_SAVEDIE:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+ 
+              /* Set busy cursor */
+              gdm_common_setup_cursor (GDK_WATCH);
+
+              gdm_wm_save_wm_order ();
+
+              gdk_flush ();
+
+              _exit (EXIT_SUCCESS);
+
+            case GDM_QUERY_CAPSLOCK:
+              p++;
+              q = p; 
+              while (*q >= ' ')
+                q++;
+
+              length = q - p;
+
+              if (length > 0)
+                args = g_strndup (p, length);
+              else
+                args = g_strdup ("");
+              p = q;
+ 
+              if (greeter_is_capslock_on ())
+                printf ("%cY\n", STX);
+              else
+                printf ("%c\n", STX);
+              fflush (stdout);
+
+              syslog (LOG_ERR, "args for opcode '%c' are '%s'\n", opcode, args);
+              g_free (args);
+              if (*p == '\0')
+                goto out;
+              break;
+
+            default:
+              gdm_common_abort ("Unexpected greeter command received: '%c'", opcode);
+              break;
+          }
+    }
 
-    case GDM_DISABLE:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-	gtk_widget_set_sensitive (window, FALSE);
+out:
+    syslog (LOG_ERR, "processed %d messages\n", message_count);
+}
 
-	if (disabled_cover == NULL)
-	  {
-	    disabled_cover = gnome_canvas_item_new
-		    (gnome_canvas_root (GNOME_CANVAS (canvas)),
-		     GNOME_TYPE_CANVAS_RECT,
-		     "x1", 0.0,
-		     "y1", 0.0,
-		     "x2", (double)canvas->allocation.width,
-		     "y2", (double)canvas->allocation.height,
-		     "fill_color_rgba", (guint)0x00000088,
-		     NULL);
-	  }
+static gboolean
+greeter_ctrl_handler (GIOChannel *source,
+		      GIOCondition cond,
+		      gint fd)
+{
+    gchar buf[PIPE_SIZE];
+    gsize len;
 
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_ENABLE:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-	gtk_widget_set_sensitive (window, TRUE);
+    /* If this is not incoming i/o then return */
+    if (cond != G_IO_IN) 
+        return TRUE;
 
-	if (disabled_cover != NULL)
-	  {
-	    gtk_object_destroy (GTK_OBJECT (disabled_cover));
-	    disabled_cover = NULL;
-	  }
+    buf[0] = '\0';
+    if (g_io_channel_read_chars (source, buf, PIPE_SIZE -1, &len, NULL) 
+        != G_IO_STATUS_NORMAL)
+        return TRUE;
 
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    /* These are handled separately so ignore them here and send
-     * back a NULL response so that the daemon quits sending them */
-    case GDM_NEEDPIC:
-    case GDM_READPIC:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_NOFOCUS:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	gdm_wm_no_login_focus_push ();
-	
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_FOCUS:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	gdm_wm_no_login_focus_pop ();
-	
-	printf ("%c\n", STX);
-	fflush (stdout);
-	break;
-
-    case GDM_SAVEDIE:
-	g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	/* Set busy cursor */
-	gdm_common_setup_cursor (GDK_WATCH);
-
-	gdm_wm_save_wm_order ();
-
-	gdk_flush ();
-
-	_exit (EXIT_SUCCESS);
-
-    case GDM_QUERY_CAPSLOCK:
-        g_io_channel_read_chars (source, buf, PIPE_SIZE-1, &len, NULL); /* Empty */
-
-	if (greeter_is_capslock_on ())
-	    printf ("%cY\n", STX);
-	else
-	    printf ("%c\n", STX);
-	fflush (stdout);
-
-	break;
-	
-    default:
-	gdm_common_abort ("Unexpected greeter command received: '%c'", buf[0]);
-	break;
-    }
+    greeter_ctrl_handle_messages (buf);
 
-    return (TRUE);
+    return TRUE;
 }
 
 static gboolean


Index: gdm.spec
===================================================================
RCS file: /cvs/dist/rpms/gdm/devel/gdm.spec,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -r1.78 -r1.79
--- gdm.spec	27 Apr 2005 04:26:58 -0000	1.78
+++ gdm.spec	28 Apr 2005 20:44:51 -0000	1.79
@@ -16,7 +16,7 @@
 Summary: The GNOME Display Manager.
 Name: gdm
 Version: 2.6.0.8
-Release: 10
+Release: 11
 Epoch: 1
 License: LGPL/GPL
 Group: User Interface/X
@@ -44,6 +44,8 @@
 Patch26: gdm-2.6.0.8-boot-throbber.patch
 Patch27: gdm-2.6.0.8-dont-malloc-in-signal-handlers.patch
 Patch28: gdm-2.6.0.8-xdmcp.patch
+Patch29: gdm-2.6.0.8-fix-halt-command.patch
+Patch30: gdm-2.6.0.8-process-all-messages.patch
 
 BuildRoot: %{_tmppath}/gdm-%{PACKAGE_VERSION}-root
 
@@ -113,6 +115,8 @@
 %patch26 -p1 -b .boot-throbber
 %patch27 -p1 -b .dont-malloc-in-signal-handlers
 %patch28 -p1 -b .xdmcp
+%patch29 -p1 -b .fix-halt-command
+%patch30 -p1 -b .process-all-messages
 
 # fix the time format for ja
 perl -pi -e "s|^msgstr \"%a %b %d, %H:%M\"|msgstr \"%m/%d \(%a\) %H:%M\"|; s|^msgstr \"%a %b %d, %I:%M %p\"|msgstr \"%m/%d \(%a\) %p %I:%M\"|" po/ja.po
@@ -284,6 +288,11 @@
 %attr(1770, root, gdm) %dir %{_localstatedir}/gdm
 
 %changelog
+* Thu Apr 28 2005 Ray Strode <rstrode at redhat.com> 1:2.6.0.8-11
+- Fix halt command (bug 156299)
+- Process all messages sent to the greeter in a read, not just
+  the first
+
 * Wed Apr 27 2005 Jeremy Katz <katzj at redhat.com> - 1:2.6.0.8-10
 - silence %%postun
 




More information about the fedora-cvs-commits mailing list