mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-11-04 06:47:23 +00:00 
			
		
		
		
	This is kind of a mess, requiring lots of OS-specific code to iterate over all possible devices. However, we use it in a number of scripts to discover devices and reimplementing those in terms of something else would be very complicated. Author: Dimitri John Ledkov <dimitri.ledkov@canonical.com> Forwarded: no Last-Update: 2016-09-18 Patch-Name: restore_mkdevicemap.patch
		
			
				
	
	
		
			182 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* grub-mkdevicemap.c - make a device map file automatically */
 | 
						|
/*
 | 
						|
 *  GRUB  --  GRand Unified Bootloader
 | 
						|
 *  Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2007,2008,2009,2010 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 <config.h>
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/stat.h>
 | 
						|
#include <errno.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <limits.h>
 | 
						|
 | 
						|
#include <grub/emu/misc.h>
 | 
						|
#include <grub/emu/hostdisk.h>
 | 
						|
#include <grub/util/misc.h>
 | 
						|
#include <grub/util/deviceiter.h>
 | 
						|
#include <grub/env.h>
 | 
						|
#include <grub/i18n.h>
 | 
						|
 | 
						|
#define _GNU_SOURCE	1
 | 
						|
#include <getopt.h>
 | 
						|
 | 
						|
#include "progname.h"
 | 
						|
 | 
						|
/* Context for make_device_map.  */
 | 
						|
struct make_device_map_ctx
 | 
						|
{
 | 
						|
  FILE *fp;
 | 
						|
  int num_fd;
 | 
						|
  int num_hd;
 | 
						|
};
 | 
						|
 | 
						|
/* Helper for make_device_map.  */
 | 
						|
static int
 | 
						|
process_device (const char *name, int is_floppy, void *data)
 | 
						|
{
 | 
						|
  struct make_device_map_ctx *ctx = data;
 | 
						|
 | 
						|
  grub_util_emit_devicemap_entry (ctx->fp, (char *) name,
 | 
						|
				  is_floppy, &ctx->num_fd, &ctx->num_hd);
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
make_device_map (const char *device_map, int floppy_disks)
 | 
						|
{
 | 
						|
  struct make_device_map_ctx ctx = {
 | 
						|
    .num_fd = 0,
 | 
						|
    .num_hd = 0
 | 
						|
  };
 | 
						|
 | 
						|
  if (strcmp (device_map, "-") == 0)
 | 
						|
    ctx.fp = stdout;
 | 
						|
  else
 | 
						|
    ctx.fp = fopen (device_map, "w");
 | 
						|
 | 
						|
  if (! ctx.fp)
 | 
						|
    grub_util_error (_("cannot open %s"), device_map);
 | 
						|
 | 
						|
  grub_util_iterate_devices (process_device, &ctx, floppy_disks);
 | 
						|
 | 
						|
  if (ctx.fp != stdout)
 | 
						|
    fclose (ctx.fp);
 | 
						|
}
 | 
						|
 | 
						|
static struct option options[] =
 | 
						|
  {
 | 
						|
    {"device-map", required_argument, 0, 'm'},
 | 
						|
    {"probe-second-floppy", no_argument, 0, 's'},
 | 
						|
    {"no-floppy", no_argument, 0, 'n'},
 | 
						|
    {"help", no_argument, 0, 'h'},
 | 
						|
    {"version", no_argument, 0, 'V'},
 | 
						|
    {"verbose", no_argument, 0, 'v'},
 | 
						|
    {0, 0, 0, 0}
 | 
						|
  };
 | 
						|
 | 
						|
static void
 | 
						|
usage (int status)
 | 
						|
{
 | 
						|
  if (status)
 | 
						|
    fprintf (stderr,
 | 
						|
	     _("Try `%s --help' for more information.\n"), program_name);
 | 
						|
  else
 | 
						|
    printf (_("\
 | 
						|
Usage: %s [OPTION]...\n\
 | 
						|
\n\
 | 
						|
Generate a device map file automatically.\n\
 | 
						|
\n\
 | 
						|
  -n, --no-floppy           do not probe any floppy drive\n\
 | 
						|
  -s, --probe-second-floppy probe the second floppy drive\n\
 | 
						|
  -m, --device-map=FILE     use FILE as the device map [default=%s]\n\
 | 
						|
  -h, --help                display this message and exit\n\
 | 
						|
  -V, --version             print version information and exit\n\
 | 
						|
  -v, --verbose             print verbose messages\n\
 | 
						|
\n\
 | 
						|
Report bugs to <%s>.\n\
 | 
						|
"), program_name,
 | 
						|
	    DEFAULT_DEVICE_MAP, PACKAGE_BUGREPORT);
 | 
						|
 | 
						|
  exit (status);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
main (int argc, char *argv[])
 | 
						|
{
 | 
						|
  char *dev_map = 0;
 | 
						|
  int floppy_disks = 1;
 | 
						|
 | 
						|
  grub_util_host_init (&argc, &argv);
 | 
						|
 | 
						|
  /* Check for options.  */
 | 
						|
  while (1)
 | 
						|
    {
 | 
						|
      int c = getopt_long (argc, argv, "snm:r:hVv", options, 0);
 | 
						|
 | 
						|
      if (c == -1)
 | 
						|
	break;
 | 
						|
      else
 | 
						|
	switch (c)
 | 
						|
	  {
 | 
						|
	  case 'm':
 | 
						|
	    if (dev_map)
 | 
						|
	      free (dev_map);
 | 
						|
 | 
						|
	    dev_map = xstrdup (optarg);
 | 
						|
	    break;
 | 
						|
 | 
						|
	  case 'n':
 | 
						|
	    floppy_disks = 0;
 | 
						|
	    break;
 | 
						|
 | 
						|
	  case 's':
 | 
						|
	    floppy_disks = 2;
 | 
						|
	    break;
 | 
						|
 | 
						|
	  case 'h':
 | 
						|
	    usage (0);
 | 
						|
	    break;
 | 
						|
 | 
						|
	  case 'V':
 | 
						|
	    printf ("%s (%s) %s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION);
 | 
						|
	    return 0;
 | 
						|
 | 
						|
	  case 'v':
 | 
						|
	    verbosity++;
 | 
						|
	    break;
 | 
						|
 | 
						|
	  default:
 | 
						|
	    usage (1);
 | 
						|
	    break;
 | 
						|
	  }
 | 
						|
    }
 | 
						|
 | 
						|
  if (verbosity > 1)
 | 
						|
    grub_env_set ("debug", "all");
 | 
						|
 | 
						|
  make_device_map (dev_map ? : DEFAULT_DEVICE_MAP, floppy_disks);
 | 
						|
 | 
						|
  free (dev_map);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 |