/* Iterate through all device aliases. This function can be used to find a device of a specific type. */ grub_err_t grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias)) { grub_ieee1275_phandle_t aliases; char aliasname[32]; int actual; struct grub_ieee1275_devalias alias; if (grub_ieee1275_finddevice ("/aliases", &aliases)) return -1; /* Find the first property. */ aliasname[0] = '\0'; while (grub_ieee1275_next_property (aliases, aliasname, aliasname)) { grub_ieee1275_phandle_t dev; grub_ssize_t pathlen; char *devpath; /* XXX: This should be large enough for any possible case. */ char devtype[64]; grub_dprintf ("devalias", "devalias name = %s\n", aliasname); grub_ieee1275_get_property_length (aliases, aliasname, &pathlen); /* The property `name' is a special case we should skip. */ if (!grub_strcmp (aliasname, "name")) continue; devpath = grub_malloc (pathlen); if (! devpath) return grub_errno; if (grub_ieee1275_get_property (aliases, aliasname, devpath, pathlen, &actual)) { grub_dprintf ("devalias", "get_property (%s) failed\n", aliasname); goto nextprop; } if (grub_ieee1275_finddevice (devpath, &dev)) { grub_dprintf ("devalias", "finddevice (%s) failed\n", devpath); goto nextprop; } if (grub_ieee1275_get_property (dev, "device_type", devtype, sizeof devtype, &actual)) { /* NAND device don't have device_type property. */ devtype[0] = 0; } alias.name = aliasname; alias.path = devpath; alias.type = devtype; hook (&alias); nextprop: grub_free (devpath); } return 0; }
/* Iterate through all device aliases. This function can be used to find a device of a specific type. */ int grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias, void *closure), void *closure) { grub_ieee1275_phandle_t aliases; char *aliasname, *devtype; grub_ssize_t actual; struct grub_ieee1275_devalias alias; int ret = 0; if (grub_ieee1275_finddevice ("/aliases", &aliases)) return 0; aliasname = grub_malloc (IEEE1275_MAX_PROP_LEN); if (!aliasname) return 0; devtype = grub_malloc (IEEE1275_MAX_PROP_LEN); if (!devtype) { grub_free (aliasname); return 0; } /* Find the first property. */ aliasname[0] = '\0'; while (grub_ieee1275_next_property (aliases, aliasname, aliasname) > 0) { grub_ieee1275_phandle_t dev; grub_ssize_t pathlen; char *devpath; if (! aliasname[0]) break; grub_dprintf ("devalias", "devalias name = %s\n", aliasname); grub_ieee1275_get_property_length (aliases, aliasname, &pathlen); /* The property `name' is a special case we should skip. */ if (!grub_strcmp (aliasname, "name")) continue; /* Sun's OpenBoot often doesn't zero terminate the device alias strings, so we will add a NULL byte at the end explicitly. */ pathlen += 1; devpath = grub_malloc (pathlen); if (! devpath) { grub_free (devtype); grub_free (aliasname); return 0; } if (grub_ieee1275_get_property (aliases, aliasname, devpath, pathlen, &actual)) { grub_dprintf ("devalias", "get_property (%s) failed\n", aliasname); goto nextprop; } devpath [actual] = '\0'; if (grub_ieee1275_finddevice (devpath, &dev)) { grub_dprintf ("devalias", "finddevice (%s) failed\n", devpath); goto nextprop; } if (grub_ieee1275_get_property (dev, "device_type", devtype, IEEE1275_MAX_PROP_LEN, &actual)) { /* NAND device don't have device_type property. */ devtype[0] = 0; } alias.name = aliasname; alias.path = devpath; alias.type = devtype; ret = hook (&alias, closure); nextprop: grub_free (devpath); if (ret) break; } grub_free (devtype); grub_free (aliasname); return ret; }