commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2139] 2009-04-25 Vladimir Serbinenko <address@hidden>


From: Vladimir Serbinenko
Subject: [2139] 2009-04-25 Vladimir Serbinenko <address@hidden>
Date: Sat, 25 Apr 2009 12:18:26 +0000

Revision: 2139
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2139
Author:   phcoder
Date:     2009-04-25 12:18:25 +0000 (Sat, 25 Apr 2009)
Log Message:
-----------
2009-04-25  Vladimir Serbinenko  <address@hidden>

        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

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/Makefile.in
    trunk/grub2/commands/parttool.c
    trunk/grub2/genmk.rb
    trunk/grub2/parttool/pcpart.c

Added Paths:
-----------
    trunk/grub2/genparttoollist.sh

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-04-24 17:05:19 UTC (rev 2138)
+++ trunk/grub2/ChangeLog       2009-04-25 12:18:25 UTC (rev 2139)
@@ -1,3 +1,20 @@
+2009-04-25  Vladimir Serbinenko  <address@hidden>
+
+       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  <address@hidden>
 
        Avoiding openning same device multiple times in device iterator.

Modified: trunk/grub2/Makefile.in
===================================================================
--- trunk/grub2/Makefile.in     2009-04-24 17:05:19 UTC (rev 2138)
+++ trunk/grub2/Makefile.in     2009-04-25 12:18:25 UTC (rev 2139)
@@ -139,7 +139,7 @@
 ### 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 @@
 handler.lst: $(HANDLERFILES)
        cat $^ /dev/null | sort > $@
 
+parttool.lst: $(PARTTOOLFILES)
+       cat $^ /dev/null | sort | uniq > $@
+
 ifeq (, $(UNIFONT_BDF))
 else
 

Modified: trunk/grub2/commands/parttool.c
===================================================================
--- trunk/grub2/commands/parttool.c     2009-04-24 17:05:19 UTC (rev 2138)
+++ trunk/grub2/commands/parttool.c     2009-04-25 12:18:25 UTC (rev 2139)
@@ -33,6 +33,10 @@
 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,9 +105,54 @@
   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] == ')')
     {
       args[0][grub_strlen (args[0]) - 1] = 0;
@@ -128,65 +177,93 @@
       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])
       {
        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_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 @@
          break;
       }
 
+  grub_free (parsed);
   grub_device_close (dev);
   return err;
 }
@@ -252,9 +331,7 @@
   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)

Modified: trunk/grub2/genmk.rb
===================================================================
--- trunk/grub2/genmk.rb        2009-04-24 17:05:19 UTC (rev 2138)
+++ trunk/grub2/genmk.rb        2009-04-25 12:18:25 UTC (rev 2139)
@@ -144,6 +144,7 @@
       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 @@
        $(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 @@
          $(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 $< \

Added: trunk/grub2/genparttoollist.sh
===================================================================
--- trunk/grub2/genparttoollist.sh                              (rev 0)
+++ trunk/grub2/genparttoollist.sh      2009-04-25 12:18:25 UTC (rev 2139)
@@ -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

Modified: trunk/grub2/parttool/pcpart.c
===================================================================
--- trunk/grub2/parttool/pcpart.c       2009-04-24 17:05:19 UTC (rev 2138)
+++ trunk/grub2/parttool/pcpart.c       2009-04-25 12:18:25 UTC (rev 2139)
@@ -63,9 +63,13 @@
       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 @@
     }
 
   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, 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]