]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - GRUB2/MOD_SRC/grub-2.04/grub-core/lib/cmdline.c
Support unattended auto install for Deepin/UOS
[Ventoy.git] / GRUB2 / MOD_SRC / grub-2.04 / grub-core / lib / cmdline.c
1 /* cmdline.c - linux command line handling */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2010 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/lib/cmdline.h>
21 #include <grub/misc.h>
22
23 static unsigned int check_arg (char *c, int *has_space)
24 {
25 int space = 0;
26 unsigned int size = 0;
27
28 while (*c)
29 {
30 if (*c == '\\' || *c == '\'' || *c == '"')
31 size++;
32 else if (*c == ' ')
33 space = 1;
34
35 size++;
36 c++;
37 }
38
39 if (space)
40 size += 2;
41
42 if (has_space)
43 *has_space = space;
44
45 return size;
46 }
47
48 unsigned int grub_loader_cmdline_size (int argc, char *argv[])
49 {
50 int i;
51 unsigned int size = 0;
52
53 for (i = 0; i < argc; i++)
54 {
55 size += check_arg (argv[i], 0);
56 size++; /* Separator space or NULL. */
57 }
58
59 if (size == 0)
60 size = 1;
61
62 return size;
63 }
64
65 grub_err_t
66 grub_create_loader_cmdline (int argc, char *argv[], char *buf,
67 grub_size_t size, enum grub_verify_string_type type)
68 {
69 int i, space;
70 unsigned int arg_size;
71 char *c, *orig_buf = buf;
72
73 for (i = 0; i < argc; i++)
74 {
75 c = argv[i];
76 arg_size = check_arg(argv[i], &space);
77 arg_size++; /* Separator space or NULL. */
78
79 if (size < arg_size)
80 break;
81
82 size -= arg_size;
83
84 if (space)
85 *buf++ = '"';
86
87 while (*c)
88 {
89 if (*c == '\\' && *(c+1) == 'x' &&
90 grub_isxdigit(*(c+2)) && grub_isxdigit(*(c+3)))
91 {
92 *buf++ = *c++;
93 *buf++ = *c++;
94 *buf++ = *c++;
95 *buf++ = *c++;
96 continue;
97 }
98 else if (*c == '\\' || *c == '\'' || *c == '"')
99 *buf++ = '\\';
100
101 *buf++ = *c;
102 c++;
103 }
104
105 if (space)
106 *buf++ = '"';
107
108 *buf++ = ' ';
109 }
110
111 /* Replace last space with null. */
112 if (i)
113 buf--;
114
115 *buf = 0;
116
117 return grub_verify_string (orig_buf, type);
118 }