usb.mod may be size-critical (if booting from usb) but usbtest.mod
isn't. grub_usb_get_string is in usb.mod but used only in usbtest.mod.
Furthermore it's the only potentially size-critical function except
filesystems which uses grub_utf16_to_utf8. Making it non-size critical
would allow to inline it and save few bytes. Here is a patch to fix
situation

-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog
index b657885..3e8d253 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2009-08-28  Vladimir Serbinenko  <phco...@gmail.com>
 
+       * bus/usb/usb.c (grub_usb_get_string): Move from here ...
+       * commands/usbtest.c (grub_usb_get_string): ... move here.
+       (usb_print_str): Fix error handling.
+       * include/grub/usb.h (grub_usb_get_string): Remove.
+
+2009-08-28  Vladimir Serbinenko  <phco...@gmail.com>
+
        * kern/file.c (grub_file_read): Check offset.
        * fs/hfs.c (grub_hfs_read_file): Remove unnecessary offset check.
        * fs/jfs.c (grub_jfs_read_file): Likewise.
diff --git a/bus/usb/usb.c b/bus/usb/usb.c
index 310b8cc..8289185 100644
--- a/bus/usb/usb.c
+++ b/bus/usb/usb.c
@@ -156,42 +156,6 @@ grub_usb_get_endpdescriptor (grub_usb_device_t usbdev, int 
addr)
 }
 
 grub_usb_err_t
-grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
-                    char **string)
-{
-  struct grub_usb_desc_str descstr;
-  struct grub_usb_desc_str *descstrp;
-  grub_usb_err_t err;
-
-  /* Only get the length.  */
-  err = grub_usb_control_msg (dev, 1 << 7,
-                             0x06, (3 << 8) | index,
-                             langid, 1, (char *) &descstr);
-  if (err)
-    return err;
-
-  descstrp = grub_malloc (descstr.length);
-  if (! descstrp)
-    return GRUB_USB_ERR_INTERNAL;
-  err = grub_usb_control_msg (dev, 1 << 7,
-                             0x06, (3 << 8) | index,
-                             langid, descstr.length, (char *) descstrp);
-
-  *string = grub_malloc (descstr.length / 2);
-  if (! *string)
-    {
-      grub_free (descstrp);
-      return GRUB_USB_ERR_INTERNAL;
-    }
-
-  grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str, 
descstrp->length / 2 - 1);
-  (*string)[descstr.length / 2 - 1] = '\0';
-  grub_free (descstrp);
-
-  return GRUB_USB_ERR_NONE;
-}
-
-grub_usb_err_t
 grub_usb_device_initialize (grub_usb_device_t dev)
 {
   struct grub_usb_desc_device *descdev;
diff --git a/commands/usbtest.c b/commands/usbtest.c
index 018c1a2..1c49d81 100644
--- a/commands/usbtest.c
+++ b/commands/usbtest.c
@@ -59,18 +59,60 @@ static const char *usb_devspeed[] =
     "High"
   };
 
+static grub_usb_err_t
+grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
+                    char **string)
+{
+  struct grub_usb_desc_str descstr;
+  struct grub_usb_desc_str *descstrp;
+  grub_usb_err_t err;
+
+  /* Only get the length.  */
+  err = grub_usb_control_msg (dev, 1 << 7,
+                             0x06, (3 << 8) | index,
+                             langid, 1, (char *) &descstr);
+  if (err)
+    return err;
+
+  descstrp = grub_malloc (descstr.length);
+  if (! descstrp)
+    return GRUB_USB_ERR_INTERNAL;
+  err = grub_usb_control_msg (dev, 1 << 7,
+                             0x06, (3 << 8) | index,
+                             langid, descstr.length, (char *) descstrp);
+
+  *string = grub_malloc (descstr.length / 2);
+  if (! *string)
+    {
+      grub_free (descstrp);
+      return GRUB_USB_ERR_INTERNAL;
+    }
+
+  grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str, 
descstrp->length / 2 - 1);
+  (*string)[descstr.length / 2 - 1] = '\0';
+  grub_free (descstrp);
+
+  return GRUB_USB_ERR_NONE;
+}
+
 static void
 usb_print_str (const char *description, grub_usb_device_t dev, int idx)
 {
   char *name;
+  grub_usb_err_t err;
   /* XXX: LANGID  */
 
   if (! idx)
     return;
 
-  grub_usb_get_string (dev, idx, 0x0409, &name);
-  grub_printf ("%s: `%s'\n", description, name);
-  grub_free (name);
+  err = grub_usb_get_string (dev, idx, 0x0409, &name);
+  if (err)
+    grub_printf ("Error %d retrieving %s\n", err, description);
+  else
+    {
+      grub_printf ("%s: `%s'\n", description, name);
+      grub_free (name);
+    }
 }
 
 static int
diff --git a/include/grub/usb.h b/include/grub/usb.h
index 8dd3b6e..dc90e78 100644
--- a/include/grub/usb.h
+++ b/include/grub/usb.h
@@ -64,9 +64,6 @@ grub_usb_err_t grub_usb_clear_halt (grub_usb_device_t dev, 
int endpoint);
 grub_usb_err_t grub_usb_set_configuration (grub_usb_device_t dev,
                                           int configuration);
 
-grub_usb_err_t grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index,
-                                   int langid, char **string);
-
 void grub_usb_controller_dev_register (grub_usb_controller_dev_t usb);
 
 void grub_usb_controller_dev_unregister (grub_usb_controller_dev_t usb);
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to