+ if (parted_has_m_opt) {
+ /* New-style parsing using the "machine-readable" format from
+ * 'parted -m'.
+ *
+ * Partitions may not be in any order, so we have to look for
+ * the matching partition number (RHBZ#602997).
+ */
+ 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[row], 6);
+ if (boot == NULL) {
+ free_strings (lines);
+ return -1;
+ }
+
+ int r = STREQ (boot, "boot");
+
+ free (boot);
+ free_strings (lines);
+
+ return r;
+ }
+ else {
+ /* Old-style: First look for the line matching "^Number". */
+ size_t start = 0, header, row;
+
+ for (row = 0; lines[row] != NULL; ++row)
+ if (STRPREFIX (lines[row], "Number")) {
+ start = row+1;
+ header = row;
+ break;
+ }
+
+ if (start == 0) {
+ reply_with_error ("parted output has no \"Number\" line");
+ free_strings (lines);
+ return -1;
+ }
+
+ /* Now we have to look at the column number of the "Flags" field.
+ * This is because parted's output has no way to represent a
+ * missing field except as whitespace, so we cannot just count
+ * fields from the left. eg. The "File system" field is often
+ * missing in the output.
+ */
+ char *p = strstr (lines[header], "Flags");
+ if (!p) {
+ reply_with_error ("parted output has no \"Flags\" field");
+ free_strings (lines);
+ return -1;
+ }
+ size_t col = p - lines[header];
+
+ /* Look for the line corresponding to this partition number. */
+ row = start + partnum - 1;
+ if (row >= count_strings (lines) || !STRPREFIX (lines[row], " ")) {
+ reply_with_error ("partition number out of range: %d", partnum);
+ free_strings (lines);
+ return -1;
+ }
+
+ int r = STRPREFIX (&lines[row][col], "boot");
+ free_strings (lines);
+ return r;
+ }