~ilya-yanok/ubuntu/precise/grub2/fix-for-948716

« back to all changes in this revision

Viewing changes to util/grub-probe.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Millan
  • Date: 2009-07-25 19:00:53 UTC
  • mfrom: (1.6.3 upstream)
  • mto: (17.4.13 sid)
  • mto: This revision was merged to the branch mainline in revision 53.
  • Revision ID: james.westby@ubuntu.com-20090725190053-uv3lm6ya3zxs77ep
ImportĀ upstreamĀ versionĀ 1.96+20090725

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <grub/file.h>
26
26
#include <grub/fs.h>
27
27
#include <grub/partition.h>
28
 
#include <grub/msdos_partition.h>
 
28
#include <grub/pc_partition.h>
29
29
#include <grub/util/hostdisk.h>
30
30
#include <grub/util/getroot.h>
31
31
#include <grub/term.h>
32
32
#include <grub/env.h>
33
 
#include <grub/raid.h>
34
33
 
35
34
#include <grub_probe_init.h>
36
35
 
79
78
static void
80
79
probe_partmap (grub_disk_t disk)
81
80
{
 
81
  char *name;
 
82
  char *underscore;
 
83
 
82
84
  if (disk->partition == NULL)
83
85
    {
84
86
      grub_util_info ("No partition map found for %s", disk->name);
85
87
      return;
86
88
    }
87
89
 
88
 
  printf ("%s\n", disk->partition->partmap->name);
89
 
}
90
 
 
91
 
static int
92
 
probe_raid_level (grub_disk_t disk)
93
 
{
94
 
  if (disk->dev->id != GRUB_DISK_DEVICE_RAID_ID)
95
 
    return -1;
96
 
 
97
 
  return ((struct grub_raid_array *) disk->data)->level;
 
90
  name = strdup (disk->partition->partmap->name);
 
91
  if (! name)
 
92
    grub_util_error ("Not enough memory");
 
93
 
 
94
  underscore = strchr (name, '_');
 
95
  if (! underscore)
 
96
    grub_util_error ("Invalid partition map %s", name);
 
97
 
 
98
  *underscore = '\0';
 
99
  printf ("%s\n", name);
 
100
  free (name);
98
101
}
99
102
 
100
103
static void
103
106
  char *drive_name = NULL;
104
107
  char *grub_path = NULL;
105
108
  char *filebuf_via_grub = NULL, *filebuf_via_sys = NULL;
 
109
  int abstraction_type;
106
110
  grub_device_t dev = NULL;
107
111
  grub_fs_t fs;
108
112
 
128
132
      goto end;
129
133
    }
130
134
 
 
135
  abstraction_type = grub_util_get_dev_abstraction (device_name);
 
136
  /* No need to check for errors; lack of abstraction is permissible.  */
 
137
 
 
138
  if (print == PRINT_ABSTRACTION)
 
139
    {
 
140
      char *abstraction_name;
 
141
      switch (abstraction_type)
 
142
        {
 
143
        case GRUB_DEV_ABSTRACTION_LVM:
 
144
          abstraction_name = "lvm";
 
145
          break;
 
146
        case GRUB_DEV_ABSTRACTION_RAID:
 
147
          abstraction_name = "raid mdraid";
 
148
          break;
 
149
        default:
 
150
          grub_util_info ("did not find LVM/RAID in %s, assuming raw device", device_name);
 
151
          goto end;
 
152
        }
 
153
      printf ("%s\n", abstraction_name);
 
154
      goto end;
 
155
    }
 
156
 
131
157
  drive_name = grub_util_get_grub_dev (device_name);
132
158
  if (! drive_name)
133
159
    grub_util_error ("Cannot find a GRUB drive for %s.  Check your device.map.\n", device_name);
143
169
  if (! dev)
144
170
    grub_util_error ("%s", grub_errmsg);
145
171
 
146
 
  if (print == PRINT_ABSTRACTION)
147
 
    {
148
 
      grub_disk_memberlist_t list = NULL, tmp;
149
 
      const int is_lvm = (dev->disk->dev->id == GRUB_DISK_DEVICE_LVM_ID);
150
 
      int is_raid = 0;
151
 
      int is_raid5 = 0;
152
 
      int is_raid6 = 0;
153
 
      int raid_level;
154
 
 
155
 
      raid_level = probe_raid_level (dev->disk);
156
 
      if (raid_level >= 0)
157
 
        {
158
 
          is_raid = 1;
159
 
          is_raid5 |= (raid_level == 5);
160
 
          is_raid6 |= (raid_level == 6);
161
 
        }
162
 
 
163
 
      if ((is_lvm) && (dev->disk->dev->memberlist))
164
 
        list = dev->disk->dev->memberlist (dev->disk);
165
 
      while (list)
166
 
        {
167
 
          raid_level = probe_raid_level (list->disk);
168
 
          if (raid_level >= 0)
169
 
            {
170
 
              is_raid = 1;
171
 
              is_raid5 |= (raid_level == 5);
172
 
              is_raid6 |= (raid_level == 6);
173
 
            }
174
 
 
175
 
          tmp = list->next;
176
 
          free (list);
177
 
          list = tmp;
178
 
        }
179
 
 
180
 
      if (is_raid)
181
 
        {
182
 
          printf ("raid ");
183
 
          if (is_raid5)
184
 
            printf ("raid5rec ");
185
 
          if (is_raid6)
186
 
            printf ("raid6rec ");
187
 
          printf ("mdraid ");
188
 
        }
189
 
 
190
 
      if (is_lvm)
191
 
        printf ("lvm ");
192
 
 
193
 
      printf ("\n");
194
 
 
195
 
      goto end;
196
 
    }
197
 
 
198
172
  if (print == PRINT_PARTMAP)
199
173
    {
200
174
      grub_disk_memberlist_t list = NULL, tmp;
208
182
      while (list)
209
183
        {
210
184
          probe_partmap (list->disk);
211
 
          /* LVM on RAID  */
212
 
          if (list->disk->dev->memberlist)
213
 
            {
214
 
              grub_disk_memberlist_t sub_list;
215
 
 
216
 
              sub_list = list->disk->dev->memberlist (list->disk);
217
 
              while (sub_list)
218
 
                {
219
 
                  probe_partmap (sub_list->disk);
220
 
                  tmp = sub_list->next;
221
 
                  free (sub_list);
222
 
                  sub_list = tmp;
223
 
                }
224
 
            }
225
185
          tmp = list->next;
226
186
          free (list);
227
187
          list = tmp;
235
195
 
236
196
  if (print == PRINT_FS)
237
197
    {
238
 
      /* FIXME: `path' can't be used to read a file via GRUB facilities,
239
 
         because it's not relative to its root.  */
240
 
#if 0
241
198
      struct stat st;
242
199
 
243
200
      stat (path, &st);
244
201
 
245
 
      if (S_ISREG (st.st_mode))
 
202
      if (st.st_mode == S_IFREG)
246
203
        {
247
204
          /* Regular file.  Verify that we can read it properly.  */
248
205
 
261
218
          if (memcmp (filebuf_via_grub, filebuf_via_sys, file->size))
262
219
            grub_util_error ("files differ");
263
220
        }
264
 
#endif
265
 
 
266
221
      printf ("%s\n", fs->name);
267
222
    }
268
223