Initial integration of hints
This commit is contained in:
		
							parent
							
								
									9a79fcf2c9
								
							
						
					
					
						commit
						6babad5e59
					
				
					 11 changed files with 489 additions and 106 deletions
				
			
		|  | @ -242,10 +242,7 @@ program = { | ||||||
| 
 | 
 | ||||||
|   common = util/grub-mkdevicemap.c; |   common = util/grub-mkdevicemap.c; | ||||||
|   common = util/deviceiter.c; |   common = util/deviceiter.c; | ||||||
|   nosparc64 = util/devicemap.c; |   common = util/devicemap.c; | ||||||
| 
 |  | ||||||
|   sparc64_ieee1275 = util/ieee1275/ofpath.c; |  | ||||||
|   sparc64_ieee1275 = util/ieee1275/devicemap.c; |  | ||||||
| 
 | 
 | ||||||
|   ldadd = libgrubmods.a; |   ldadd = libgrubmods.a; | ||||||
|   ldadd = libgrubkern.a; |   ldadd = libgrubkern.a; | ||||||
|  | @ -258,6 +255,7 @@ program = { | ||||||
|   installdir = sbin; |   installdir = sbin; | ||||||
|   mansection = 8; |   mansection = 8; | ||||||
|   common = util/grub-probe.c; |   common = util/grub-probe.c; | ||||||
|  |   common = util/ieee1275/ofpath.c; | ||||||
| 
 | 
 | ||||||
|   ldadd = libgrubmods.a; |   ldadd = libgrubmods.a; | ||||||
|   ldadd = libgrubkern.a; |   ldadd = libgrubkern.a; | ||||||
|  |  | ||||||
|  | @ -42,6 +42,21 @@ static const struct grub_arg_option options[] = | ||||||
|     {"hint",	        'h', GRUB_ARG_OPTION_REPEATABLE, |     {"hint",	        'h', GRUB_ARG_OPTION_REPEATABLE, | ||||||
|      N_("First try the device HINT. If HINT ends in comma, " |      N_("First try the device HINT. If HINT ends in comma, " | ||||||
| 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | ||||||
|  |     {"hint-ieee1275",   0, GRUB_ARG_OPTION_REPEATABLE, | ||||||
|  |      N_("First try the device HINT if on IEEE1275. If HINT ends in comma, " | ||||||
|  | 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | ||||||
|  |     {"hint-bios",   0, GRUB_ARG_OPTION_REPEATABLE, | ||||||
|  |      N_("First try the device HINT if on BIOS. If HINT ends in comma, " | ||||||
|  | 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | ||||||
|  |     {"hint-baremetal",   0, GRUB_ARG_OPTION_REPEATABLE, | ||||||
|  |      N_("First try the device HINT. If HINT ends in comma, " | ||||||
|  | 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | ||||||
|  |     {"hint-efi",   0, GRUB_ARG_OPTION_REPEATABLE, | ||||||
|  |      N_("First try the device HINT if on EFI. If HINT ends in comma, " | ||||||
|  | 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | ||||||
|  |     {"hint-arc",   0, GRUB_ARG_OPTION_REPEATABLE, | ||||||
|  |      N_("First try the device HINT if on ARC. If HINT ends in comma, " | ||||||
|  | 	"also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, | ||||||
|     {0, 0, 0, 0, 0, 0} |     {0, 0, 0, 0, 0, 0} | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  | @ -52,7 +67,12 @@ enum options | ||||||
|     SEARCH_FS_UUID, |     SEARCH_FS_UUID, | ||||||
|     SEARCH_SET, |     SEARCH_SET, | ||||||
|     SEARCH_NO_FLOPPY, |     SEARCH_NO_FLOPPY, | ||||||
|     SEARCH_HINT |     SEARCH_HINT, | ||||||
|  |     SEARCH_HINT_IEEE1275, | ||||||
|  |     SEARCH_HINT_BIOS, | ||||||
|  |     SEARCH_HINT_BAREMETAL, | ||||||
|  |     SEARCH_HINT_EFI, | ||||||
|  |     SEARCH_HINT_ARC, | ||||||
|  }; |  }; | ||||||
| 
 | 
 | ||||||
| static grub_err_t | static grub_err_t | ||||||
|  | @ -60,27 +80,98 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args) | ||||||
| { | { | ||||||
|   struct grub_arg_list *state = ctxt->state; |   struct grub_arg_list *state = ctxt->state; | ||||||
|   const char *var = 0; |   const char *var = 0; | ||||||
|   int nhints = 0; |   int i = 0, j = 0, nhints = 0; | ||||||
|  |   char **hints = NULL; | ||||||
| 
 | 
 | ||||||
|   if (state[SEARCH_HINT].set) |   if (state[SEARCH_HINT].set) | ||||||
|     while (state[SEARCH_HINT].args[nhints]) |     for (i = 0; state[SEARCH_HINT].args[i]; i++) | ||||||
|       nhints++; |       nhints++; | ||||||
| 
 | 
 | ||||||
|   if (argc == 0) | #ifdef GRUB_MACHINE_IEEE1275 | ||||||
|  |   if (state[SEARCH_HINT_IEEE1275].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_IEEE1275].args[i]; i++) | ||||||
|  |       nhints++; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_EFI | ||||||
|  |   if (state[SEARCH_HINT_EFI].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_EFI].args[i]; i++) | ||||||
|  |       nhints++; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_PCBIOS | ||||||
|  |   if (state[SEARCH_HINT_BIOS].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_BIOS].args[i]; i++) | ||||||
|  |       nhints++; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_ARC | ||||||
|  |   if (state[SEARCH_HINT_ARC].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_ARC].args[i]; i++) | ||||||
|  |       nhints++; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |   if (state[SEARCH_HINT_BAREMETAL].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_BAREMETAL].args[i]; i++) | ||||||
|  |       nhints++; | ||||||
|  | 
 | ||||||
|  |   hints = grub_malloc (sizeof (hints[0]) * nhints); | ||||||
|  |   if (!hints) | ||||||
|  |     return grub_errno; | ||||||
|  |   j = 0; | ||||||
|  | 
 | ||||||
|  |   if (state[SEARCH_HINT].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT].args[i]; i++) | ||||||
|  |       hints[j++] = state[SEARCH_HINT].args[i]; | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_IEEE1275 | ||||||
|  |   if (state[SEARCH_HINT_IEEE1275].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_IEEE1275].args[i]; i++) | ||||||
|  |       hints[j++] = state[SEARCH_HINT_IEEE1275].args[i]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_EFI | ||||||
|  |   if (state[SEARCH_HINT_EFI].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_EFI].args[i]; i++) | ||||||
|  |       hints[j++] = state[SEARCH_HINT_EFI].args[i]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_ARC | ||||||
|  |   if (state[SEARCH_HINT_ARC].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_ARC].args[i]; i++) | ||||||
|  |       hints[j++] = state[SEARCH_HINT_ARC].args[i]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef GRUB_MACHINE_PCBIOS | ||||||
|  |   if (state[SEARCH_HINT_BIOS].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_BIOS].args[i]; i++) | ||||||
|  |       hints[j++] = state[SEARCH_HINT_BIOS].args[i]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |   if (state[SEARCH_HINT_BAREMETAL].set) | ||||||
|  |     for (i = 0; state[SEARCH_HINT_BAREMETAL].args[i]; i++) | ||||||
|  |       hints[j++] = state[SEARCH_HINT_BAREMETAL].args[i]; | ||||||
|  | 
 | ||||||
|  |   /* Skip hints for future platforms.  */ | ||||||
|  |   for (j = 0; j < argc; j++) | ||||||
|  |     if (grub_memcmp (args[j], "--hint-", sizeof ("--hint-") - 1) != 0) | ||||||
|  |       break; | ||||||
|  | 
 | ||||||
|  |   if (argc == j) | ||||||
|     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no argument specified"); |     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no argument specified"); | ||||||
| 
 | 
 | ||||||
|   if (state[SEARCH_SET].set) |   if (state[SEARCH_SET].set) | ||||||
|     var = state[SEARCH_SET].arg ? state[SEARCH_SET].arg : "root"; |     var = state[SEARCH_SET].arg ? state[SEARCH_SET].arg : "root"; | ||||||
| 
 | 
 | ||||||
|   if (state[SEARCH_LABEL].set) |   if (state[SEARCH_LABEL].set) | ||||||
|     grub_search_label (args[0], var, state[SEARCH_NO_FLOPPY].set,  |     grub_search_label (args[j], var, state[SEARCH_NO_FLOPPY].set,  | ||||||
| 		       state[SEARCH_HINT].args, nhints); | 		       hints, nhints); | ||||||
|   else if (state[SEARCH_FS_UUID].set) |   else if (state[SEARCH_FS_UUID].set) | ||||||
|     grub_search_fs_uuid (args[0], var, state[SEARCH_NO_FLOPPY].set, |     grub_search_fs_uuid (args[j], var, state[SEARCH_NO_FLOPPY].set, | ||||||
| 			 state[SEARCH_HINT].args, nhints); | 			 hints, nhints); | ||||||
|   else if (state[SEARCH_FILE].set) |   else if (state[SEARCH_FILE].set) | ||||||
|     grub_search_fs_file (args[0], var, state[SEARCH_NO_FLOPPY].set,  |     grub_search_fs_file (args[j], var, state[SEARCH_NO_FLOPPY].set,  | ||||||
| 			 state[SEARCH_HINT].args, nhints); | 			 hints, nhints); | ||||||
|   else |   else | ||||||
|     return grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type"); |     return grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type"); | ||||||
| 
 | 
 | ||||||
|  | @ -92,7 +183,8 @@ static grub_extcmd_t cmd; | ||||||
| GRUB_MOD_INIT(search) | GRUB_MOD_INIT(search) | ||||||
| { | { | ||||||
|   cmd = |   cmd = | ||||||
|     grub_register_extcmd ("search", grub_cmd_search, GRUB_COMMAND_FLAG_EXTRACTOR, |     grub_register_extcmd ("search", grub_cmd_search, | ||||||
|  | 			  GRUB_COMMAND_FLAG_EXTRACTOR | GRUB_COMMAND_ACCEPT_DASH, | ||||||
| 			  N_("[-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...]" | 			  N_("[-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...]" | ||||||
| 			     " NAME"), | 			     " NAME"), | ||||||
| 			  N_("Search devices by file, filesystem label" | 			  N_("Search devices by file, filesystem label" | ||||||
|  |  | ||||||
|  | @ -193,10 +193,16 @@ grub_ofdisk_iterate (int (*hook) (const char *name)) | ||||||
| 	  if (grub_strncmp (ent->shortest, "cdrom", 5) == 0) | 	  if (grub_strncmp (ent->shortest, "cdrom", 5) == 0) | ||||||
| 	    continue; | 	    continue; | ||||||
| 
 | 
 | ||||||
| 	  if (hook (ent->shortest)) | 	  { | ||||||
|  | 	    char buffer[sizeof ("ieee1275/") + grub_strlen (env->shortest)]; | ||||||
|  | 	    char *ptr; | ||||||
|  | 	    ptr = grub_stpcpy (buffer, "ieee1275/"); | ||||||
|  | 	    grub_strcpy (ptr, env->shortest); | ||||||
|  | 	    if (hook (buffer)) | ||||||
| 	      return 1; | 	      return 1; | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
|  |     }	   | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -236,7 +242,10 @@ grub_ofdisk_open (const char *name, grub_disk_t disk) | ||||||
|   char prop[64]; |   char prop[64]; | ||||||
|   grub_ssize_t actual; |   grub_ssize_t actual; | ||||||
| 
 | 
 | ||||||
|   devpath = compute_dev_path (name); |   if (grub_strncmp (devpath, "ieee1275/", sizeof ("ieee1275/") - 1) != 0) | ||||||
|  |       return grub_error (GRUB_ERR_UNKNOWN_DEVICE, | ||||||
|  | 			 "not IEEE1275 device"); | ||||||
|  |   devpath = compute_dev_path (name + sizeof ("ieee1275/") - 1); | ||||||
|   if (! devpath) |   if (! devpath) | ||||||
|     return grub_errno; |     return grub_errno; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -132,6 +132,7 @@ struct | ||||||
| { | { | ||||||
|   char *drive; |   char *drive; | ||||||
|   char *device; |   char *device; | ||||||
|  |   int device_map; | ||||||
| } map[256]; | } map[256]; | ||||||
| 
 | 
 | ||||||
| struct grub_util_biosdisk_data | struct grub_util_biosdisk_data | ||||||
|  | @ -140,6 +141,7 @@ struct grub_util_biosdisk_data | ||||||
|   int access_mode; |   int access_mode; | ||||||
|   int fd; |   int fd; | ||||||
|   int is_disk; |   int is_disk; | ||||||
|  |   int device_map; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #ifdef __linux__ | #ifdef __linux__ | ||||||
|  | @ -242,6 +244,7 @@ grub_util_biosdisk_open (const char *name, grub_disk_t disk) | ||||||
|   data->access_mode = 0; |   data->access_mode = 0; | ||||||
|   data->fd = -1; |   data->fd = -1; | ||||||
|   data->is_disk = 0; |   data->is_disk = 0; | ||||||
|  |   data->device_map = map[drive].device_map; | ||||||
| 
 | 
 | ||||||
|   /* Get the size.  */ |   /* Get the size.  */ | ||||||
| #if defined(__MINGW32__) | #if defined(__MINGW32__) | ||||||
|  | @ -1015,6 +1018,12 @@ read_device_map (const char *dev_map) | ||||||
|       grub_util_error ("%s:%d: %s", dev_map, lineno, msg); |       grub_util_error ("%s:%d: %s", dev_map, lineno, msg); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |   if (dev_map[0] == '\0') | ||||||
|  |     { | ||||||
|  |       grub_util_info (_("no device.map")); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|   fp = fopen (dev_map, "r"); |   fp = fopen (dev_map, "r"); | ||||||
|   if (! fp) |   if (! fp) | ||||||
|     { |     { | ||||||
|  | @ -1055,6 +1064,7 @@ read_device_map (const char *dev_map) | ||||||
|       map[drive].drive = xmalloc (p - e + sizeof ('\0')); |       map[drive].drive = xmalloc (p - e + sizeof ('\0')); | ||||||
|       strncpy (map[drive].drive, e, p - e + sizeof ('\0')); |       strncpy (map[drive].drive, e, p - e + sizeof ('\0')); | ||||||
|       map[drive].drive[p - e] = '\0'; |       map[drive].drive[p - e] = '\0'; | ||||||
|  |       map[drive].device_map = 1; | ||||||
| 
 | 
 | ||||||
|       p++; |       p++; | ||||||
|       /* Skip leading spaces.  */ |       /* Skip leading spaces.  */ | ||||||
|  | @ -1623,7 +1633,10 @@ find_system_device (const char *os_dev, struct stat *st, int convert, int add) | ||||||
|     grub_util_error (_("device count exceeds limit")); |     grub_util_error (_("device count exceeds limit")); | ||||||
| 
 | 
 | ||||||
|   map[i].device = os_disk; |   map[i].device = os_disk; | ||||||
|   map[i].drive = xstrdup (os_disk); |   map[i].drive = xmalloc (sizeof ("hostdisk/") + strlen (os_disk)); | ||||||
|  |   strcpy (map[i].drive, "hostdisk/"); | ||||||
|  |   strcpy (map[i].drive + sizeof ("hostdisk/") - 1, os_disk); | ||||||
|  |   map[i].device_map = 0; | ||||||
| 
 | 
 | ||||||
|   return i; |   return i; | ||||||
| } | } | ||||||
|  | @ -1818,6 +1831,14 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const char * | ||||||
|  | grub_util_biosdisk_get_compatibility_hint (grub_disk_t disk) | ||||||
|  | { | ||||||
|  |   if (disk->dev != &grub_util_biosdisk_dev || map[disk->id].device_map) | ||||||
|  |     return disk->name; | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const char * | const char * | ||||||
| grub_util_biosdisk_get_osdev (grub_disk_t disk) | grub_util_biosdisk_get_osdev (grub_disk_t disk) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -474,7 +474,7 @@ static grub_command_t cmd_clear; | ||||||
| 
 | 
 | ||||||
| static void (*grub_xputs_saved) (const char *str); | static void (*grub_xputs_saved) (const char *str); | ||||||
| static const char *features[] = { | static const char *features[] = { | ||||||
|   "feature_chainloader_bpb", "feature_ntldr" |   "feature_chainloader_bpb", "feature_ntldr", "feature_platform_search_hint" | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| GRUB_MOD_INIT(normal) | GRUB_MOD_INIT(normal) | ||||||
|  |  | ||||||
|  | @ -28,6 +28,8 @@ char *grub_util_biosdisk_get_grub_dev (const char *os_dev); | ||||||
| const char *grub_util_biosdisk_get_osdev (grub_disk_t disk); | const char *grub_util_biosdisk_get_osdev (grub_disk_t disk); | ||||||
| int grub_util_biosdisk_is_present (const char *name); | int grub_util_biosdisk_is_present (const char *name); | ||||||
| int grub_util_biosdisk_is_floppy (grub_disk_t disk); | int grub_util_biosdisk_is_floppy (grub_disk_t disk); | ||||||
|  | const char * | ||||||
|  | grub_util_biosdisk_get_compatibility_hint (grub_disk_t disk); | ||||||
| grub_err_t grub_util_biosdisk_flush (struct grub_disk *disk); | grub_err_t grub_util_biosdisk_flush (struct grub_disk *disk); | ||||||
| 
 | 
 | ||||||
| #endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */ | #endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */ | ||||||
|  |  | ||||||
|  | @ -50,7 +50,6 @@ modules= | ||||||
| install_device= | install_device= | ||||||
| no_floppy= | no_floppy= | ||||||
| force_lba= | force_lba= | ||||||
| recheck=no |  | ||||||
| debug=no | debug=no | ||||||
| debug_image= | debug_image= | ||||||
| 
 | 
 | ||||||
|  | @ -106,7 +105,6 @@ Install GRUB on your drive. | ||||||
|   --no-floppy             do not probe any floppy drive |   --no-floppy             do not probe any floppy drive | ||||||
|   --allow-floppy          Make the drive also bootable as floppy  |   --allow-floppy          Make the drive also bootable as floppy  | ||||||
|                           (default for fdX devices). May break on some BIOSes. |                           (default for fdX devices). May break on some BIOSes. | ||||||
|   --recheck               probe a device map even if it already exists |  | ||||||
|   --force                 install even if problems are detected |   --force                 install even if problems are detected | ||||||
| EOF | EOF | ||||||
| if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then | if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then | ||||||
|  | @ -218,7 +216,7 @@ do | ||||||
|     --no-floppy) |     --no-floppy) | ||||||
| 	no_floppy="--no-floppy" ;; | 	no_floppy="--no-floppy" ;; | ||||||
|     --recheck) |     --recheck) | ||||||
| 	recheck=yes ;; | 	    ;; | ||||||
|     --removable) |     --removable) | ||||||
| 	removable=yes ;; | 	removable=yes ;; | ||||||
| 
 | 
 | ||||||
|  | @ -408,27 +406,17 @@ fi | ||||||
| # Create the GRUB directory if it is not present. | # Create the GRUB directory if it is not present. | ||||||
| mkdir -p "$grubdir" || exit 1 | mkdir -p "$grubdir" || exit 1 | ||||||
| 
 | 
 | ||||||
| # If --recheck is specified, remove the device map, if present. |  | ||||||
| if test $recheck = yes; then |  | ||||||
|     rm -f "$device_map" |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Create the device map file if it is not present. | # Create the device map file if it is not present. | ||||||
| if test -f "$device_map"; then | if test -f "$device_map"; then | ||||||
|     : |     # Make sure that there is no duplicated entry. | ||||||
| else |     tmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' "$device_map" \ | ||||||
|     # Create a safe temporary file. |  | ||||||
|     test -n "$mklog" && log_file=`$mklog` |  | ||||||
| 
 |  | ||||||
|     "$grub_mkdevicemap" "--device-map=$device_map" $no_floppy || exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Make sure that there is no duplicated entry. |  | ||||||
| tmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' "$device_map" \ |  | ||||||
| 	| sort | uniq -d | sed -n 1p` | 	| sort | uniq -d | sed -n 1p` | ||||||
| if test -n "$tmp"; then |     if test -n "$tmp"; then | ||||||
| 	echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2 | 	echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2 | ||||||
| 	exit 1 | 	exit 1 | ||||||
|  |     fi | ||||||
|  | else | ||||||
|  |     device_map= | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # Copy the GRUB images to the GRUB directory. | # Copy the GRUB images to the GRUB directory. | ||||||
|  | @ -536,7 +524,22 @@ if [ "x${devabstraction_module}" = "x" ] ; then | ||||||
|               |               | ||||||
|           exit 1 |           exit 1 | ||||||
|         fi |         fi | ||||||
|         echo "search.fs_uuid ${uuid} root " >> "${grubdir}/load.cfg" | 
 | ||||||
|  | 	if [ x"$disk_module" != x ] && [ x"$disk_module" != xbiosdisk ]; then | ||||||
|  |             hints="`"$grub_probe" --device-map="${device_map}" --target=baremetal_hints --device "${grub_device}"`" | ||||||
|  | 	elif [ x"$platform" = xpc ]; then | ||||||
|  |             hints="`"$grub_probe" --device-map="${device_map}" --target=bios_hints --device "${grub_device}"`" | ||||||
|  | 	elif [ x"$platform" = xefi ]; then | ||||||
|  |             hints="`"$grub_probe" --device-map="${device_map}" --target=efi_hints --device "${grub_device}"`" | ||||||
|  | 	elif [ x"$platform" = xieee1275 ]; then | ||||||
|  |             hints="`"$grub_probe" --device-map="${device_map}" --target=ieee1275_hints --device "${grub_device}"`" | ||||||
|  | 	elif [ x"$platform" = xloongson ] || [ x"$platform" = xqemu ] || [ x"$platform" = xcoreboot ] || [ x"$platform" = xmultiboot ] || [ x"$platform" = xqemu-mips ]; then | ||||||
|  |             hints="`"$grub_probe" --device-map="${device_map}" --target=baremetal_hints --device "${grub_device}"`" | ||||||
|  | 	else | ||||||
|  |             echo "No hints available for your platform. Expect reduced performance" | ||||||
|  | 	    hints= | ||||||
|  |         fi | ||||||
|  |         echo "search.fs_uuid ${uuid} root $hints " >> "${grubdir}/load.cfg" | ||||||
| 	echo 'set prefix=($root)'"${relative_grubdir}" >> "${grubdir}/load.cfg" | 	echo 'set prefix=($root)'"${relative_grubdir}" >> "${grubdir}/load.cfg" | ||||||
| 	config_opt="-c ${grubdir}/load.cfg " | 	config_opt="-c ${grubdir}/load.cfg " | ||||||
|         modules="$modules search_fs_uuid" |         modules="$modules search_fs_uuid" | ||||||
|  |  | ||||||
|  | @ -36,7 +36,6 @@ grub_mkconfig_dir=${sysconfdir}/grub.d | ||||||
| 
 | 
 | ||||||
| self=`basename $0` | self=`basename $0` | ||||||
| 
 | 
 | ||||||
| grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed "${transform}"` |  | ||||||
| grub_probe=${sbindir}/`echo grub-probe | sed "${transform}"` | grub_probe=${sbindir}/`echo grub-probe | sed "${transform}"` | ||||||
| grub_script_check="${bindir}/`echo grub-script-check | sed "${transform}"`" | grub_script_check="${bindir}/`echo grub-script-check | sed "${transform}"`" | ||||||
| 
 | 
 | ||||||
|  | @ -118,14 +117,6 @@ if [ "$EUID" != 0 ] ; then | ||||||
|   fi |   fi | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| set $grub_mkdevicemap dummy |  | ||||||
| if test -f "$1"; then |  | ||||||
|     : |  | ||||||
| else |  | ||||||
|     echo "$1: Not found." 1>&2 |  | ||||||
|     exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| set $grub_probe dummy | set $grub_probe dummy | ||||||
| if test -f "$1"; then | if test -f "$1"; then | ||||||
|     : |     : | ||||||
|  | @ -136,10 +127,6 @@ fi | ||||||
| 
 | 
 | ||||||
| mkdir -p ${GRUB_PREFIX} | mkdir -p ${GRUB_PREFIX} | ||||||
| 
 | 
 | ||||||
| if test -e ${GRUB_PREFIX}/device.map ; then : ; else |  | ||||||
|   ${grub_mkdevicemap} |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Device containing our userland.  Typically used for root= parameter. | # Device containing our userland.  Typically used for root= parameter. | ||||||
| GRUB_DEVICE="`${grub_probe} --target=device /`" | GRUB_DEVICE="`${grub_probe} --target=device /`" | ||||||
| GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true | GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true | ||||||
|  |  | ||||||
|  | @ -128,9 +128,14 @@ prepare_grub_to_access_device () | ||||||
| 
 | 
 | ||||||
|   # If there's a filesystem UUID that GRUB is capable of identifying, use it; |   # If there's a filesystem UUID that GRUB is capable of identifying, use it; | ||||||
|   # otherwise set root as per value in device.map. |   # otherwise set root as per value in device.map. | ||||||
|   echo "set root='`"${grub_probe}" --device "${device}" --target=drive`'" |   echo "set root='`"${grub_probe}" --device "${device}" --target=compatibility_hint`'" | ||||||
|   if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then |   if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then | ||||||
|     echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}" |     hints="`"${grub_probe}" --device "${device}" --target=hints_string 2> /dev/null`" | ||||||
|  |     echo "if [ x$feature_platform_search_hint = xy ]; then" | ||||||
|  |     echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}" | ||||||
|  |     echo "else" | ||||||
|  |     echo "  search --no-floppy --fs-uuid --set=root ${fs_uuid}" | ||||||
|  |     echo "fi" | ||||||
|   fi |   fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -34,6 +34,8 @@ | ||||||
| #include <grub/env.h> | #include <grub/env.h> | ||||||
| #include <grub/raid.h> | #include <grub/raid.h> | ||||||
| #include <grub/i18n.h> | #include <grub/i18n.h> | ||||||
|  | #include <grub/emu/misc.h> | ||||||
|  | #include <grub/util/ofpath.h> | ||||||
| 
 | 
 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  | @ -54,6 +56,13 @@ enum { | ||||||
|   PRINT_DEVICE, |   PRINT_DEVICE, | ||||||
|   PRINT_PARTMAP, |   PRINT_PARTMAP, | ||||||
|   PRINT_ABSTRACTION, |   PRINT_ABSTRACTION, | ||||||
|  |   PRINT_HINT_STR, | ||||||
|  |   PRINT_BIOS_HINT, | ||||||
|  |   PRINT_IEEE1275_HINT, | ||||||
|  |   PRINT_BAREMETAL_HINT, | ||||||
|  |   PRINT_EFI_HINT, | ||||||
|  |   PRINT_ARC_HINT, | ||||||
|  |   PRINT_COMPATIBILITY_HINT | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int print = PRINT_FS; | int print = PRINT_FS; | ||||||
|  | @ -88,6 +97,131 @@ probe_raid_level (grub_disk_t disk) | ||||||
|   return ((struct grub_raid_array *) disk->data)->level; |   return ((struct grub_raid_array *) disk->data)->level; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* Since OF path names can have "," characters in them, and GRUB
 | ||||||
|  |    internally uses "," to indicate partitions (unlike OF which uses | ||||||
|  |    ":" for this purpose) we escape such commas.  */ | ||||||
|  | static char * | ||||||
|  | escape_of_path (const char *orig_path) | ||||||
|  | { | ||||||
|  |   char *new_path, *d, c; | ||||||
|  |   const char *p; | ||||||
|  | 
 | ||||||
|  |   if (!strchr (orig_path, ',')) | ||||||
|  |     return (char *) orig_path; | ||||||
|  | 
 | ||||||
|  |   new_path = xmalloc (strlen (orig_path) * 2 + sizeof ("ieee1275/")); | ||||||
|  | 
 | ||||||
|  |   p = orig_path; | ||||||
|  |   grub_strcpy (new_path, "ieee1275/"); | ||||||
|  |   d = new_path + sizeof ("ieee1275/") - 1; | ||||||
|  |   while ((c = *p++) != '\0') | ||||||
|  |     { | ||||||
|  |       if (c == ',') | ||||||
|  | 	*d++ = '\\'; | ||||||
|  |       *d++ = c; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   free ((char *) orig_path); | ||||||
|  | 
 | ||||||
|  |   return new_path; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static char * | ||||||
|  | guess_bios_drive (const char *orig_path) | ||||||
|  | { | ||||||
|  |   char *canon; | ||||||
|  |   char *ptr; | ||||||
|  |   canon = canonicalize_file_name (orig_path); | ||||||
|  |   if (!canon) | ||||||
|  |     return NULL; | ||||||
|  |   ptr = strrchr (orig_path, '/'); | ||||||
|  |   if (ptr) | ||||||
|  |     ptr++; | ||||||
|  |   else | ||||||
|  |     ptr = canon; | ||||||
|  |   if ((ptr[0] == 's' || ptr[0] == 'h') && ptr[1] == 'd') | ||||||
|  |     { | ||||||
|  |       int num = ptr[2] - 'a'; | ||||||
|  |       free (canon); | ||||||
|  |       return xasprintf ("hd%d", num); | ||||||
|  |     } | ||||||
|  |   if (ptr[0] == 'f' && ptr[1] == 'd') | ||||||
|  |     { | ||||||
|  |       int num = atoi (ptr + 2); | ||||||
|  |       free (canon); | ||||||
|  |       return xasprintf ("fd%d", num); | ||||||
|  |     } | ||||||
|  |   free (canon); | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static char * | ||||||
|  | guess_efi_drive (const char *orig_path) | ||||||
|  | { | ||||||
|  |   char *canon; | ||||||
|  |   char *ptr; | ||||||
|  |   canon = canonicalize_file_name (orig_path); | ||||||
|  |   if (!canon) | ||||||
|  |     return NULL; | ||||||
|  |   ptr = strrchr (orig_path, '/'); | ||||||
|  |   if (ptr) | ||||||
|  |     ptr++; | ||||||
|  |   else | ||||||
|  |     ptr = canon; | ||||||
|  |   if ((ptr[0] == 's' || ptr[0] == 'h') && ptr[1] == 'd') | ||||||
|  |     { | ||||||
|  |       int num = ptr[2] - 'a'; | ||||||
|  |       free (canon); | ||||||
|  |       return xasprintf ("hd%d", num); | ||||||
|  |     } | ||||||
|  |   if (ptr[0] == 'f' && ptr[1] == 'd') | ||||||
|  |     { | ||||||
|  |       int num = atoi (ptr + 2); | ||||||
|  |       free (canon); | ||||||
|  |       return xasprintf ("fd%d", num); | ||||||
|  |     } | ||||||
|  |   free (canon); | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static char * | ||||||
|  | guess_baremetal_drive (const char *orig_path) | ||||||
|  | { | ||||||
|  |   char *canon; | ||||||
|  |   char *ptr; | ||||||
|  |   canon = canonicalize_file_name (orig_path); | ||||||
|  |   if (!canon) | ||||||
|  |     return NULL; | ||||||
|  |   ptr = strrchr (orig_path, '/'); | ||||||
|  |   if (ptr) | ||||||
|  |     ptr++; | ||||||
|  |   else | ||||||
|  |     ptr = canon; | ||||||
|  |   if (ptr[0] == 'h' && ptr[1] == 'd') | ||||||
|  |     { | ||||||
|  |       int num = ptr[2] - 'a'; | ||||||
|  |       free (canon); | ||||||
|  |       return xasprintf ("ata%d", num); | ||||||
|  |     } | ||||||
|  |   if (ptr[0] == 's' && ptr[1] == 'd') | ||||||
|  |     { | ||||||
|  |       int num = ptr[2] - 'a'; | ||||||
|  |       free (canon); | ||||||
|  |       return xasprintf ("ahci%d", num); | ||||||
|  |     } | ||||||
|  |   free (canon); | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | print_full_name (const char *drive, grub_device_t dev) | ||||||
|  | { | ||||||
|  |   if (dev->disk->partition) | ||||||
|  |     printf ("%s,%s", drive, grub_partition_get_name (dev->disk->partition)); | ||||||
|  |   else | ||||||
|  |     printf ("%s", drive); | ||||||
|  | }  | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| probe (const char *path, char *device_name) | probe (const char *path, char *device_name) | ||||||
| { | { | ||||||
|  | @ -134,6 +268,173 @@ probe (const char *path, char *device_name) | ||||||
|   if (! dev) |   if (! dev) | ||||||
|     grub_util_error ("%s", grub_errmsg); |     grub_util_error ("%s", grub_errmsg); | ||||||
| 
 | 
 | ||||||
|  |   if (print == PRINT_HINT_STR) | ||||||
|  |     { | ||||||
|  |       const char *orig_path = grub_util_devname_to_ofpath (device_name); | ||||||
|  |       char *ofpath = escape_of_path (orig_path); | ||||||
|  |       char *biosname, *bare, *efi; | ||||||
|  |       const char *map; | ||||||
|  | 
 | ||||||
|  |       printf ("--hint-ieee1275="); | ||||||
|  |       print_full_name (ofpath, dev); | ||||||
|  |       printf (" "); | ||||||
|  |       free (ofpath); | ||||||
|  | 
 | ||||||
|  |       biosname = guess_bios_drive (device_name); | ||||||
|  |       if (biosname) | ||||||
|  | 	{ | ||||||
|  | 	  printf ("--hint-bios="); | ||||||
|  | 	  print_full_name (biosname, dev); | ||||||
|  | 	  printf (" "); | ||||||
|  | 	} | ||||||
|  |       free (biosname); | ||||||
|  | 
 | ||||||
|  |       efi = guess_efi_drive (device_name); | ||||||
|  |       if (efi) | ||||||
|  | 	{ | ||||||
|  | 	  printf ("--hint-efi="); | ||||||
|  | 	  print_full_name (efi, dev); | ||||||
|  | 	  printf (" "); | ||||||
|  | 	} | ||||||
|  |       free (efi); | ||||||
|  | 
 | ||||||
|  |       bare = guess_baremetal_drive (device_name); | ||||||
|  |       if (bare) | ||||||
|  | 	{ | ||||||
|  | 	  printf ("--hint-baremetal="); | ||||||
|  | 	  print_full_name (bare, dev); | ||||||
|  | 	  printf (" "); | ||||||
|  | 	} | ||||||
|  |       free (biosname); | ||||||
|  | 
 | ||||||
|  |       /* FIXME: Add ARC hint.  */ | ||||||
|  | 
 | ||||||
|  |       map = grub_util_biosdisk_get_compatibility_hint (dev->disk); | ||||||
|  |       if (map) | ||||||
|  | 	{ | ||||||
|  | 	  printf ("--hint="); | ||||||
|  | 	  print_full_name (map, dev); | ||||||
|  | 	  printf (" "); | ||||||
|  | 	} | ||||||
|  |       printf ("\n"); | ||||||
|  | 
 | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   if (print == PRINT_COMPATIBILITY_HINT) | ||||||
|  |     { | ||||||
|  |       const char *map; | ||||||
|  |       char *biosname; | ||||||
|  |       map = grub_util_biosdisk_get_compatibility_hint (dev->disk); | ||||||
|  |       if (map) | ||||||
|  | 	{ | ||||||
|  | 	  printf ("%s\n", map); | ||||||
|  | 	  goto end; | ||||||
|  | 	} | ||||||
|  |       biosname = guess_bios_drive (device_name); | ||||||
|  |       if (biosname) | ||||||
|  | 	print_full_name (biosname, dev); | ||||||
|  |       printf ("\n"); | ||||||
|  |       free (biosname); | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   if (print == PRINT_BIOS_HINT) | ||||||
|  |     { | ||||||
|  |       char *biosname; | ||||||
|  |       biosname = guess_bios_drive (device_name); | ||||||
|  |       if (biosname) | ||||||
|  | 	print_full_name (biosname, dev); | ||||||
|  |       printf ("\n"); | ||||||
|  |       free (biosname); | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  |   if (print == PRINT_IEEE1275_HINT) | ||||||
|  |     { | ||||||
|  |       const char *orig_path = grub_util_devname_to_ofpath (device_name); | ||||||
|  |       char *ofpath = escape_of_path (orig_path); | ||||||
|  |       const char *map; | ||||||
|  | 
 | ||||||
|  |       map = grub_util_biosdisk_get_compatibility_hint (dev->disk); | ||||||
|  |       if (map) | ||||||
|  | 	{ | ||||||
|  | 	  printf (" "); | ||||||
|  | 	  print_full_name (map, dev); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  |       printf (" "); | ||||||
|  |       print_full_name (ofpath, dev); | ||||||
|  | 
 | ||||||
|  |       printf ("\n"); | ||||||
|  |       free (ofpath); | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  |   if (print == PRINT_EFI_HINT) | ||||||
|  |     { | ||||||
|  |       char *biosname; | ||||||
|  |       char *name; | ||||||
|  |       const char *map; | ||||||
|  |       biosname = guess_efi_drive (device_name); | ||||||
|  | 
 | ||||||
|  |       map = grub_util_biosdisk_get_compatibility_hint (dev->disk); | ||||||
|  |       if (map) | ||||||
|  | 	{ | ||||||
|  | 	  printf (" "); | ||||||
|  | 	  print_full_name (map, dev); | ||||||
|  | 	} | ||||||
|  |       if (biosname) | ||||||
|  | 	{ | ||||||
|  | 	  printf (" "); | ||||||
|  | 	  print_full_name (biosname, dev); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  |       printf ("\n"); | ||||||
|  |       free (biosname); | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   if (print == PRINT_BAREMETAL_HINT) | ||||||
|  |     { | ||||||
|  |       char *biosname; | ||||||
|  |       char *name; | ||||||
|  |       const char *map; | ||||||
|  | 
 | ||||||
|  |       biosname = guess_baremetal_drive (device_name); | ||||||
|  | 
 | ||||||
|  |       map = grub_util_biosdisk_get_compatibility_hint (dev->disk); | ||||||
|  |       if (map) | ||||||
|  | 	{ | ||||||
|  | 	  printf (" "); | ||||||
|  | 	  print_full_name (map, dev); | ||||||
|  | 	} | ||||||
|  |       if (biosname) | ||||||
|  | 	{ | ||||||
|  | 	  printf (" "); | ||||||
|  | 	  print_full_name (biosname, dev); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  |       printf ("\n"); | ||||||
|  |       free (biosname); | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   if (print == PRINT_ARC_HINT) | ||||||
|  |     { | ||||||
|  |       const char *map; | ||||||
|  | 
 | ||||||
|  |       map = grub_util_biosdisk_get_compatibility_hint (dev->disk); | ||||||
|  |       if (map) | ||||||
|  | 	{ | ||||||
|  | 	  printf (" "); | ||||||
|  | 	  print_full_name (map, dev); | ||||||
|  | 	} | ||||||
|  |       printf ("\n"); | ||||||
|  | 
 | ||||||
|  |       /* FIXME */ | ||||||
|  | 
 | ||||||
|  |       goto end; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|   if (print == PRINT_ABSTRACTION) |   if (print == PRINT_ABSTRACTION) | ||||||
|     { |     { | ||||||
|       grub_disk_memberlist_t list = NULL, tmp; |       grub_disk_memberlist_t list = NULL, tmp; | ||||||
|  | @ -348,6 +649,20 @@ main (int argc, char *argv[]) | ||||||
| 	      print = PRINT_PARTMAP; | 	      print = PRINT_PARTMAP; | ||||||
| 	    else if (!strcmp (optarg, "abstraction")) | 	    else if (!strcmp (optarg, "abstraction")) | ||||||
| 	      print = PRINT_ABSTRACTION; | 	      print = PRINT_ABSTRACTION; | ||||||
|  | 	    else if (!strcmp (optarg, "hints_string")) | ||||||
|  | 	      print = PRINT_HINT_STR; | ||||||
|  | 	    else if (!strcmp (optarg, "bios_hints")) | ||||||
|  | 	      print = PRINT_BIOS_HINT; | ||||||
|  | 	    else if (!strcmp (optarg, "ieee1275_hints")) | ||||||
|  | 	      print = PRINT_IEEE1275_HINT; | ||||||
|  | 	    else if (!strcmp (optarg, "baremetal_hints")) | ||||||
|  | 	      print = PRINT_BAREMETAL_HINT; | ||||||
|  | 	    else if (!strcmp (optarg, "efi_hints")) | ||||||
|  | 	      print = PRINT_EFI_HINT; | ||||||
|  | 	    else if (!strcmp (optarg, "arc_hints")) | ||||||
|  | 	      print = PRINT_ARC_HINT; | ||||||
|  | 	    else if (!strcmp (optarg, "compatibility_hint")) | ||||||
|  | 	      print = PRINT_COMPATIBILITY_HINT; | ||||||
| 	    else | 	    else | ||||||
| 	      usage (1); | 	      usage (1); | ||||||
| 	    break; | 	    break; | ||||||
|  |  | ||||||
|  | @ -1,49 +0,0 @@ | ||||||
| #include <stdio.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include <grub/types.h> |  | ||||||
| #include <grub/util/deviceiter.h> |  | ||||||
| #include <grub/util/ofpath.h> |  | ||||||
| #include <grub/util/misc.h> |  | ||||||
| 
 |  | ||||||
| /* Since OF path names can have "," characters in them, and GRUB
 |  | ||||||
|    internally uses "," to indicate partitions (unlike OF which uses |  | ||||||
|    ":" for this purpose) we escape such commas.  */ |  | ||||||
| 
 |  | ||||||
| static char * |  | ||||||
| escape_of_path (const char *orig_path) |  | ||||||
| { |  | ||||||
|   char *new_path, *d, c; |  | ||||||
|   const char *p; |  | ||||||
| 
 |  | ||||||
|   if (!strchr (orig_path, ',')) |  | ||||||
|     return (char *) orig_path; |  | ||||||
| 
 |  | ||||||
|   new_path = xmalloc (strlen (orig_path) * 2); |  | ||||||
| 
 |  | ||||||
|   p = orig_path; |  | ||||||
|   d = new_path; |  | ||||||
|   while ((c = *p++) != '\0') |  | ||||||
|     { |  | ||||||
|       if (c == ',') |  | ||||||
| 	*d++ = '\\'; |  | ||||||
|       *d++ = c; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|   free ((char *) orig_path); |  | ||||||
| 
 |  | ||||||
|   return new_path; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| grub_util_emit_devicemap_entry (FILE *fp, char *name, |  | ||||||
| 				int is_floppy __attribute__((unused)), |  | ||||||
| 				int *num_fd __attribute__((unused)), |  | ||||||
| 				int *num_hd __attribute__((unused))) |  | ||||||
| { |  | ||||||
|   const char *orig_path = grub_util_devname_to_ofpath (name); |  | ||||||
|   char *ofpath = escape_of_path (orig_path); |  | ||||||
| 
 |  | ||||||
|   fprintf(fp, "(%s)\t%s\n", ofpath, name); |  | ||||||
| 
 |  | ||||||
|   free (ofpath); |  | ||||||
| } |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue