Bug#586358: grub-pc: Please handle DOS line endings in "cat"
Colin Watson
cjwatson at ubuntu.com
Mon Jun 28 00:02:06 UTC 2010
On Fri, Jun 25, 2010 at 08:51:12PM +0200, Vladimir 'φ-coder/phcoder' Serbinenko wrote:
> Colin Watson wrote:
> > On Fri, Jun 18, 2010 at 11:34:08AM -0700, Josh Triplett wrote:
> >> The "cat" command, if given a file with DOS line endings, will show the
> >> \r at the end of every line as a control character. For convenience,
> >> please consider adding support for this in "cat", ideally automatically.
> >
> > Makes sense to me. grub-devel, how about this patch?
>
> Unconditionaly stripping \r is a bad idea because sometimes cat in grub
> is used to determine why the system fails to boot. And if by a stupid
> action fstab becomes DOS-formated 'cat /etc/fstab' will fail to show
> this important point. But it's ok to add an option for cat'ing DOS
> files.
OK. How about the following patch, then?
> In this case we probably need to mark unix newlines somehow to
> detect a reverse problem
I think we can live without this. It adds complexity (I can't
immediately think of a neat way to represent this visually) and I think
it would be needed quite rarely. Besides, I was looking around for
examples and noticed that when vim is in DOS mode it simply treats both
\r\n and \n as newlines. That seems a good enough precedent for me.
2010-06-20 Colin Watson <cjwatson at ubuntu.com>
* commands/cat.c (options): New variable.
(grub_cmd_cat): Parse options. If the --dos option is given, print
DOS-style "\r\n" line endings as simple newlines.
(GRUB_MOD_INIT): Use extcmd.
(GRUB_MOD_FINI): Likewise.
* docs/grub.texi (cat): Document --dos.
=== modified file 'commands/cat.c'
--- commands/cat.c 2010-03-01 19:24:34 +0000
+++ commands/cat.c 2010-06-27 23:56:11 +0000
@@ -23,19 +23,28 @@
#include <grub/term.h>
#include <grub/misc.h>
#include <grub/gzio.h>
-#include <grub/command.h>
+#include <grub/extcmd.h>
#include <grub/i18n.h>
-static grub_err_t
-grub_cmd_cat (grub_command_t cmd __attribute__ ((unused)),
- int argc, char **args)
+static const struct grub_arg_option options[] =
+ {
+ {"dos", -1, 0, N_("Accept DOS-style CR/NL line endings."), 0, 0},
+ {0, 0, 0, 0, 0, 0}
+ };
+static grub_err_t
+grub_cmd_cat (grub_extcmd_t cmd, int argc, char **args)
{
+ struct grub_arg_list *state = cmd->state;
+ int dos = 0;
grub_file_t file;
char buf[GRUB_DISK_SECTOR_SIZE];
grub_ssize_t size;
int key = 0;
+ if (state[0].set)
+ dos = 1;
+
if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
@@ -54,6 +63,11 @@ grub_cmd_cat (grub_command_t cmd __attri
if ((grub_isprint (c) || grub_isspace (c)) && c != '\r')
grub_putchar (c);
+ else if (dos && c == '\r' && buf[i + 1] == '\n')
+ {
+ grub_putchar ('\n');
+ i++;
+ }
else
{
grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
@@ -74,15 +88,16 @@ grub_cmd_cat (grub_command_t cmd __attri
return 0;
}
-static grub_command_t cmd;
+static grub_extcmd_t cmd;
GRUB_MOD_INIT(cat)
{
- cmd = grub_register_command_p1 ("cat", grub_cmd_cat,
- N_("FILE"), N_("Show the contents of a file."));
+ cmd = grub_register_extcmd ("cat", grub_cmd_cat, GRUB_COMMAND_FLAG_BOTH,
+ N_("FILE"), N_("Show the contents of a file."),
+ options);
}
GRUB_MOD_FINI(cat)
{
- grub_unregister_command (cmd);
+ grub_unregister_extcmd (cmd);
}
=== modified file 'docs/grub.texi'
--- docs/grub.texi 2010-06-26 09:50:39 +0000
+++ docs/grub.texi 2010-06-27 23:45:11 +0000
@@ -1624,13 +1624,19 @@ a menu entry).
@node cat
@subsection cat
- at deffn Command cat file
+ at deffn Command cat [@option{--dos}] file
Display the contents of the file @var{file}. This command may be useful
to remind you of your OS's root partition:
@example
grub> @kbd{cat /etc/fstab}
@end example
+
+If the @option{--dos} option is used, then carriage return / new line pairs
+will be displayed as a simple new line. Otherwise, the carriage return will
+be displayed as a control character (@samp{<d>}) to make it easier to see
+when boot problems are caused by a file formatted using DOS-style line
+endings.
@end deffn
Thanks,
--
Colin Watson [cjwatson at ubuntu.com]
More information about the Pkg-grub-devel
mailing list