+2009-11-23 Robert Millan <rmh.grub@aybabtu.com>
+
+ * util/hostdisk.c: Include `<grub/i18n.h>'.
+ (find_grub_drive): Use ARRAY_SIZE for map size calculation.
+ (make_device_name): Rewrite using asprintf.
+ (convert_system_partition_to_system_disk): Replace 0 with NULL.
+ (find_system_device): If a device is not found, generate one just
+ by reusing the OS path name.
+ (read_device_map): Make it permissible for device.map not to exist.
+
2009-11-23 Robert Millan <rmh.grub@aybabtu.com>
* script/sh/execute.c: Move from here ...
#include <grub/util/misc.h>
#include <grub/util/hostdisk.h>
#include <grub/misc.h>
+#include <grub/i18n.h>
#include <stdio.h>
#include <stdlib.h>
if (name)
{
- for (i = 0; i < sizeof (map) / sizeof (map[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (map); i++)
if (map[i].drive && ! strcmp (map[i].drive, name))
return i;
}
fp = fopen (dev_map, "r");
if (! fp)
- grub_util_error ("Cannot open `%s'", dev_map);
+ {
+ grub_util_info (_("Cannot open `%s'"), dev_map);
+ return;
+ }
while (fgets (buf, sizeof (buf), fp))
{
static char *
make_device_name (int drive, int dos_part, int bsd_part)
{
- int len = strlen(map[drive].drive);
- char *p;
+ char *ret;
+ char *dos_part_str = NULL;
+ char *bsd_part_str = NULL;
if (dos_part >= 0)
- {
- /* Add in char length of dos_part+1 */
- int tmp = dos_part + 1;
- len++;
- while ((tmp /= 10) != 0)
- len++;
- }
+ asprintf (&dos_part_str, ",%d", dos_part + 1);
+
if (bsd_part >= 0)
- len += 2;
+ asprintf (&bsd_part_str, ",%c", dos_part + 'a');
- /* Length to alloc is: char length of map[drive].drive, plus
- * char length of (dos_part+1) or of bsd_part, plus
- * 2 for the comma and a null/end of string (\0)
- */
- p = xmalloc (len + 2);
- sprintf (p, "%s", map[drive].drive);
+ asprintf (&ret, "%s%s%s", map[drive].drive,
+ dos_part_str ? : "",
+ bsd_part_str ? : "");
- if (dos_part >= 0)
- sprintf (p + strlen (p), ",%d", dos_part + 1);
+ if (dos_part_str)
+ free (dos_part_str);
- if (bsd_part >= 0)
- sprintf (p + strlen (p), ",%c", bsd_part + 'a');
+ if (bsd_part_str)
+ free (bsd_part_str);
- return p;
+ return ret;
}
static char *
#if defined(__linux__)
char *path = xmalloc (PATH_MAX);
if (! realpath (os_dev, path))
- return 0;
+ return NULL;
if (strncmp ("/dev/", path, 5) == 0)
{
static int
find_system_device (const char *os_dev)
{
- int i;
+ unsigned int i;
char *os_disk;
os_disk = convert_system_partition_to_system_disk (os_dev);
if (! os_disk)
return -1;
- for (i = 0; i < (int) (sizeof (map) / sizeof (map[0])); i++)
- if (map[i].device && strcmp (map[i].device, os_disk) == 0)
+ for (i = 0; i < ARRAY_SIZE (map); i++)
+ if (! map[i].device)
+ break;
+ else if (strcmp (map[i].device, os_disk) == 0)
{
free (os_disk);
return i;
}
- free (os_disk);
- return -1;
+ if (i == ARRAY_SIZE (map))
+ grub_util_error (_("device count exceeds limit"));
+
+ map[i].device = os_disk;
+ map[i].drive = xstrdup (os_disk);
+
+ return i;
}
char *