/* libguestfs - the guestfsd daemon
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009-2011 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
if (result >= 0)
return result;
- if (verbose)
- fprintf (stderr, "Testing if this parted supports '-m' option.\n");
-
char *err = NULL;
int r = commandr (NULL, &err, "parted", "-s", "-m", "/dev/null", NULL);
if (r == -1) {
/* Test failed, eg. missing or completely unusable parted binary. */
reply_with_error ("could not run 'parted' command");
+ free (err);
return -1;
}
if (err && strstr (err, "invalid option -- m"))
- return result = 0;
-
- return result = 1;
+ result = 0;
+ else
+ result = 1;
+ free (err);
+ return result;
}
static char *
}
free (err);
- if (verbose)
- fprintf (stderr, "parted output:\n%s<END>\n", out);
-
return out;
}
/* New-style parsing using the "machine-readable" format from
* 'parted -m'.
*
- * We want lines[1+partnum].
+ * Partitions may not be in any order, so we have to look for
+ * the matching partition number (RHBZ#602997).
*/
- if (count_strings (lines) < (size_t) 1+partnum) {
- reply_with_error ("partition number out of range: %d", partnum);
+ if (lines[0] == NULL || STRNEQ (lines[0], "BYT;")) {
+ reply_with_error ("unknown signature, expected \"BYT;\" as first line of the output: %s",
+ lines[0] ? lines[0] : "(signature was null)");
+ free_strings (lines);
+ return -1;
+ }
+
+ if (lines[1] == NULL) {
+ reply_with_error ("parted didn't return a line describing the device");
+ free_strings (lines);
+ return -1;
+ }
+
+ size_t row;
+ int pnum;
+ for (row = 2; lines[row] != NULL; ++row) {
+ if (sscanf (lines[row], "%d:", &pnum) != 1) {
+ reply_with_error ("could not parse row from output of parted print command: %s", lines[row]);
+ free_strings (lines);
+ return -1;
+ }
+ if (pnum == partnum)
+ break;
+ }
+
+ if (lines[row] == NULL) {
+ reply_with_error ("partition number %d not found", partnum);
free_strings (lines);
return -1;
}
- char *boot = get_table_field (lines[1+partnum], 6);
+ char *boot = get_table_field (lines[row], 6);
if (boot == NULL) {
free_strings (lines);
return -1;