2N/A/* minicmd.c - commands for the rescue mode */
2N/A/*
2N/A * GRUB -- GRand Unified Bootloader
2N/A * Copyright (C) 2003,2005,2006,2007,2009 Free Software Foundation, Inc.
2N/A * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
2N/A *
2N/A * GRUB is free software: you can redistribute it and/or modify
2N/A * it under the terms of the GNU General Public License as published by
2N/A * the Free Software Foundation, either version 3 of the License, or
2N/A * (at your option) any later version.
2N/A *
2N/A * GRUB is distributed in the hope that it will be useful,
2N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of
2N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2N/A * GNU General Public License for more details.
2N/A *
2N/A * You should have received a copy of the GNU General Public License
2N/A * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
2N/A */
2N/A
2N/A#include <grub/dl.h>
2N/A#include <grub/mm.h>
2N/A#include <grub/err.h>
2N/A#include <grub/env.h>
2N/A#include <grub/misc.h>
2N/A#include <grub/file.h>
2N/A#include <grub/disk.h>
2N/A#include <grub/term.h>
2N/A#include <grub/loader.h>
2N/A#include <grub/command.h>
2N/A#include <grub/i18n.h>
2N/A
2N/AGRUB_MOD_LICENSE ("GPLv3+");
2N/A
2N/A/* cat FILE */
2N/Astatic grub_err_t
2N/Agrub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)),
2N/A int argc, char *argv[])
2N/A{
2N/A grub_file_t file;
2N/A char buf[GRUB_DISK_SECTOR_SIZE];
2N/A grub_ssize_t size;
2N/A
2N/A if (argc < 1)
2N/A return grub_error (GRUB_ERR_BAD_ARGUMENT, "no file specified");
2N/A
2N/A file = grub_file_open (argv[0]);
2N/A if (! file)
2N/A return grub_errno;
2N/A
2N/A while ((size = grub_file_read (file, buf, sizeof (buf))) > 0)
2N/A {
2N/A int i;
2N/A
2N/A for (i = 0; i < size; i++)
2N/A {
2N/A unsigned char c = buf[i];
2N/A
2N/A if ((grub_isprint (c) || grub_isspace (c)) && c != '\r')
2N/A grub_printf ("%c", c);
2N/A else
2N/A {
2N/A grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
2N/A grub_printf ("<%x>", (int) c);
2N/A grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
2N/A }
2N/A }
2N/A }
2N/A
2N/A grub_xputs ("\n");
2N/A grub_refresh ();
2N/A grub_file_close (file);
2N/A
2N/A return 0;
2N/A}
2N/A
2N/A/* help */
2N/Astatic grub_err_t
2N/Agrub_mini_cmd_help (struct grub_command *cmd __attribute__ ((unused)),
2N/A int argc __attribute__ ((unused)),
2N/A char *argv[] __attribute__ ((unused)))
2N/A{
2N/A grub_command_t p;
2N/A
2N/A for (p = grub_command_list; p; p = p->next)
2N/A grub_printf ("%s (%d%c)\t%s\n", p->name,
2N/A p->prio & GRUB_PRIO_LIST_PRIO_MASK,
2N/A (p->prio & GRUB_PRIO_LIST_FLAG_ACTIVE) ? '+' : '-',
2N/A p->description);
2N/A
2N/A return 0;
2N/A}
2N/A
2N/A/* dump ADDRESS [SIZE] */
2N/Astatic grub_err_t
2N/Agrub_mini_cmd_dump (struct grub_command *cmd __attribute__ ((unused)),
2N/A int argc, char *argv[])
2N/A{
2N/A grub_uint8_t *addr;
2N/A grub_size_t size = 4;
2N/A
2N/A if (argc == 0)
2N/A return grub_error (GRUB_ERR_BAD_ARGUMENT, "no address specified");
2N/A
2N/A addr = (grub_uint8_t *) grub_strtoul (argv[0], 0, 0);
2N/A if (grub_errno)
2N/A return grub_errno;
2N/A
2N/A if (argc > 1)
2N/A size = (grub_size_t) grub_strtoul (argv[1], 0, 0);
2N/A
2N/A while (size--)
2N/A {
2N/A grub_printf ("%x%x ", *addr >> 4, *addr & 0xf);
2N/A addr++;
2N/A }
2N/A
2N/A return 0;
2N/A}
2N/A
2N/A/* rmmod MODULE */
2N/Astatic grub_err_t
2N/Agrub_mini_cmd_rmmod (struct grub_command *cmd __attribute__ ((unused)),
2N/A int argc, char *argv[])
2N/A{
2N/A grub_dl_t mod;
2N/A
2N/A if (argc == 0)
2N/A return grub_error (GRUB_ERR_BAD_ARGUMENT, "no module specified");
2N/A
2N/A mod = grub_dl_get (argv[0]);
2N/A if (! mod)
2N/A return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module");
2N/A
2N/A if (grub_dl_unref (mod) <= 0)
2N/A grub_dl_unload (mod);
2N/A
2N/A return 0;
2N/A}
2N/A
2N/A/* lsmod */
2N/Astatic grub_err_t
2N/Agrub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
2N/A int argc __attribute__ ((unused)),
2N/A char *argv[] __attribute__ ((unused)))
2N/A{
2N/A grub_dl_t mod;
2N/A
2N/A grub_printf_ (N_("Name\tRef Count\tDependencies\n"));
2N/A FOR_DL_MODULES (mod)
2N/A {
2N/A grub_dl_dep_t dep;
2N/A
2N/A grub_printf ("%s\t%d\t\t", mod->name, mod->ref_count);
2N/A for (dep = mod->dep; dep; dep = dep->next)
2N/A {
2N/A if (dep != mod->dep)
2N/A grub_xputs (",");
2N/A
2N/A grub_printf ("%s", dep->mod->name);
2N/A }
2N/A grub_xputs ("\n");
2N/A }
2N/A
2N/A return 0;
2N/A}
2N/A
2N/A/* exit */
2N/Astatic grub_err_t __attribute__ ((noreturn))
2N/Agrub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)),
2N/A int argc __attribute__ ((unused)),
2N/A char *argv[] __attribute__ ((unused)))
2N/A{
2N/A /* Clean up after GRUB before returning control to firmware */
2N/A grub_execute_preboot_hooks(1);
2N/A grub_exit ();
2N/A /* Not reached. */
2N/A}
2N/A
2N/Astatic grub_command_t cmd_cat, cmd_help;
2N/Astatic grub_command_t cmd_dump, cmd_rmmod, cmd_lsmod, cmd_exit;
2N/A
2N/AGRUB_MOD_INIT(minicmd)
2N/A{
2N/A cmd_cat =
2N/A grub_register_command ("cat", grub_mini_cmd_cat,
2N/A N_("FILE"), N_("Show the contents of a file."));
2N/A cmd_help =
2N/A grub_register_command ("help", grub_mini_cmd_help,
2N/A 0, N_("Show this message."));
2N/A cmd_dump =
2N/A grub_register_command ("dump", grub_mini_cmd_dump,
2N/A N_("ADDR"), N_("Dump memory."));
2N/A cmd_rmmod =
2N/A grub_register_command ("rmmod", grub_mini_cmd_rmmod,
2N/A N_("MODULE"), N_("Remove a module."));
2N/A cmd_lsmod =
2N/A grub_register_command ("lsmod", grub_mini_cmd_lsmod,
2N/A 0, N_("Show loaded modules."));
2N/A cmd_exit =
2N/A grub_register_command ("exit", grub_mini_cmd_exit,
2N/A 0, N_("Exit from GRUB."));
2N/A}
2N/A
2N/AGRUB_MOD_FINI(minicmd)
2N/A{
2N/A grub_unregister_command (cmd_cat);
2N/A grub_unregister_command (cmd_help);
2N/A grub_unregister_command (cmd_dump);
2N/A grub_unregister_command (cmd_rmmod);
2N/A grub_unregister_command (cmd_lsmod);
2N/A grub_unregister_command (cmd_exit);
2N/A}