Hi,

Attached patch fixes echo command behavior for unrecognized options.
On BASH echo command passes all unrecognized options to the output,
this patch makes GRUB version to behave similarly.  This bug has been
reported by Yves Blusseau (JrCs).


--- ChangeLog   2010-08-23 17:56:24 +0000
+++ ChangeLog   2010-08-25 04:19:18 +0000
@@ -1,3 +1,14 @@
+2010-08-25  BVK Chaitanya  <bvk.gro...@gmail.com>
+
+       Fix echo command output for unrecognized options (bug reported by
+       Yves Blusseau)
+
+       * tests/grub_cmd_echo.in: New testcase.
+       * Makefile.util.def: Rules for new testcase.
+
+       * grub-core/commands/echo.c: Use custom option parsing instead of
+       extcmd framework.
+


-- 
bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: b...@dbook-20100825041918-mbuvbtmu000n4m9n
# target_branch: ../mainline/
# testament_sha1: 96b80c166d1cec9c6b8b9f130fad3c9b3e562827
# timestamp: 2010-08-25 09:54:00 +0530
# base_revision_id: b...@dbook-20100823175624-z6uj4h4yjuyit29l
# 
# Begin patch
=== modified file 'ChangeLog'
--- ChangeLog	2010-08-23 17:56:24 +0000
+++ ChangeLog	2010-08-25 04:19:18 +0000
@@ -1,3 +1,14 @@
+2010-08-25  BVK Chaitanya  <bvk.gro...@gmail.com>
+
+	Fix echo command output for unrecognized options (bug reported by
+	Yves Blusseau)
+
+	* tests/grub_cmd_echo.in: New testcase.
+	* Makefile.util.def: Rules for new testcase.
+
+	* grub-core/commands/echo.c: Use custom option parsing instead of
+	extcmd framework.
+
 2010-08-23  BVK Chaitanya  <bvk.gro...@gmail.com>
 
 	New Automake based build system for GRUB.

=== modified file 'Makefile.util.def'
--- Makefile.util.def	2010-08-23 15:53:39 +0000
+++ Makefile.util.def	2010-08-25 04:19:18 +0000
@@ -496,6 +496,12 @@
   common = tests/grub_script_shift.in;
 };
 
+script = {
+  testcase;
+  name = grub_cmd_echo;
+  common = tests/grub_cmd_echo.in;
+};
+
 program = {
   testcase;
   name = example_unit_test;

=== modified file 'grub-core/commands/echo.c'
--- grub-core/commands/echo.c	2010-01-03 18:24:22 +0000
+++ grub-core/commands/echo.c	2010-08-25 04:19:18 +0000
@@ -19,36 +19,39 @@
 
 #include <grub/dl.h>
 #include <grub/misc.h>
-#include <grub/extcmd.h>
+#include <grub/command.h>
 #include <grub/i18n.h>
 
-static const struct grub_arg_option options[] =
-  {
-    {0, 'n', 0, N_("Do not output the trailing newline."), 0, 0},
-    {0, 'e', 0, N_("Enable interpretation of backslash escapes."), 0, 0},
-    {0, 0, 0, 0, 0, 0}
-  };
-
 static grub_err_t
-grub_cmd_echo (grub_extcmd_t cmd, int argc, char **args)
+grub_cmd_echo (grub_command_t cmd __attribute__ ((unused)),
+	       int argc, char **args)
 {
-  struct grub_arg_list *state = cmd->state;
+  int i;
+  int escape = 0;
   int newline = 1;
-  int i;
-
-  /* Check if `-n' was used.  */
-  if (state[0].set)
-    newline = 0;
+  int parseopt = 1;
 
   for (i = 0; i < argc; i++)
     {
       char *arg = *args;
       args++;
 
+      if (parseopt && grub_strcmp (arg, "-n") == 0)
+	{
+	  newline = 0;
+	  continue;
+	}
+      else if (parseopt && grub_strcmp (arg, "-e") == 0)
+	{
+	  escape = 1;
+	  continue;
+	}
+
+      parseopt = 0;
       while (*arg)
 	{
 	  /* In case `-e' is used, parse backslashes.  */
-	  if (*arg == '\\' && state[1].set)
+	  if (*arg == '\\' && escape)
 	    {
 	      arg++;
 	      if (*arg == '\0')
@@ -109,16 +112,15 @@
   return 0;
 }
 
-static grub_extcmd_t cmd;
+static grub_command_t cmd;
 
 GRUB_MOD_INIT(echo)
 {
-  cmd = grub_register_extcmd ("echo", grub_cmd_echo, GRUB_COMMAND_FLAG_BOTH,
-			      N_("[-e|-n] STRING"), N_("Display a line of text."),
-			      options);
+  cmd = grub_register_command ("echo", grub_cmd_echo, N_("[-e|-n] STRING"),
+			       N_("Display a line of text."));
 }
 
 GRUB_MOD_FINI(echo)
 {
-  grub_unregister_extcmd (cmd);
+  grub_unregister_command (cmd);
 }

=== added file 'tests/grub_cmd_echo.in'
--- tests/grub_cmd_echo.in	1970-01-01 00:00:00 +0000
+++ tests/grub_cmd_echo.in	2010-08-25 04:19:18 +0000
@@ -0,0 +1,33 @@
+#! @builddir@/grub-shell-tester
+#
+# Copyright (C) 2010  Free Software Foundation, Inc.
+#
+# GRUB is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+
+echo
+echo -n
+
+echo foo
+echo foo   bar
+
+echo -n foo
+
+echo -e "foo\nbar"
+
+echo -n -e "foo\nbar"
+
+echo foo -n
+echo foo -n -e
+
+echo -------

# Begin bundle
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
b0rfV9JJ7js/8XckU4UJC/sNSTA=
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to