From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1JNVux-0002Pg-MZ for mharc-grub-devel@gnu.org; Fri, 08 Feb 2008 11:17:35 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JNVuv-0002P1-Bg for grub-devel@gnu.org; Fri, 08 Feb 2008 11:17:33 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JNVuu-0002Oe-Sr for grub-devel@gnu.org; Fri, 08 Feb 2008 11:17:33 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JNVuu-0002Ob-Ly for grub-devel@gnu.org; Fri, 08 Feb 2008 11:17:32 -0500 Received: from aybabtu.com ([69.60.117.155]) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1JNVuu-0002zw-AA for grub-devel@gnu.org; Fri, 08 Feb 2008 11:17:32 -0500 Received: from [192.168.10.6] (helo=thorin) by aybabtu.com with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.63) (envelope-from ) id 1JNVuq-00073w-CI for grub-devel@gnu.org; Fri, 08 Feb 2008 17:17:31 +0100 Received: from rmh by thorin with local (Exim 4.63) (envelope-from ) id 1JNVt1-000528-6s for grub-devel@gnu.org; Fri, 08 Feb 2008 17:15:35 +0100 Date: Fri, 8 Feb 2008 17:15:35 +0100 From: Robert Millan To: grub-devel@gnu.org Message-ID: <20080208161534.GA19324@thorin> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="DocE+STaALJfprDB" Content-Disposition: inline Content-Transfer-Encoding: 8bit Organization: free as in freedom X-Message-Flag: Worried about Outlook viruses? Switch to Thunderbird! www.mozilla.com/thunderbird X-Debbugs-No-Ack: true User-Agent: Mutt/1.5.13 (2006-08-11) X-detected-kernel: by monty-python.gnu.org: Genre and OS details not recognized. Subject: [PATCH] sleep.mod X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Feb 2008 16:17:34 -0000 --DocE+STaALJfprDB Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit A sleep command. -- Robert Millan I know my rights; I want my phone call! What use is a phone call… if you are unable to speak? (as seen on /.) --DocE+STaALJfprDB Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="sleep.diff" diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp -N ../grub2/commands/sleep.c ./commands/sleep.c --- ../grub2/commands/sleep.c 1970-01-01 01:00:00.000000000 +0100 +++ ./commands/sleep.c 2008-02-08 17:01:51.000000000 +0100 @@ -0,0 +1,110 @@ +/* sleep.c - Command to wait a specified number of seconds. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +static const struct grub_arg_option options[] = + { + {"verbose", 'v', 0, "verbose countdown", 0, 0}, + {"interruptible", 'i', 0, "interruptible with ESC", 0, 0}, + {0, 0, 0, 0, 0, 0} + }; + +static grub_uint8_t x, y; + +static void +do_print (int n) +{ + grub_gotoxy (x, y); + /* NOTE: Do not remove the trailing space characters. + They are required to clear the line. */ + grub_printf ("%d ", n); +} + +/* Based on grub_millisleep() from kern/misc.c. */ +static int +grub_interruptible_millisleep (grub_uint32_t ms) +{ + grub_uint32_t end_at; + + end_at = grub_get_rtc () + grub_div_roundup (ms * GRUB_TICKS_PER_SECOND, 1000); + + while (grub_get_rtc () < end_at) + if (GRUB_TERM_ASCII_CHAR (grub_checkkey ()) == GRUB_TERM_ESC) + return 1; + + return 0; +} + +static grub_err_t +grub_cmd_sleep (struct grub_arg_list *state, int argc, char **args) +{ + grub_uint16_t xy; + int n; + + if (argc != 1) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing operand"); + + n = grub_strtoul (args[0], 0, 10); + + if (n == 0) + { + /* Either `0' or broken input. */ + return 0; + } + + xy = grub_getxy (); + x = xy >> 8; + y = xy & 0xff; + + for (; n; n--) + { + if (state[0].set) + do_print (n); + + if (state[1].set) + { + if (grub_interruptible_millisleep (1000)) + return 1; + } + else + grub_millisleep (1000); + } + if (state[0].set) + do_print (0); + + return 0; +} + + +GRUB_MOD_INIT(sleep) +{ + grub_register_command ("sleep", grub_cmd_sleep, GRUB_COMMAND_FLAG_BOTH, + "sleep NUMBER_OF_SECONDS", "Wait for a specified number of seconds", options); +} + +GRUB_MOD_FINI(sleep) +{ + grub_unregister_command ("sleep"); +} diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp -N ../grub2/conf/common.rmk ./conf/common.rmk --- ../grub2/conf/common.rmk 2008-02-06 17:21:45.000000000 +0100 +++ ./conf/common.rmk 2008-02-08 16:08:26.000000000 +0100 @@ -265,7 +265,7 @@ pkglib_MODULES += hello.mod boot.mod ter cmp.mod cat.mod help.mod font.mod search.mod \ loopback.mod configfile.mod echo.mod \ terminfo.mod test.mod blocklist.mod hexdump.mod \ - read.mod + read.mod sleep.mod # For hello.mod. hello_mod_SOURCES = hello/hello.c @@ -364,3 +364,8 @@ gzio_mod_LDFLAGS = $(COMMON_LDFLAGS) read_mod_SOURCES = commands/read.c read_mod_CFLAGS = $(COMMON_CFLAGS) read_mod_LDFLAGS = $(COMMON_LDFLAGS) + +# For sleep.mod. +sleep_mod_SOURCES = commands/sleep.c +sleep_mod_CFLAGS = $(COMMON_CFLAGS) +sleep_mod_LDFLAGS = $(COMMON_LDFLAGS) --DocE+STaALJfprDB--