[2139] 2009-04-25 Vladimir Serbinenko <[email protected]>

Vladimir Serbinenko <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
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  <[email protected]>

	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  <[email protected]>
+
+	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  <[email protected]>
 
 	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,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.