From: Colin Watson <cjwatson@ubuntu.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Cc: Josh Triplett <josh@joshtriplett.org>, 586358@bugs.debian.org
Subject: Re: Bug#586358: grub-pc: Please handle DOS line endings in "cat"
Date: Mon, 28 Jun 2010 01:02:06 +0100 [thread overview]
Message-ID: <20100628000206.GW21862@riva.ucam.org> (raw)
In-Reply-To: <4C24FAA0.5060303@gmail.com>
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@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;
\f
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
-@deffn Command cat file
+@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@ubuntu.com]
next prev parent reply other threads:[~2010-06-28 0:02 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20100618183408.12015.77315.reportbug@feather>
2010-06-20 22:19 ` Bug#586358: grub-pc: Please handle DOS line endings in "cat" Colin Watson
2010-06-21 19:29 ` Josh Triplett
2010-06-25 18:51 ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-06-28 0:02 ` Colin Watson [this message]
2010-06-28 7:53 ` Colin Watson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100628000206.GW21862@riva.ucam.org \
--to=cjwatson@ubuntu.com \
--cc=586358@bugs.debian.org \
--cc=grub-devel@gnu.org \
--cc=josh@joshtriplett.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.