~ubuntu-branches/ubuntu/wily/grub2/wily

« back to all changes in this revision

Viewing changes to grub-core/lib/cmdline.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2011-01-11 17:11:44 UTC
  • mto: (17.3.26 experimental)
  • mto: This revision was merged to the branch mainline in revision 60.
  • Revision ID: james.westby@ubuntu.com-20110111171144-o2h6luxzei5fivmf
Tags: upstream-1.99~20110111
ImportĀ upstreamĀ versionĀ 1.99~20110111

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
  return size;
 
60
}
 
61
 
 
62
int grub_create_loader_cmdline (int argc, char *argv[], char *buf,
 
63
                                grub_size_t size)
 
64
{
 
65
  int i, space;
 
66
  unsigned int arg_size;
 
67
  char *c;
 
68
 
 
69
  for (i = 0; i < argc; i++)
 
70
    {
 
71
      c = argv[i];
 
72
      arg_size = check_arg(argv[i], &space);
 
73
      arg_size++; /* Separator space or NULL.  */
 
74
 
 
75
      if (size < arg_size)
 
76
        break;
 
77
 
 
78
      size -= arg_size;
 
79
 
 
80
      if (space)
 
81
        *buf++ = '"';
 
82
 
 
83
      while (*c)
 
84
        {
 
85
          if (*c == '\\' || *c == '\'' || *c == '"')
 
86
            *buf++ = '\\';
 
87
 
 
88
          *buf++ = *c;
 
89
          c++;
 
90
        }
 
91
 
 
92
      if (space)
 
93
        *buf++ = '"';
 
94
 
 
95
      *buf++ = ' ';
 
96
    }
 
97
 
 
98
  /* Replace last space with null.  */
 
99
  if (i)
 
100
    buf--;
 
101
 
 
102
  *buf = 0;
 
103
 
 
104
  return i;
 
105
}