]> git.proxmox.com Git - grub2.git/blob - commands/cat.c
Hotplugging and USB hub support.
[grub2.git] / commands / cat.c
1 /* cat.c - command to show the contents of a file */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2003,2005,2007,2008 Free Software Foundation, Inc.
5 *
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <grub/dl.h>
21 #include <grub/file.h>
22 #include <grub/disk.h>
23 #include <grub/term.h>
24 #include <grub/misc.h>
25 #include <grub/gzio.h>
26 #include <grub/extcmd.h>
27 #include <grub/i18n.h>
28
29 static const struct grub_arg_option options[] =
30 {
31 {"dos", -1, 0, N_("Accept DOS-style CR/NL line endings."), 0, 0},
32 {0, 0, 0, 0, 0, 0}
33 };
34
35 static grub_err_t
36 grub_cmd_cat (grub_extcmd_t cmd, int argc, char **args)
37 {
38 struct grub_arg_list *state = cmd->state;
39 int dos = 0;
40 grub_file_t file;
41 char buf[GRUB_DISK_SECTOR_SIZE];
42 grub_ssize_t size;
43 int key = 0;
44
45 if (state[0].set)
46 dos = 1;
47
48 if (argc != 1)
49 return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
50
51 file = grub_gzfile_open (args[0], 1);
52 if (! file)
53 return grub_errno;
54
55 while ((size = grub_file_read (file, buf, sizeof (buf))) > 0
56 && key != GRUB_TERM_ESC)
57 {
58 int i;
59
60 for (i = 0; i < size; i++)
61 {
62 unsigned char c = buf[i];
63
64 if ((grub_isprint (c) || grub_isspace (c)) && c != '\r')
65 grub_printf ("%c", c);
66 else if (dos && c == '\r' && i + 1 < size && buf[i + 1] == '\n')
67 {
68 grub_printf ("\n");
69 i++;
70 }
71 else
72 {
73 grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
74 grub_printf ("<%x>", (int) c);
75 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
76 }
77 }
78
79 while (grub_checkkey () >= 0 &&
80 (key = GRUB_TERM_ASCII_CHAR (grub_getkey ())) != GRUB_TERM_ESC)
81 ;
82 }
83
84 grub_xputs ("\n");
85 grub_refresh ();
86 grub_file_close (file);
87
88 return 0;
89 }
90
91 static grub_extcmd_t cmd;
92 \f
93 GRUB_MOD_INIT(cat)
94 {
95 cmd = grub_register_extcmd ("cat", grub_cmd_cat, GRUB_COMMAND_FLAG_BOTH,
96 N_("FILE"), N_("Show the contents of a file."),
97 options);
98 }
99
100 GRUB_MOD_FINI(cat)
101 {
102 grub_unregister_extcmd (cmd);
103 }