grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: New commands (reboot, halt, help)


From: Marco Gerards
Subject: Re: New commands (reboot, halt, help)
Date: Sun, 30 Jan 2005 17:15:29 +0000
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

Marco Gerards <address@hidden> writes:

> Hi,
>
> Here is a patch to add the commands reboot, halt (i386/pc) and reboot
> (i386/pc).  The halt and reboot commands for the PPC will follow
> later.
>
> I will commit this patch on Monday, if there are no problems with it.

Here is an updated patch.  The only changes are to hello.mod.  It now
prints the help output in two columns.

It can also print help output for the patterns passed as arguments.
So:

help l t

Will show help output (the same as --help) for all arguments starting
with `l' and `t', just like with GRUB Legacy.

I will commit this patch tomorrow evening if I don't hear
complaints. :)

Thanks,
Marco


2005-01-30  Marco Gerards  <address@hidden>

        * commands/help.c: New file.
        * normal/arg.c (show_help): Renamed to...
        (grub_arg_show_help): ... this.
        * commands/i386/pc/halt.c: New file.
        * commands/i386/pc/reboot.c: New file.
        * conf/i386-pc.rmk (grub_emu_SOURCES): Add `commands/help.c'.
        (pkgdata_MODULES): Add `reboot.mod', `halt.mod' and `help.mod'.
        (help_mod_SOURCES, help_mod_CFLAGS, reboot_mod_SOURCES)
        (reboot_mod_CFLAGS, halt_mod_SOURCES, halt_mod_CFLAGS): New
        variables.
        * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Add
        `commands/help.c'.
        (pkgdata_MODULES): Add `help.mod'.
        (help_mod_SOURCES, help_mod_CFLAGS): New variables.
        * grub/i386/pc/init.h (grub_reboot): New prototype.
        (grub_halt): Likewise.
        * include/grub/normal.h (grub_arg_show_help): New prototype.
        (grub_help_init): Likewise.
        (grub_help_fini): Likewise.
        * util/grub-emu.c (main): Initialize and deinitialize the help
        command.

        * normal/cmdline.c (grub_cmdline_get): Doc fix.

        * normal/command.c (grub_command_init): Fixed the description of
        the `set' and `unset' commands.

diff -upNr --exclude=CVS grub2/commands/help.c grub2.cmds/commands/help.c
--- grub2/commands/help.c       1970-01-01 00:00:00.000000000 +0000
+++ grub2.cmds/commands/help.c  2005-01-30 17:11:43.000000000 +0000
@@ -0,0 +1,115 @@
+/* help.c - command to show a help text.  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  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 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/normal.h>
+#include <grub/dl.h>
+#include <grub/arg.h>
+#include <grub/misc.h>
+
+/* XXX: This has to be changed into a function so the screen can be
+   optimally used.  */
+#define TERM_WIDTH     80
+
+static grub_err_t
+grub_cmd_help (struct grub_arg_list *state __attribute__ ((unused)), int argc,
+              char **args)
+
+{
+  int cnt = 0;
+  char *currarg;
+  
+  auto int print_command_info (grub_command_t cmd);
+  auto int print_command_help (grub_command_t cmd);
+
+  int print_command_info (grub_command_t cmd)
+    {
+      if (cmd->flags & GRUB_COMMAND_FLAG_CMDLINE)
+       {
+         char description[TERM_WIDTH / 2];
+         int desclen = grub_strlen (cmd->summary);
+         
+         /* Make a string with a length of TERM_WIDTH / 2 - 1 filled
+            with the description followed by spaces.  */
+         grub_memset (description, ' ', TERM_WIDTH / 2 - 1);
+         description[TERM_WIDTH / 2 - 1] = '\0';
+         grub_memcpy (description, cmd->summary,
+                      (desclen < TERM_WIDTH / 2 - 1 
+                       ? desclen : TERM_WIDTH / 2 - 1));
+         
+         grub_printf ("%s%s", description, (cnt++) % 2 ? "\n" : " ");
+       }
+      
+      return 0;
+    }
+
+  int print_command_help (grub_command_t cmd)
+    {
+      if (!grub_strncmp (cmd->name, currarg, grub_strlen (currarg)))
+       {
+         grub_arg_show_help (cmd);
+         grub_printf ("\n\n");
+       }
+      return 0;
+    }
+  
+  if (argc == 0)
+    grub_iterate_commands (print_command_info);
+  else
+    {
+      int i;
+      
+      for (i = 0; i < argc; i++)
+       {
+         currarg = args[i];
+         grub_iterate_commands (print_command_help);     
+       }
+    }
+  
+  return 0;
+}
+
+
+
+#ifdef GRUB_UTIL
+void
+grub_help_init (void)
+{
+  grub_register_command ("help", grub_cmd_help, GRUB_COMMAND_FLAG_CMDLINE,
+                        "help [PATTERN ...]", "Shows a help message", 0);
+}
+
+void
+grub_help_fini (void)
+{
+  grub_unregister_command ("help");
+}
+#else /* ! GRUB_UTIL */
+GRUB_MOD_INIT
+{
+  (void)mod;                   /* To stop warning. */
+  grub_register_command ("help", grub_cmd_help, GRUB_COMMAND_FLAG_CMDLINE,
+                        "help [PATTERN ...]", "Shows a help message", 0);
+}
+
+GRUB_MOD_FINI
+{
+  grub_unregister_command ("help");
+}
+#endif /* ! GRUB_UTIL */
diff -upNr --exclude=CVS grub2/commands/i386/pc/halt.c 
grub2.cmds/commands/i386/pc/halt.c
--- grub2/commands/i386/pc/halt.c       1970-01-01 00:00:00.000000000 +0000
+++ grub2.cmds/commands/i386/pc/halt.c  2005-01-27 22:24:14.000000000 +0000
@@ -0,0 +1,74 @@
+/* halt.c - command to halt the computer.  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  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 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/normal.h>
+#include <grub/dl.h>
+#include <grub/arg.h>
+#include <grub/machine/init.h>
+
+static const struct grub_arg_option options[] =
+  {
+    {"no-apm", 'n', 0, "Don't use APM to halt the computer", 0, 0},
+    {0, 0, 0, 0, 0, 0}
+  };
+
+static grub_err_t
+grub_cmd_halt (struct grub_arg_list *state,
+              int argc __attribute__ ((unused)),
+              char **args __attribute__ ((unused)))
+
+{
+  int no_apm = 0;
+  if (state[0].set)
+    no_apm = 1;
+  grub_halt (no_apm);
+  return 0;
+}
+
+
+
+#ifdef GRUB_UTIL
+void
+grub_halt_init (void)
+{
+  grub_register_command ("halt", grub_cmd_halt, GRUB_COMMAND_FLAG_BOTH,
+                        "halt [OPTIONS...]",
+                        "Halt the system, if possible using APM", options);
+}
+
+void
+grub_halt_fini (void)
+{
+  grub_unregister_command ("halt");
+}
+#else /* ! GRUB_UTIL */
+GRUB_MOD_INIT
+{
+  (void)mod;                   /* To stop warning. */
+  grub_register_command ("halt", grub_cmd_halt, GRUB_COMMAND_FLAG_BOTH,
+                        "halt [OPTIONS...]",
+                        "Halt the system, if possible using APM", options);
+}
+
+GRUB_MOD_FINI
+{
+  grub_unregister_command ("halt");
+}
+#endif /* ! GRUB_UTIL */
diff -upNr --exclude=CVS grub2/commands/i386/pc/reboot.c 
grub2.cmds/commands/i386/pc/reboot.c
--- grub2/commands/i386/pc/reboot.c     1970-01-01 00:00:00.000000000 +0000
+++ grub2.cmds/commands/i386/pc/reboot.c        2005-01-28 12:25:47.000000000 
+0000
@@ -0,0 +1,63 @@
+/* reboot.c - command to reboot the computer.  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  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 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/normal.h>
+#include <grub/dl.h>
+#include <grub/arg.h>
+#include <grub/machine/init.h>
+
+static grub_err_t
+grub_cmd_reboot (struct grub_arg_list *state __attribute__ ((unused)),
+                int argc __attribute__ ((unused)),
+                char **args __attribute__ ((unused)))
+
+{
+  grub_reboot ();
+  return 0;
+}
+
+
+
+#ifdef GRUB_UTIL
+void
+grub_reboot_init (void)
+{
+  grub_register_command ("reboot", grub_cmd_reboot, GRUB_COMMAND_FLAG_BOTH,
+                        "reboot", "Reboot the computer", 0);
+}
+
+void
+grub_reboot_fini (void)
+{
+  grub_unregister_command ("reboot");
+}
+#else /* ! GRUB_UTIL */
+GRUB_MOD_INIT
+{
+  (void)mod;                   /* To stop warning. */
+  grub_register_command ("reboot", grub_cmd_reboot, GRUB_COMMAND_FLAG_BOTH,
+                        "reboot", "Reboot the computer", 0);
+}
+
+GRUB_MOD_FINI
+{
+  grub_unregister_command ("reboot");
+}
+#endif /* ! GRUB_UTIL */
diff -upNr --exclude=CVS grub2/conf/i386-pc.rmk grub2.cmds/conf/i386-pc.rmk
--- grub2/conf/i386-pc.rmk      2005-01-21 21:32:03.000000000 +0000
+++ grub2.cmds/conf/i386-pc.rmk 2005-01-28 11:42:54.000000000 +0000
@@ -73,7 +73,8 @@ grub_emu_SOURCES = kern/main.c kern/devi
        commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c       
        \
        util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c 
fs/jfs.c fs/iso9660.c \
        normal/cmdline.c normal/command.c normal/main.c normal/menu.c 
normal/arg.c      \
-       util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c 
disk/loopback.c
+       util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c 
commands/help.c \
+       disk/loopback.c
 grub_emu_LDFLAGS = -lncurses
 
 # For genmoddep.
@@ -83,7 +84,7 @@ genmoddep_SOURCES = util/genmoddep.c
 pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod ext2.mod 
minix.mod \
        hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod 
ls.mod \
        boot.mod cmp.mod cat.mod terminal.mod fshelp.mod chain.mod 
multiboot.mod \
-       amiga.mod apple.mod pc.mod loopback.mod
+       amiga.mod apple.mod pc.mod loopback.mod reboot.mod halt.mod help.mod
 
 # For _chain.mod.
 _chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -163,6 +164,18 @@ cmp_mod_CFLAGS = $(COMMON_CFLAGS)
 cat_mod_SOURCES = commands/cat.c
 cat_mod_CFLAGS = $(COMMON_CFLAGS)
 
+# For help.mod.
+help_mod_SOURCES = commands/help.c
+help_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For reboot.mod.
+reboot_mod_SOURCES = commands/i386/pc/reboot.c
+reboot_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For halt.mod.
+halt_mod_SOURCES = commands/i386/pc/halt.c
+halt_mod_CFLAGS = $(COMMON_CFLAGS)
+
 # For vga.mod.
 vga_mod_SOURCES = term/i386/pc/vga.c
 vga_mod_CFLAGS = $(COMMON_CFLAGS)
diff -upNr --exclude=CVS grub2/conf/powerpc-ieee1275.rmk 
grub2.cmds/conf/powerpc-ieee1275.rmk
--- grub2/conf/powerpc-ieee1275.rmk     2005-01-21 21:32:03.000000000 +0000
+++ grub2.cmds/conf/powerpc-ieee1275.rmk        2005-01-28 11:50:35.000000000 
+0000
@@ -41,7 +41,7 @@ grub_emu_SOURCES = kern/main.c kern/devi
        normal/cmdline.c normal/command.c normal/main.c normal/menu.c   \
        normal/arg.c kern/partition.c   \
        util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c \
-       kern/env.c disk/loopback.c commands/ls.c                \
+       kern/env.c disk/loopback.c commands/ls.c commands/help.c        \
        commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c
 grub_emu_LDFLAGS = -lncurses
 
@@ -65,7 +65,7 @@ genmoddep_SOURCES = util/genmoddep.c
 pkgdata_MODULES = _linux.mod linux.mod fat.mod ufs.mod ext2.mod minix.mod \
        hfs.mod jfs.mod normal.mod hello.mod font.mod \
        boot.mod cmp.mod cat.mod terminal.mod fshelp.mod amiga.mod apple.mod \
-       pc.mod suspend.mod loopback.mod
+       pc.mod suspend.mod loopback.mod help.mod
 
 # For fshelp.mod.
 fshelp_mod_SOURCES = fs/fshelp.c
@@ -160,3 +160,7 @@ loopback_mod_CFLAGS = $(COMMON_CFLAGS)
 # For suspend.mod
 suspend_mod_SOURCES = commands/ieee1275/suspend.c
 suspend_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For help.mod.
+help_mod_SOURCES = commands/help.c
+help_mod_CFLAGS = $(COMMON_CFLAGS)
Binary files grub2/core.img and grub2.cmds/core.img differ
diff -upNr --exclude=CVS grub2/include/grub/i386/pc/init.h 
grub2.cmds/include/grub/i386/pc/init.h
--- grub2/include/grub/i386/pc/init.h   2004-12-27 13:46:20.000000000 +0000
+++ grub2.cmds/include/grub/i386/pc/init.h      2005-01-28 11:42:54.000000000 
+0000
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2002, 2004  Free Software Foundation, Inc.
+ *  Copyright (C) 2002, 2004, 2005  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -54,4 +54,12 @@ grub_uint32_t grub_get_mmap_entry (struc
 /* Turn on/off Gate A20.  */
 void grub_gate_a20 (int on);
 
+/* Reboot the machine.  */
+void EXPORT_FUNC (grub_reboot) (void);
+
+/* Halt the system, using APM if possible. If NO_APM is true, don't
+ * use APM even if it is available.  */
+void EXPORT_FUNC (grub_halt) (int no_apm);
+
+
 #endif /* ! GRUB_INIT_MACHINE_HEADER */
diff -upNr --exclude=CVS grub2/include/grub/normal.h 
grub2.cmds/include/grub/normal.h
--- grub2/include/grub/normal.h 2005-01-21 21:32:03.000000000 +0000
+++ grub2.cmds/include/grub/normal.h    2005-01-30 16:18:33.000000000 +0000
@@ -1,7 +1,7 @@
 /* normal.h - prototypes for the normal mode */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2002,2003,2005  Free Software Foundation, Inc.
+ *  Copyright (C) 2002,2003  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -141,6 +141,7 @@ void grub_command_init (void);
 void grub_normal_init_page (void);
 int grub_arg_parse (grub_command_t parser, int argc, char **argv,
                    struct grub_arg_list *usr, char ***args, int *argnum);
+void grub_arg_show_help (grub_command_t cmd);
 
 
 #ifdef GRUB_UTIL
@@ -160,6 +161,8 @@ void grub_terminal_init (void);
 void grub_terminal_fini (void);
 void grub_loop_init (void);
 void grub_loop_fini (void);
+void grub_help_init (void);
+void grub_help_fini (void);
 #endif
 
 #endif /* ! GRUB_NORMAL_HEADER */
diff -upNr --exclude=CVS grub2/normal/arg.c grub2.cmds/normal/arg.c
--- grub2/normal/arg.c  2004-07-12 17:53:07.000000000 +0000
+++ grub2.cmds/normal/arg.c     2005-01-30 16:18:31.000000000 +0000
@@ -101,8 +101,8 @@ show_usage (grub_command_t cmd)
   grub_printf ("Usage: %s\n", cmd->summary);
 }
 
-static void
-show_help (grub_command_t cmd)
+void
+grub_arg_show_help (grub_command_t cmd)
 {
   static void showargs (const struct grub_arg_option *opt)
     {
@@ -140,7 +140,7 @@ parse_option (grub_command_t cmd, int ke
   switch (key)
     {
     case 'h':
-      show_help (cmd);
+      grub_arg_show_help (cmd);
       return -1;
       
     case 'u':
diff -upNr --exclude=CVS grub2/normal/cmdline.c grub2.cmds/normal/cmdline.c
--- grub2/normal/cmdline.c      2004-12-29 22:43:48.000000000 +0000
+++ grub2.cmds/normal/cmdline.c 2005-01-28 11:42:54.000000000 +0000
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2003,2004,2005  Free Software 
Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -459,7 +459,7 @@ grub_cmdline_run (int nested)
 
 /* Get a command-line. If ECHO_CHAR is not zero, echo it instead of input
    characters. If READLINE is non-zero, readline-like key bindings are
-   available. If ESC is pushed, return non-zero, otherwise return zero.  */
+   available. If ESC is pushed, return zero, otherwise return non-zero.  */
 /* FIXME: The dumb interface is not supported yet.  */
 int
 grub_cmdline_get (const char *prompt, char cmdline[], unsigned max_len,
diff -upNr --exclude=CVS grub2/normal/command.c grub2.cmds/normal/command.c
--- grub2/normal/command.c      2004-09-17 09:36:52.000000000 +0000
+++ grub2.cmds/normal/command.c 2005-01-28 11:42:54.000000000 +0000
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2003  Free Software Foundation, Inc.
+ *  Copyright (C) 2003, 2005  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -316,10 +316,10 @@ grub_command_init (void)
                         "rescue", "Enter into the rescue mode.", 0);
 
   grub_register_command ("set", set_command, GRUB_COMMAND_FLAG_BOTH,
-                        "unset ENVVAR", "Set an environment variable.", 0);
+                        "set [ENVVAR=VALUE]", "Set an environment variable.", 
0);
 
   grub_register_command ("unset", unset_command, GRUB_COMMAND_FLAG_BOTH,
-                        "set [ENVVAR=VALUE]", "Remove an environment 
variable.", 0);
+                        "unset ENVVAR", "Remove an environment variable.", 0);
 
   grub_register_command ("insmod", insmod_command, GRUB_COMMAND_FLAG_BOTH,
                         "insmod MODULE|FILE", "Insert a module.", 0);
diff -upNr --exclude=CVS grub2/util/grub-emu.c grub2.cmds/util/grub-emu.c
--- grub2/util/grub-emu.c       2005-01-21 21:32:03.000000000 +0000
+++ grub2.cmds/util/grub-emu.c  2005-01-28 11:42:54.000000000 +0000
@@ -177,6 +177,7 @@ main (int argc, char *argv[])
   grub_cat_init ();
   grub_terminal_init ();
   grub_loop_init ();
+  grub_help_init ();
   
   /* XXX: Should normal mode be started by default?  */
   grub_normal_init ();
@@ -184,6 +185,7 @@ main (int argc, char *argv[])
   /* Start GRUB!  */
   grub_main ();
 
+  grub_help_fini ();
   grub_loop_fini ();
   grub_util_biosdisk_fini ();
   grub_normal_fini ();





reply via email to

[Prev in Thread] Current Thread [Next in Thread]