source: grub-pc/trunk/fuentes/grub-core/commands/date.c @ 22

Last change on this file since 22 was 22, checked in by mabarracus, 4 years ago

updated version and apply net.ifnames=0 into debian/rules

File size: 3.6 KB
Line 
1/* date.c - command to display/set current datetime.  */
2/*
3 *  GRUB  --  GRand Unified Bootloader
4 *  Copyright (C) 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/err.h>
22#include <grub/misc.h>
23#include <grub/datetime.h>
24#include <grub/command.h>
25#include <grub/i18n.h>
26
27GRUB_MOD_LICENSE ("GPLv3+");
28
29#define GRUB_DATETIME_SET_YEAR          1
30#define GRUB_DATETIME_SET_MONTH         2
31#define GRUB_DATETIME_SET_DAY           4
32#define GRUB_DATETIME_SET_HOUR          8
33#define GRUB_DATETIME_SET_MINUTE        16
34#define GRUB_DATETIME_SET_SECOND        32
35
36static grub_err_t
37grub_cmd_date (grub_command_t cmd __attribute__ ((unused)),
38               int argc, char **args)
39{
40  struct grub_datetime datetime;
41  int limit[6][2] = {{1980, 2079}, {1, 12}, {1, 31}, {0, 23}, {0, 59}, {0, 59}};
42  int value[6], mask;
43
44  if (argc == 0)
45    {
46      if (grub_get_datetime (&datetime))
47        return grub_errno;
48
49      grub_printf ("%d-%02d-%02d %02d:%02d:%02d %s\n",
50                   datetime.year, datetime.month, datetime.day,
51                   datetime.hour, datetime.minute, datetime.second,
52                   grub_get_weekday_name (&datetime));
53
54      return 0;
55    }
56
57  grub_memset (&value, 0, sizeof (value));
58  mask = 0;
59
60  for (; argc; argc--, args++)
61    {
62      char *p, c;
63      int m1, ofs, n, cur_mask;
64
65      p = args[0];
66      m1 = grub_strtoul (p, &p, 10);
67
68      c = *p;
69      if (c == '-')
70        ofs = 0;
71      else if (c == ':')
72        ofs = 3;
73      else
74        goto fail;
75
76      value[ofs] = m1;
77      cur_mask = (1 << ofs);
78      mask &= ~(cur_mask * (1 + 2 + 4));
79
80      for (n = 1; (n < 3) && (*p); n++)
81        {
82          if (*p != c)
83            goto fail;
84
85          value[ofs + n] = grub_strtoul (p + 1, &p, 10);
86          cur_mask |= (1 << (ofs + n));
87        }
88
89      if (*p)
90        goto fail;
91
92      if ((ofs == 0) && (n == 2))
93        {
94          value[ofs + 2] = value[ofs + 1];
95          value[ofs + 1] = value[ofs];
96          ofs++;
97          cur_mask <<= 1;
98        }
99
100      for (; n; n--, ofs++)
101        if ((value [ofs] < limit[ofs][0]) ||
102            (value [ofs] > limit[ofs][1]))
103          goto fail;
104
105      mask |= cur_mask;
106    }
107
108  if (grub_get_datetime (&datetime))
109    return grub_errno;
110
111  if (mask & GRUB_DATETIME_SET_YEAR)
112    datetime.year = value[0];
113
114  if (mask & GRUB_DATETIME_SET_MONTH)
115    datetime.month = value[1];
116
117  if (mask & GRUB_DATETIME_SET_DAY)
118    datetime.day = value[2];
119
120  if (mask & GRUB_DATETIME_SET_HOUR)
121    datetime.hour = value[3];
122
123  if (mask & GRUB_DATETIME_SET_MINUTE)
124    datetime.minute = value[4];
125
126  if (mask & GRUB_DATETIME_SET_SECOND)
127    datetime.second = value[5];
128
129  return grub_set_datetime (&datetime);
130
131fail:
132  return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid datetime");
133}
134
135static grub_command_t cmd;
136
137GRUB_MOD_INIT(date)
138{
139  cmd =
140    grub_register_command ("date", grub_cmd_date,
141                           N_("[[year-]month-day] [hour:minute[:second]]"),
142                           N_("Display/set current datetime."));
143}
144
145GRUB_MOD_FINI(date)
146{
147  grub_unregister_command (cmd);
148}
Note: See TracBrowser for help on using the repository browser.