# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# target_branch: ../mainline/
# testament_sha1: 96b80c166d1cec9c6b8b9f130fad3c9b3e562827
# timestamp: 2010-08-25 09:54:00 +0530
# base_revision_id: address@hidden
#
# 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
+
+ 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
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
#include
-#include
+#include
#include
-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 .
+
+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=