]> git.proxmox.com Git - grub2.git/commitdiff
2009-04-25 Vladimir Serbinenko <phcoder@gmail.com>
authorphcoder <phcoder@localhost>
Sat, 25 Apr 2009 12:18:25 +0000 (12:18 +0000)
committerphcoder <phcoder@localhost>
Sat, 25 Apr 2009 12:18:25 +0000 (12:18 +0000)
Parttool autoloading and improvements

* Makefile.in (pkglib_DATA): add parttool.lst
(parttool.lst): new target
* genmk.rb: generate parttool-*
(CLEANFILES): add #{parttool}
(PARTTOOLFILES): new variable
* genparttoollist.sh: new file
* parttool/pcpart.c (grub_pcpart_boot): more feedback
(grub_pcpart_type): likewise
* commands/parttool.c (helpmsg): new variable
(grub_cmd_parttool): output help if not enough arguments are supplied
autoload modules
(GRUB_MOD_INIT(parttool)): use helpmsg

ChangeLog
Makefile.in
commands/parttool.c
genmk.rb
genparttoollist.sh [new file with mode: 0644]
parttool/pcpart.c

index 1c490ee51f94681f75c73c5c149341a8a18b9db6..474654e68d0fd77046302b1bcba6751884286cff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2009-04-25  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Parttool autoloading and improvements
+
+       * Makefile.in (pkglib_DATA): add parttool.lst 
+       (parttool.lst): new target
+       * genmk.rb: generate parttool-*
+       (CLEANFILES): add #{parttool}
+       (PARTTOOLFILES): new variable
+       * genparttoollist.sh: new file
+       * parttool/pcpart.c (grub_pcpart_boot): more feedback 
+       (grub_pcpart_type): likewise
+       * commands/parttool.c (helpmsg): new variable
+       (grub_cmd_parttool): output help if not enough arguments are supplied
+       autoload modules
+       (GRUB_MOD_INIT(parttool)): use helpmsg
+
 2009-04-24  David S. Miller  <davem@davemloft.net>
 
        Avoiding openning same device multiple times in device iterator.
index b24ee2ed8d5f889812396e2f29649e43ef94583e..f73192e5e63953e754f6d25e12bffd62f34506ae 100644 (file)
@@ -139,7 +139,7 @@ include $(srcdir)/conf/$(target_cpu)-$(platform).mk
 ### General targets.
 
 CLEANFILES += $(pkglib_DATA) $(pkgdata_DATA)
-pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst handler.lst
+pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst
 moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep.awk
        cat $(DEFSYMFILES) /dev/null \
          | $(AWK) -f $(srcdir)/genmoddep.awk $(UNDSYMFILES) > $@ \
@@ -157,6 +157,9 @@ partmap.lst: $(PARTMAPFILES)
 handler.lst: $(HANDLERFILES)
        cat $^ /dev/null | sort > $@
 
+parttool.lst: $(PARTTOOLFILES)
+       cat $^ /dev/null | sort | uniq > $@
+
 ifeq (, $(UNIFONT_BDF))
 else
 
index 6eec13b1c3ff4ddc969aab842135dc045bb11378..b09a2bac0b1e3a1c3a4b838ca40c79c4efddd5d8 100644 (file)
 static struct grub_parttool *parts = 0;
 static int curhandle = 0;
 static grub_dl_t mymod;
+static char helpmsg[] =
+  "perform COMMANDS on partition.\n"
+  "Use \"parttool PARTITION help\" for the list "
+  "of available commands";
 
 int 
 grub_parttool_register(const char *part_name, 
@@ -101,8 +105,53 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
   int i, j;
   grub_err_t err = GRUB_ERR_NONE;
 
-  if (argc < 2)
-    return grub_error (GRUB_ERR_BAD_ARGUMENT, "too few arguments");
+  auto grub_err_t show_help (void);
+  grub_err_t show_help (void)
+  {
+    int found = 0;
+    for (cur = parts; cur; cur = cur->next)
+      if (grub_strcmp (dev->disk->partition->partmap->name, cur->name) == 0)
+       {
+         struct grub_parttool_argdesc *curarg;
+         found = 1;
+         for (curarg = cur->args; curarg->name; curarg++)
+           {
+             int spacing = 20;
+             
+             spacing -= grub_strlen (curarg->name);
+             grub_printf ("%s", curarg->name);
+             
+             switch (curarg->type)
+               {
+               case GRUB_PARTTOOL_ARG_BOOL:
+                 grub_printf ("+/-");
+                 spacing -= 3;
+                 break;
+                 
+               case GRUB_PARTTOOL_ARG_VAL:                   
+                 grub_printf ("=VAL");
+                 spacing -= 4;
+                 break;
+                 
+                   case GRUB_PARTTOOL_ARG_END:
+                     break;
+               }
+             while (spacing-- > 0)
+               grub_printf (" ");
+             grub_printf ("%s\n", curarg->desc);
+           }
+       }
+    if (! found)
+      grub_printf ("Sorry no parttool is available for %s\n", 
+                  dev->disk->partition->partmap->name);
+    return GRUB_ERR_NONE;
+  }
+
+  if (argc < 1)
+    {
+      grub_printf ("%s\n", helpmsg);
+      return grub_error (GRUB_ERR_BAD_ARGUMENT, "too few arguments");
+    }
 
   if (args[0][0] == '(' && args[0][grub_strlen (args[0]) - 1] == ')')
     {
@@ -128,50 +177,77 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
       return grub_error (GRUB_ERR_BAD_ARGUMENT, "not a partition");
     }
 
-  parsed = (int *) grub_malloc (argc * sizeof (int));
-  grub_memset (parsed, 0, argc * sizeof (int));
-
-  for (i = 1; i < argc; i++)
-    if (!grub_strcmp (args[i], "help"))
+  /* Load modules. */
+#ifndef GRUB_UTIL
+  {
+    const char *prefix;
+    prefix = grub_env_get ("prefix");
+    if (prefix)
       {
-       int found = 0;
-       for (cur = parts; cur; cur = cur->next)
-         if (! grub_strcmp (dev->disk->partition->partmap->name, cur->name))
-           {
-             struct grub_parttool_argdesc *curarg;
-             found = 1;
-             for (curarg = cur->args; curarg->name; curarg++)
-               {
-                 int spacing = 20;
-               
-                 spacing -= grub_strlen (curarg->name);
-                 grub_printf ("%s", curarg->name);
+       char *filename;
 
-                 switch (curarg->type)
-                   {
-                   case GRUB_PARTTOOL_ARG_BOOL:
-                     grub_printf ("+/-");
-                     spacing -= 3;
-                     break;
+       filename = grub_malloc (grub_strlen (prefix) + sizeof ("/parttool.lst"));
+       if (filename)
+         {
+           grub_file_t file;
+           
+           grub_sprintf (filename, "%s/parttool.lst", prefix);
+           file = grub_file_open (filename);
+           if (file)
+             {
+               char *buf = 0;
+               for (;; grub_free(buf))
+                 {
+                   char *p, *name;
 
-                   case GRUB_PARTTOOL_ARG_VAL:               
-                     grub_printf ("=VAL");
-                     spacing -= 4;
+                   buf = grub_file_getline (file);
+                   
+                   if (! buf)
                      break;
+                 
+                   name = buf;
 
-                   case GRUB_PARTTOOL_ARG_END:
-                     break;
-                   }
-                 while (spacing-- > 0)
-                   grub_printf (" ");
-                 grub_printf ("%s\n", curarg->desc);
-               }
-           }
-       if (! found)
-         grub_printf ("Sorry no parttool is available for %s\n", 
-                      dev->disk->partition->partmap->name);
-       return GRUB_ERR_NONE;
+                   if (! grub_isgraph (name[0]))
+                     continue;
+                   
+                   p = grub_strchr (name, ':');
+                   if (! p)
+                     continue;
+                   
+                   *p = '\0';
+                   while (*++p == ' ')
+                     ;
+
+                   if (! grub_isgraph (*p))
+                     continue;
+                   
+                   if (grub_strcmp (name, dev->disk->partition->partmap->name)
+                       != 0)
+                     continue;
+                   
+                   grub_dl_load (p);
+                 }
+               
+               grub_file_close (file);
+             }
+           
+           grub_free (filename);
+         }
       }
+    /* Ignore errors.  */
+    grub_errno = GRUB_ERR_NONE;
+  }
+#endif
+
+  if (argc == 1)
+    return show_help ();
+
+  for (i = 1; i < argc; i++)
+    if (grub_strcmp (args[i], "help") == 0)
+      return show_help ();
+
+  parsed = (int *) grub_malloc (argc * sizeof (int));
+  grub_memset (parsed, 0, argc * sizeof (int));
 
   for (i = 1; i < argc; i++)
     if (! parsed[i])
@@ -179,14 +255,15 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
        struct grub_parttool_argdesc *curarg;
        struct grub_parttool_args *pargs;
        for (cur = parts; cur; cur = cur->next)
-         if (! grub_strcmp (dev->disk->partition->partmap->name, cur->name))
+         if (grub_strcmp (dev->disk->partition->partmap->name, cur->name) == 0)
            {
              for (curarg = cur->args; curarg->name; curarg++)
-               if (!grub_strncmp (curarg->name, args[i], 
-                                  grub_strlen (curarg->name))
+               if (grub_strncmp (curarg->name, args[i], 
+                                 grub_strlen (curarg->name)) == 0
                    && ((curarg->type == GRUB_PARTTOOL_ARG_BOOL 
                         && (args[i][grub_strlen (curarg->name)] == '+' 
-                            || args[i][grub_strlen (curarg->name)] == '-'))
+                            || args[i][grub_strlen (curarg->name)] == '-'
+                            || args[i][grub_strlen (curarg->name)] == 0))
                        || (curarg->type == GRUB_PARTTOOL_ARG_VAL
                            && args[i][grub_strlen (curarg->name)] == '=')))
                    
@@ -203,14 +280,15 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
        grub_memset (pargs, 0, 
                     ptool->nargs * sizeof (struct grub_parttool_args));
        for (j = i; j < argc; j++)
-         if (!parsed[j])
+         if (! parsed[j])
            {
              for (curarg = ptool->args; curarg->name; curarg++)
-               if (!grub_strncmp (curarg->name, args[i], 
-                                  grub_strlen (curarg->name))
+               if (grub_strncmp (curarg->name, args[i], 
+                                  grub_strlen (curarg->name)) == 0
                    && ((curarg->type == GRUB_PARTTOOL_ARG_BOOL 
                         && (args[j][grub_strlen (curarg->name)] == '+' 
-                            || args[j][grub_strlen (curarg->name)] == '-'))
+                            || args[j][grub_strlen (curarg->name)] == '-'
+                            || args[j][grub_strlen (curarg->name)] == 0))
                        || (curarg->type == GRUB_PARTTOOL_ARG_VAL
                            && args[j][grub_strlen (curarg->name)] == '=')))
                  {
@@ -240,6 +318,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
          break;
       }
 
+  grub_free (parsed);
   grub_device_close (dev);
   return err;
 }
@@ -252,9 +331,7 @@ GRUB_MOD_INIT(parttool)
   mymod = mod;
   cmd = grub_register_command ("parttool", grub_cmd_parttool, 
                               "parttool PARTITION COMMANDS", 
-                              "perform COMMANDS on partition."
-                              " use parttool PARTITION help for the list "
-                              " of available commands");
+                              helpmsg);
 }
 
 GRUB_MOD_FINI(parttool)
index b619421e13bbc0fdb3490e61ae28809972155a1f..3532cd87640b7b6210ccf74085341bfbdc5e6a02 100644 (file)
--- a/genmk.rb
+++ b/genmk.rb
@@ -144,6 +144,7 @@ endif
       fs = 'fs-' + obj.suffix('lst')
       partmap = 'partmap-' + obj.suffix('lst')
       handler = 'handler-' + obj.suffix('lst')
+      parttool = 'parttool-' + obj.suffix('lst')
       dep = deps[i]
       flag = if /\.c$/ =~ src then 'CFLAGS' else 'ASFLAGS' end
       extra_flags = if /\.S$/ =~ src then '-DASM_FILE=1' else '' end
@@ -153,9 +154,10 @@ endif
        $(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -MD -c -o $@ $<
 -include #{dep}
 
-CLEANFILES += #{command} #{fs} #{partmap} #{handler}
+CLEANFILES += #{command} #{fs} #{partmap} #{handler} #{parttool}
 COMMANDFILES += #{command}
 FSFILES += #{fs}
+PARTTOOLFILES += #{parttool}
 PARTMAPFILES += #{partmap}
 HANDLERFILES += #{handler}
 
@@ -169,6 +171,11 @@ HANDLERFILES += #{handler}
          $(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
          | sh $(srcdir)/genfslist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
 
+#{parttool}: #{src} $(#{src}_DEPENDENCIES) genparttoollist.sh
+       set -e; \
+         $(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
+         | sh $(srcdir)/genparttoollist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
+
 #{partmap}: #{src} $(#{src}_DEPENDENCIES) genpartmaplist.sh
        set -e; \
          $(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
diff --git a/genparttoollist.sh b/genparttoollist.sh
new file mode 100644 (file)
index 0000000..c7ffc81
--- /dev/null
@@ -0,0 +1,19 @@
+#! /bin/sh
+#
+# Copyright (C) 2009  Free Software Foundation, Inc.
+#
+# This gensymlist.sh is free software; the author
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Read source code from stdin and detect parttool names.
+
+module=$1
+
+grep -v "^#" | sed -n \
+ -e "/grub_parttool_register *( *\"/{s/.*( *\"\([^\"]*\)\".*/\1: $module/;p;}"
\ No newline at end of file
index 59f24bac86a9966174b0e03055cc641112b7a247..a2b9452d9be6f4f8c728f3004c318b43beb6570e 100644 (file)
@@ -63,9 +63,13 @@ static grub_err_t grub_pcpart_boot (const grub_device_t dev,
       for (i = 0; i < 4; i++)
        mbr.entries[i].flag = 0x0;
       mbr.entries[index].flag = 0x80;
+      grub_printf ("Partition %d is active now. \n", index);
     }
   else
-    mbr.entries[index].flag = 0x0;
+    {
+      mbr.entries[index].flag = 0x0;
+      grub_printf ("Cleared active flag on %d. \n", index);
+    }
 
    /* Write the MBR.  */
   grub_disk_write (dev->disk, 0, 0, sizeof (mbr), (char *) &mbr);
@@ -123,6 +127,7 @@ static grub_err_t grub_pcpart_type (const grub_device_t dev,
     }
 
   mbr.entries[index].type = type;
+  grub_printf ("Setting partition type to 0x%x\n", type);
 
    /* Write the parttable.  */
   grub_disk_write (dev->disk, part->offset, 0,