source: grub-pc/trunk/fuentes/.pc/sleep_shift.patch/grub-core/commands/sleep.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: 2.7 KB
Line 
1/* sleep.c - Command to wait a specified number of seconds.  */
2/*
3 *  GRUB  --  GRand Unified Bootloader
4 *  Copyright (C) 2006,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/term.h>
22#include <grub/time.h>
23#include <grub/types.h>
24#include <grub/misc.h>
25#include <grub/extcmd.h>
26#include <grub/i18n.h>
27
28GRUB_MOD_LICENSE ("GPLv3+");
29
30static const struct grub_arg_option options[] =
31  {
32    {"verbose", 'v', 0, N_("Verbose countdown."), 0, 0},
33    {"interruptible", 'i', 0, N_("Allow to interrupt with ESC."), 0, 0},
34    {0, 0, 0, 0, 0, 0}
35  };
36
37static struct grub_term_coordinate *pos;
38
39static void
40do_print (int n)
41{
42  grub_term_restore_pos (pos);
43  /* NOTE: Do not remove the trailing space characters.
44     They are required to clear the line.  */
45  grub_printf ("%d    ", n);
46  grub_refresh ();
47}
48
49/* Based on grub_millisleep() from kern/generic/millisleep.c.  */
50static int
51grub_interruptible_millisleep (grub_uint32_t ms)
52{
53  grub_uint64_t start;
54
55  start = grub_get_time_ms ();
56
57  while (grub_get_time_ms () - start < ms)
58    if (grub_getkey_noblock () == GRUB_TERM_ESC)
59      return 1;
60
61  return 0;
62}
63
64static grub_err_t
65grub_cmd_sleep (grub_extcmd_context_t ctxt, int argc, char **args)
66{
67  struct grub_arg_list *state = ctxt->state;
68  int n;
69
70  if (argc != 1)
71    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
72
73  n = grub_strtoul (args[0], 0, 10);
74
75  if (n == 0)
76    {
77      /* Either `0' or broken input.  */
78      return 0;
79    }
80
81  grub_refresh ();
82
83  pos = grub_term_save_pos ();
84
85  for (; n; n--)
86    {
87      if (state[0].set)
88        do_print (n);
89
90      if (state[1].set)
91        {
92          if (grub_interruptible_millisleep (1000))
93            return 1;
94        }
95      else
96        grub_millisleep (1000);
97    }
98  if (state[0].set)
99    do_print (0);
100
101  return 0;
102}
103
104static grub_extcmd_t cmd;
105
106GRUB_MOD_INIT(sleep)
107{
108  cmd = grub_register_extcmd ("sleep", grub_cmd_sleep, 0,
109                              N_("NUMBER_OF_SECONDS"),
110                              N_("Wait for a specified number of seconds."),
111                              options);
112}
113
114GRUB_MOD_FINI(sleep)
115{
116  grub_unregister_extcmd (cmd);
117}
Note: See TracBrowser for help on using the repository browser.