Hello when testing grub-emu with USB support I stumbled across several problems 1) compile time warning of undefined grub_usb_libinit 2) When launched under normal user it crashed 3) When launched as superuser it hanged on ls Here is the fix. Formatting omitted for readability -- Regards Vladimir 'phcoder' Serbinenko
diff --git a/disk/scsi.c b/disk/scsi.c index 046dcb8..312d58a 100644 --- a/disk/scsi.c +++ b/disk/scsi.c @@ -246,8 +246,9 @@ grub_scsi_open (const char *name, grub_disk_t disk) for (p = grub_scsi_dev_list; p; p = p->next) { - if (! p->open (name, scsi)) - { + if (p->open (name, scsi)) + continue; + disk->id = (unsigned long) "scsi"; /* XXX */ disk->data = scsi; scsi->dev = p; @@ -266,7 +267,7 @@ grub_scsi_open (const char *name, grub_disk_t disk) { grub_free (scsi); grub_dprintf ("scsi", "inquiry failed\n"); - return grub_errno; + return err; } grub_dprintf ("scsi", "inquiry: devtype=0x%02x removable=%d\n", @@ -306,7 +307,6 @@ grub_scsi_open (const char *name, grub_disk_t disk) return GRUB_ERR_NONE; } - } grub_free (scsi); diff --git a/disk/usbms.c b/disk/usbms.c index 3c7ebaf..f67f918 100644 --- a/disk/usbms.c +++ b/disk/usbms.c @@ -226,7 +226,7 @@ grub_usbms_transfer (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd, retry: if (retrycnt == 0) - return err; + return grub_error (GRUB_ERR_IO, "USB Mass Storage stalled"); /* Setup the request. */ grub_memset (&cbw, 0, sizeof (cbw)); @@ -246,6 +246,7 @@ grub_usbms_transfer (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd, if (err == GRUB_USB_ERR_STALL) { grub_usb_clear_halt (dev->dev, dev->out->endp_addr); + retrycnt--; goto retry; } return grub_error (GRUB_ERR_IO, "USB Mass Storage request failed");; diff --git a/include/grub/usb.h b/include/grub/usb.h index 8dd3b6e..d6d9a3e 100644 --- a/include/grub/usb.h +++ b/include/grub/usb.h @@ -204,4 +204,9 @@ grub_usb_get_config_interface (struct grub_usb_desc_config *config) return interf; } +#ifdef GRUB_UTIL +grub_err_t grub_libusb_init (void); +grub_err_t grub_libusb_fini (void); +#endif + #endif /* GRUB_USB_H */ diff --git a/util/grub-emu.c b/util/grub-emu.c index c133dbe..2621d18 100644 --- a/util/grub-emu.c +++ b/util/grub-emu.c @@ -39,6 +39,10 @@ #include <grub_emu_init.h> +#if HAVE_USB_H +#include <grub/usb.h> +#endif + /* Used for going back to the main function. */ jmp_buf main_env; @@ -223,6 +227,10 @@ main (int argc, char *argv[]) if (setjmp (main_env) == 0) grub_main (); +#if HAVE_USB_H + grub_libusb_fini (); +#endif + grub_fini_all (); grub_machine_fini (); diff --git a/util/usb.c b/util/usb.c index e1d8c71..4ca1c10 100644 --- a/util/usb.c +++ b/util/usb.c @@ -51,6 +51,7 @@ grub_libusb_devices (void) for (usbdev = bus->devices; usbdev; usbdev = usbdev->next) { struct usb_device_descriptor *desc = &usbdev->descriptor; + grub_err_t err; if (! desc->bcdUSB) continue; @@ -62,7 +63,9 @@ grub_libusb_devices (void) dev->data = usbdev; /* Fill in all descriptors. */ - grub_usb_device_initialize (dev); + err = grub_usb_device_initialize (dev); + if (err) + continue; /* Register the device. */ grub_usb_devs[last++] = dev;
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel