]>
Commit | Line | Data |
---|---|---|
3dac2e3f | 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> | |
0bf6d401 | 22 | #include <grub/time.h> |
3dac2e3f | 23 | #include <grub/types.h> |
24 | #include <grub/misc.h> | |
b1b797cb | 25 | #include <grub/extcmd.h> |
77a79592 | 26 | #include <grub/i18n.h> |
3dac2e3f | 27 | |
e745cf0c VS |
28 | GRUB_MOD_LICENSE ("GPLv3+"); |
29 | ||
3dac2e3f | 30 | static const struct grub_arg_option options[] = |
31 | { | |
77a79592 | 32 | {"verbose", 'v', 0, N_("Verbose countdown."), 0, 0}, |
67093bc0 | 33 | {"interruptible", 'i', 0, N_("Allow to interrupt with ESC."), 0, 0}, |
3dac2e3f | 34 | {0, 0, 0, 0, 0, 0} |
35 | }; | |
36 | ||
e89c2d48 | 37 | static struct grub_term_coordinate *pos; |
3dac2e3f | 38 | |
39 | static void | |
40 | do_print (int n) | |
41 | { | |
f4c623e1 | 42 | grub_term_restore_pos (pos); |
3dac2e3f | 43 | /* NOTE: Do not remove the trailing space characters. |
44 | They are required to clear the line. */ | |
45 | grub_printf ("%d ", n); | |
967b2b64 | 46 | grub_refresh (); |
3dac2e3f | 47 | } |
48 | ||
9c2ff3ee | 49 | /* Based on grub_millisleep() from kern/generic/millisleep.c. */ |
3dac2e3f | 50 | static int |
51 | grub_interruptible_millisleep (grub_uint32_t ms) | |
52 | { | |
9c2ff3ee | 53 | grub_uint64_t start; |
54 | ||
55 | start = grub_get_time_ms (); | |
56 | ||
57 | while (grub_get_time_ms () - start < ms) | |
a8f16eab | 58 | if (grub_getkey_noblock () == GRUB_TERM_ESC) |
3dac2e3f | 59 | return 1; |
60 | ||
61 | return 0; | |
62 | } | |
63 | ||
64 | static grub_err_t | |
28be0e94 | 65 | grub_cmd_sleep (grub_extcmd_context_t ctxt, int argc, char **args) |
3dac2e3f | 66 | { |
28be0e94 | 67 | struct grub_arg_list *state = ctxt->state; |
3dac2e3f | 68 | int n; |
69 | ||
70 | if (argc != 1) | |
9c4b5c13 | 71 | return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); |
3dac2e3f | 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 | ||
c6a61bda VS |
81 | grub_refresh (); |
82 | ||
f4c623e1 | 83 | pos = grub_term_save_pos (); |
3dac2e3f | 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 | ||
b1b797cb | 104 | static grub_extcmd_t cmd; |
3dac2e3f | 105 | \f |
106 | GRUB_MOD_INIT(sleep) | |
107 | { | |
ed80f7d5 | 108 | cmd = grub_register_extcmd ("sleep", grub_cmd_sleep, 0, |
77a79592 | 109 | N_("NUMBER_OF_SECONDS"), |
110 | N_("Wait for a specified number of seconds."), | |
b1b797cb | 111 | options); |
3dac2e3f | 112 | } |
113 | ||
114 | GRUB_MOD_FINI(sleep) | |
115 | { | |
b1b797cb | 116 | grub_unregister_extcmd (cmd); |
3dac2e3f | 117 | } |