/* nthibr.c - tests whether an MS Windows system partition is hibernated */
/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2013  Peter Lustig
 *  Copyright (C) 2013  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 <http://www.gnu.org/licenses/>.
 */

#include <grub/types.h>
#include <grub/mm.h>
#include <grub/file.h>
#include <grub/misc.h>
#include <grub/dl.h>
#include <grub/command.h>
#include <grub/err.h>
#include <grub/i18n.h>

GRUB_MOD_LICENSE ("GPLv3+");

static grub_err_t
grub_cmd_nthibr (grub_command_t cmd __attribute__ ((unused)),
                 int argc, char **args)
{
  grub_uint8_t hibr_file_magic[4];
  grub_file_t hibr_file = 0;

  if (argc != 1)
    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));

  hibr_file = grub_file_open (args[0], GRUB_FILE_TYPE_FILE_ID);
  if (!hibr_file)
    return grub_errno;

  /* Try to read magic number of 'hiberfil.sys' */
  if (grub_file_read (hibr_file, hibr_file_magic,
		      sizeof (hibr_file_magic))
      != (grub_ssize_t) sizeof (hibr_file_magic))
    {
      if (!grub_errno)
	grub_error (GRUB_ERR_TEST_FAILURE, "false");
      goto exit;
    }

  if (!(grub_memcmp ("hibr", hibr_file_magic, sizeof (hibr_file_magic)) == 0
	|| grub_memcmp ("HIBR", hibr_file_magic, sizeof (hibr_file_magic)) == 0))
    grub_error (GRUB_ERR_TEST_FAILURE, "false");

 exit:
  grub_file_close (hibr_file);

  return grub_errno;
}

static grub_command_t cmd;

GRUB_MOD_INIT (check_nt_hiberfil)
{
  cmd = grub_register_command ("check_nt_hiberfil", grub_cmd_nthibr,
                               N_("FILE"),
                               N_("Test whether a hiberfil.sys is "
                                  "in hibernated state."));
}

GRUB_MOD_FINI (check_nt_hiberfil)
{
  grub_unregister_command (cmd);
}
