+ if (parted_has_m_opt) {
+ /* New-style parsing using the "machine-readable" format from
+ * 'parted -m'.
+ *
+ * We want lines[1+partnum].
+ */
+ if (count_strings (lines) < (size_t) 1+partnum) {
+ reply_with_error ("partition number out of range: %d", partnum);
+ free_strings (lines);
+ return -1;
+ }
+
+ char *boot = get_table_field (lines[1+partnum], 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;
+ }