From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1JSZwe-0005Qj-BT for mharc-grub-devel@gnu.org; Fri, 22 Feb 2008 10:36:16 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JSZwc-0005Oa-32 for grub-devel@gnu.org; Fri, 22 Feb 2008 10:36:14 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JSZwZ-0005MG-Qg for grub-devel@gnu.org; Fri, 22 Feb 2008 10:36:13 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JSZwZ-0005M4-II for grub-devel@gnu.org; Fri, 22 Feb 2008 10:36:11 -0500 Received: from mx1.rz.ruhr-uni-bochum.de ([134.147.32.86]) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1JSZwY-0006WC-Mt for grub-devel@gnu.org; Fri, 22 Feb 2008 10:36:11 -0500 X-Queued: (qmail 2284 invoked by uid 281); 22 Feb 2008 15:36:09 -0000 X-Qmailscanner: from 134.147.252.214 by mx1.rz.ruhr-uni-bochum.de (envelope-from , uid 80) with qmail-scanner-2.01 (sophie: 3.05/2.52/4.24. Clear:RC:1(134.147.252.214):. Processed in 0.050006 secs); 22 Feb 2008 15:36:09 -0000 Received: from router.leat.ruhr-uni-bochum.de (134.147.252.214) by mx1.rz.ruhr-uni-bochum.de with SMTP; 22 Feb 2008 15:36:09 -0000 Received: from [134.147.55.45] (frodo.leat.ruhr-uni-bochum.de [134.147.55.45]) by router.leat.ruhr-uni-bochum.de (8.12.2/8.12.2/SuSE Linux 0.6) with ESMTP id m1MFfh1l017519 for ; Fri, 22 Feb 2008 16:41:44 +0100 Message-ID: <47BEEC03.9050902@leat.rub.de> Date: Fri, 22 Feb 2008 16:36:35 +0100 From: Fabian Greffrath User-Agent: Thunderbird 2.0.0.9 (Windows/20071031) MIME-Version: 1.0 To: The development of GRUB 2 References: <47B19C57.9020902@leat.rub.de> <20080213154224.GB30040@thorin> <47B32029.200@leat.rub.de> <20080213193534.GA28711@thorin> <47B3FCEC.6020107@leat.rub.de> <20080217134219.GB15576@thorin> <47BEDCE2.3000301@leat.rub.de> In-Reply-To: <47BEDCE2.3000301@leat.rub.de> Content-Type: multipart/mixed; boundary="------------030607080006040502090903" X-detected-kernel: by monty-python.gnu.org: Linux 2.4-2.6 Subject: Re: [NEW PATCH] Add option to grub-probe to accept system devices as arguments X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Feb 2008 15:36:14 -0000 This is a multi-part message in MIME format. --------------030607080006040502090903 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Well, the solution seems to be easier than I expected. Is the attached patch acceptable? Have a nice weekend, Fabian -- Dipl.-Phys. Fabian Greffrath Ruhr-Universität Bochum Lehrstuhl für Energieanlagen und Energieprozesstechnik (LEAT) Universitätsstr. 150, IB 3/134 D-44780 Bochum Telefon: +49 (0)234 / 32-26334 Fax: +49 (0)234 / 32-14227 E-Mail: greffrath@leat.ruhr-uni-bochum.de --------------030607080006040502090903 Content-Type: text/x-diff; name="grub-probe-20080222-2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="grub-probe-20080222-2.patch" diff -Naru grub2-1.96+20080219~/include/grub/util/getroot.h grub2-1.96+20080219/include/grub/util/getroot.h --- grub2-1.96+20080219~/include/grub/util/getroot.h 2008-01-12 16:11:56.000000000 +0100 +++ grub2-1.96+20080219/include/grub/util/getroot.h 2008-02-22 14:40:41.000000000 +0100 @@ -29,5 +29,6 @@ char *grub_get_prefix (const char *dir); int grub_util_get_dev_abstraction (const char *os_dev); char *grub_util_get_grub_dev (const char *os_dev); +char *grub_util_check_block_device (const char *blk_dev); #endif /* ! GRUB_UTIL_GETROOT_HEADER */ diff -Naru grub2-1.96+20080219~/util/getroot.c grub2-1.96+20080219/util/getroot.c --- grub2-1.96+20080219~/util/getroot.c 2008-02-12 23:45:58.000000000 +0100 +++ grub2-1.96+20080219/util/getroot.c 2008-02-22 14:45:52.000000000 +0100 @@ -332,3 +332,17 @@ return grub_dev; } + +char * +grub_util_check_block_device (const char *blk_dev) +{ + struct stat st; + + if (stat (blk_dev, &st) < 0) + grub_util_error ("Cannot stat `%s'", blk_dev); + + if (S_ISBLK (st.st_mode)) + return (blk_dev); + else + return 0; +} diff -Naru grub2-1.96+20080219~/util/grub-probe.c grub2-1.96+20080219/util/grub-probe.c --- grub2-1.96+20080219~/util/grub-probe.c 2008-02-09 11:49:29.000000000 +0100 +++ grub2-1.96+20080219/util/grub-probe.c 2008-02-22 16:00:01.000000000 +0100 @@ -50,6 +50,7 @@ }; int print = PRINT_FS; +static unsigned int argument_is_device = 0; void grub_putchar (int c) @@ -100,16 +101,22 @@ } static void -probe (const char *path) +probe (const char *path, char *device_name) { - char *device_name; char *drive_name = NULL; char *grub_path = NULL; char *filebuf_via_grub = NULL, *filebuf_via_sys = NULL; int abstraction_type; grub_device_t dev = NULL; - device_name = grub_guess_root_device (path); + if (path == NULL) + { + if ( ! grub_util_check_block_device (device_name)) + grub_util_error ("%s is not a block device.\n", device_name); + } + else + device_name = grub_guess_root_device (path); + if (! device_name) grub_util_error ("cannot find a device for %s.\n", path); @@ -220,12 +227,12 @@ free (grub_path); free (filebuf_via_grub); free (filebuf_via_sys); - free (device_name); free (drive_name); } static struct option options[] = { + {"device", no_argument, 0, 'd'}, {"device-map", required_argument, 0, 'm'}, {"target", required_argument, 0, 't'}, {"help", no_argument, 0, 'h'}, @@ -242,10 +249,11 @@ "Try ``grub-probe --help'' for more information.\n"); else printf ("\ -Usage: grub-probe [OPTION]... PATH\n\ +Usage: grub-probe [OPTION]... [PATH|DEVICE]\n\ \n\ -Probe device information for a given path.\n\ +Probe device information for a given path (or device, if the -d option is given).\n\ \n\ + -d, --device given argument is a system device, not a path\n\ -m, --device-map=FILE use FILE as the device map [default=%s]\n\ -t, --target=(fs|drive|device|partmap|abstraction)\n\ print filesystem module, GRUB drive, system device, partition map module or abstraction module [default=fs]\n\ @@ -264,20 +272,24 @@ main (int argc, char *argv[]) { char *dev_map = 0; - char *path; + char *argument; progname = "grub-probe"; /* Check for options. */ while (1) { - int c = getopt_long (argc, argv, "m:t:hVv", options, 0); + int c = getopt_long (argc, argv, "dm:t:hVv", options, 0); if (c == -1) break; else switch (c) { + case 'd': + argument_is_device = 1; + break; + case 'm': if (dev_map) free (dev_map); @@ -321,10 +333,10 @@ if (verbosity > 1) grub_env_set ("debug", "all"); - /* Obtain PATH. */ + /* Obtain ARGUMENT. */ if (optind >= argc) { - fprintf (stderr, "No path is specified.\n"); + fprintf (stderr, "No path or device is specified.\n"); usage (1); } @@ -334,7 +346,7 @@ usage (1); } - path = argv[optind]; + argument = argv[optind]; /* Initialize the emulated biosdisk driver. */ grub_util_biosdisk_init (dev_map ? : DEFAULT_DEVICE_MAP); @@ -343,7 +355,10 @@ grub_init_all (); /* Do it. */ - probe (path); + if (argument_is_device) + probe (NULL,argument); + else + probe (argument,NULL); /* Free resources. */ grub_fini_all (); --------------030607080006040502090903--