aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/patches/grub-setup-root.patch
blob: 1abe9c383aa8c6dcd1aa7dde55b436dc24f2804e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
This patch is taken from OpenWrt, see:

https://github.com/openwrt/openwrt/blob/master/package/boot/grub2/patches/100-grub_setup_root.patch.

It allows to use grub-bios-setup on a raw disk-images, without root permissions.

--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -87,6 +87,8 @@ static struct argp_option options[] = {
    N_("install even if problems are detected"), 0},
   {"skip-fs-probe",'s',0,      0,
    N_("do not probe for filesystems in DEVICE"), 0},
+  {"root-device", 'r', N_("DEVICE"), 0,
+   N_("use DEVICE as the root device"), 0},
   {"verbose",     'v', 0,      0, N_("print verbose messages."), 0},
   {"allow-floppy", 'a', 0,      0,
    /* TRANSLATORS: The potential breakage isn't limited to floppies but it's
@@ -130,6 +132,7 @@ struct arguments
   char *core_file;
   char *dir;
   char *dev_map;
+  char *root_dev;
   int  force;
   int  fs_probe;
   int allow_floppy;
@@ -178,6 +181,13 @@ argp_parser (int key, char *arg, struct
         arguments->dev_map = xstrdup (arg);
         break;
 
+      case 'r':
+        if (arguments->root_dev)
+          free (arguments->root_dev);
+
+        arguments->root_dev = xstrdup (arg);
+        break;
+
       case 'f':
         arguments->force = 1;
         break;
@@ -313,7 +323,7 @@ main (int argc, char *argv[])
   GRUB_SETUP_FUNC (arguments.dir ? : DEFAULT_DIRECTORY,
 		   arguments.boot_file ? : DEFAULT_BOOT_FILE,
 		   arguments.core_file ? : DEFAULT_CORE_FILE,
-		   dest_dev, arguments.force,
+		   arguments.root_dev, dest_dev, arguments.force,
 		   arguments.fs_probe, arguments.allow_floppy,
 		   arguments.add_rs_codes);
 
--- a/util/setup.c
+++ b/util/setup.c
@@ -252,13 +252,12 @@ identify_partmap (grub_disk_t disk __att
 void
 SETUP (const char *dir,
        const char *boot_file, const char *core_file,
-       const char *dest, int force,
+       char *root, const char *dest, int force,
        int fs_probe, int allow_floppy,
        int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
 {
   char *core_path;
   char *boot_img, *core_img, *boot_path;
-  char *root = 0;
   size_t boot_size, core_size;
   grub_uint16_t core_sectors;
   grub_device_t root_dev = 0, dest_dev, core_dev;
@@ -307,7 +306,10 @@ SETUP (const char *dir,
 
   core_dev = dest_dev;
 
-  {
+  if (root)
+    root_dev = grub_device_open(root);
+
+  if (!root_dev) {
     char **root_devices = grub_guess_root_devices (dir);
     char **cur;
     int found = 0;
@@ -320,6 +322,8 @@ SETUP (const char *dir,
 	char *drive;
 	grub_device_t try_dev;
 
+	if (root_dev)
+	  break;
 	drive = grub_util_get_grub_dev (*cur);
 	if (!drive)
 	  continue;
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -191,13 +191,13 @@ grub_install_get_image_target (const cha
 void
 grub_util_bios_setup (const char *dir,
 		      const char *boot_file, const char *core_file,
-		      const char *dest, int force,
+		      char *root, const char *dest, int force,
 		      int fs_probe, int allow_floppy,
 		      int add_rs_codes);
 void
 grub_util_sparc_setup (const char *dir,
 		       const char *boot_file, const char *core_file,
-		       const char *dest, int force,
+		       char *root, const char *dest, int force,
 		       int fs_probe, int allow_floppy,
 		       int add_rs_codes);
 
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -1712,7 +1712,7 @@ main (int argc, char *argv[])
 	/*  Now perform the installation.  */
 	if (install_bootsector)
 	  grub_util_bios_setup (platdir, "boot.img", "core.img",
-				install_drive, force,
+				NULL, install_drive, force,
 				fs_probe, allow_floppy, add_rs_codes);
 	break;
       }
@@ -1738,7 +1738,7 @@ main (int argc, char *argv[])
 	/*  Now perform the installation.  */
 	if (install_bootsector)
 	  grub_util_sparc_setup (platdir, "boot.img", "core.img",
-				 install_drive, force,
+				 NULL, install_drive, force,
 				 fs_probe, allow_floppy,
 				 0 /* unused */ );
 	break;