]> git.proxmox.com Git - grub2.git/blame - grub-core/commands/cat.c
verifiers: File type for fine-grained signature-verification controlling
[grub2.git] / grub-core / commands / cat.c
CommitLineData
db1771cf 1/* cat.c - command to show the contents of a file */
2/*
4b13b216 3 * GRUB -- GRand Unified Bootloader
da9a6a94 4 * Copyright (C) 2003,2005,2007,2008 Free Software Foundation, Inc.
db1771cf 5 *
5a79f472 6 * GRUB is free software: you can redistribute it and/or modify
db1771cf 7 * it under the terms of the GNU General Public License as published by
5a79f472 8 * the Free Software Foundation, either version 3 of the License, or
db1771cf 9 * (at your option) any later version.
10 *
5a79f472 11 * GRUB is distributed in the hope that it will be useful,
db1771cf 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
5a79f472 17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
db1771cf 18 */
19
4b13b216 20#include <grub/dl.h>
4b13b216 21#include <grub/file.h>
22#include <grub/disk.h>
23#include <grub/term.h>
24#include <grub/misc.h>
bbe34652 25#include <grub/extcmd.h>
77a79592 26#include <grub/i18n.h>
16f7c8f6 27#include <grub/charset.h>
db1771cf 28
e745cf0c
VS
29GRUB_MOD_LICENSE ("GPLv3+");
30
bbe34652
CW
31static const struct grub_arg_option options[] =
32 {
33 {"dos", -1, 0, N_("Accept DOS-style CR/NL line endings."), 0, 0},
34 {0, 0, 0, 0, 0, 0}
35 };
db1771cf 36
bbe34652 37static grub_err_t
d18b05c4 38grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
db1771cf 39{
d18b05c4 40 struct grub_arg_list *state = ctxt->state;
bbe34652 41 int dos = 0;
4b13b216 42 grub_file_t file;
16f7c8f6 43 unsigned char buf[GRUB_DISK_SECTOR_SIZE];
4b13b216 44 grub_ssize_t size;
a8f16eab 45 int key = GRUB_TERM_NO_KEY;
16f7c8f6
VS
46 grub_uint32_t code = 0;
47 int count = 0;
48 unsigned char utbuf[GRUB_MAX_UTF8_PER_CODEPOINT + 1];
49 int utcount = 0;
50 int is_0d = 0;
51 int j;
db1771cf 52
bbe34652
CW
53 if (state[0].set)
54 dos = 1;
55
db1771cf 56 if (argc != 1)
9c4b5c13 57 return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
db1771cf 58
ca0a4f68 59 file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT);
db1771cf 60 if (! file)
5382b1e4 61 return grub_errno;
b39f9d20 62
b7c6bed5 63 while ((size = grub_file_read (file, buf, sizeof (buf))) > 0
64 && key != GRUB_TERM_ESC)
db1771cf 65 {
66 int i;
b39f9d20 67
db1771cf 68 for (i = 0; i < size; i++)
69 {
16f7c8f6 70 utbuf[utcount++] = buf[i];
b39f9d20 71
16f7c8f6 72 if (is_0d && buf[i] != '\n')
bbe34652 73 {
16f7c8f6
VS
74 grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
75 grub_printf ("<%x>", (int) '\r');
76 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
bbe34652 77 }
16f7c8f6
VS
78
79 is_0d = 0;
80
81 if (!grub_utf8_process (buf[i], &code, &count))
db1771cf 82 {
4b13b216 83 grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
16f7c8f6
VS
84 for (j = 0; j < utcount - 1; j++)
85 grub_printf ("<%x>", (unsigned int) utbuf[j]);
86 code = 0;
87 count = 0;
88 if (utcount == 1 || !grub_utf8_process (buf[i], &code, &count))
89 {
90 grub_printf ("<%x>", (unsigned int) buf[i]);
91 code = 0;
92 count = 0;
93 utcount = 0;
94 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
95 continue;
96 }
4b13b216 97 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
16f7c8f6 98 utcount = 1;
db1771cf 99 }
16f7c8f6
VS
100 if (count)
101 continue;
102
103 if ((code >= 0xa1 || grub_isprint (code)
104 || grub_isspace (code)) && code != '\r')
105 {
106 grub_printf ("%C", code);
107 count = 0;
108 code = 0;
109 utcount = 0;
110 continue;
111 }
112
113 if (dos && code == '\r')
114 {
115 is_0d = 1;
116 count = 0;
117 code = 0;
118 utcount = 0;
119 continue;
120 }
121
122 grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
123 for (j = 0; j < utcount; j++)
124 grub_printf ("<%x>", (unsigned int) utbuf[j]);
125 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
126 count = 0;
127 code = 0;
128 utcount = 0;
db1771cf 129 }
b7202015 130
1a1ac4f6
VS
131 do
132 key = grub_getkey_noblock ();
133 while (key != GRUB_TERM_ESC && key != GRUB_TERM_NO_KEY);
db1771cf 134 }
135
16f7c8f6
VS
136 if (is_0d)
137 {
138 grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
139 grub_printf ("<%x>", (unsigned int) '\r');
140 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
141 }
142
8c26dace
VS
143 if (utcount)
144 {
145 grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
146 for (j = 0; j < utcount; j++)
147 grub_printf ("<%x>", (unsigned int) utbuf[j]);
148 grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
149 }
16f7c8f6 150
dfed5c6b 151 grub_xputs ("\n");
4b13b216 152 grub_refresh ();
153 grub_file_close (file);
b39f9d20 154
db1771cf 155 return 0;
156}
157
bbe34652 158static grub_extcmd_t cmd;
db1771cf 159\f
6d099807 160GRUB_MOD_INIT(cat)
db1771cf 161{
ed80f7d5 162 cmd = grub_register_extcmd ("cat", grub_cmd_cat, 0,
bbe34652
CW
163 N_("FILE"), N_("Show the contents of a file."),
164 options);
db1771cf 165}
166
6d099807 167GRUB_MOD_FINI(cat)
db1771cf 168{
bbe34652 169 grub_unregister_extcmd (cmd);
db1771cf 170}