Module Name: src Committed By: martin Date: Sun Jul 28 13:17:46 UTC 2019
Modified Files: src/usr.sbin/sysinst: gpt.c Log Message: Deal with partition types we don't know anything about. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/sysinst/gpt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/sysinst/gpt.c diff -u src/usr.sbin/sysinst/gpt.c:1.4 src/usr.sbin/sysinst/gpt.c:1.5 --- src/usr.sbin/sysinst/gpt.c:1.4 Fri Jul 26 08:18:47 2019 +++ src/usr.sbin/sysinst/gpt.c Sun Jul 28 13:17:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gpt.c,v 1.4 2019/07/26 08:18:47 martin Exp $ */ +/* $NetBSD: gpt.c,v 1.5 2019/07/28 13:17:46 martin Exp $ */ /* * Copyright 2018 The NetBSD Foundation, Inc. @@ -354,29 +354,34 @@ gpt_read_from_disk(const char *dev, dadd bool fs_is_default = false; #endif - if (p->gp_type->fsflags != 0) { - const char *lm = get_last_mounted(fd, p->gp_start, - &p->fs_type, &p->fs_sub_type, p->gp_type->fsflags); - if (lm != NULL && *lm != 0) { - char *path = strdup(lm); - canonicalize_last_mounted(path); - p->last_mounted = path; + if (p->gp_type != NULL) { + + if (p->gp_type->fsflags != 0) { + const char *lm = get_last_mounted(fd, + p->gp_start, &p->fs_type, + &p->fs_sub_type, p->gp_type->fsflags); + if (lm != NULL && *lm != 0) { + char *path = strdup(lm); + canonicalize_last_mounted(path); + p->last_mounted = path; + } else { + p->fs_type = p->gp_type-> + default_fs_type; +#ifdef DEFAULT_UFS2 + fs_is_default = true; +#endif + } } else { p->fs_type = p->gp_type->default_fs_type; #ifdef DEFAULT_UFS2 fs_is_default = true; #endif } - } else { - p->fs_type = p->gp_type->default_fs_type; #ifdef DEFAULT_UFS2 - fs_is_default = true; + if (fs_is_default && p->fs_type == FS_BSDFFS) + p->fs_sub_type = 2; #endif } -#ifdef DEFAULT_UFS2 - if (fs_is_default && p->fs_type == FS_BSDFFS) - p->fs_sub_type = 2; -#endif parts->dp.free_space -= p->gp_size; } @@ -418,6 +423,9 @@ static bool gpt_get_part_info(const struct disk_partitions *arg, part_id id, struct disk_part_info *info) { + static const struct part_type_desc gpt_unknown_type = + { .generic_ptype = PT_undef, + .short_desc = "<unknown>" }; const struct gpt_disk_partitions *parts = (const struct gpt_disk_partitions*)arg; const struct gpt_part_entry *p = parts->partitions; @@ -434,6 +442,8 @@ gpt_get_part_info(const struct disk_part info->size = p->gp_size; if (p->gp_type) info->nat_type = &p->gp_type->gent; + else + info->nat_type = &gpt_unknown_type; info->last_mounted = p->last_mounted; info->fs_type = p->fs_type; info->fs_sub_type = p->fs_sub_type; @@ -1247,7 +1257,7 @@ gpt_write_to_disk(struct disk_partitions */ for (pno = 0, p = parts->partitions; p != NULL; p = p->gp_next, pno++) { p->gp_flags &= ~GPEF_WEDGE; - if (root_id == NO_PART) { + if (root_id == NO_PART && p->gp_type != NULL) { if (p->gp_type->gent.generic_ptype == PT_root && p->gp_start == pm->ptstart) { root_id = pno; @@ -1322,10 +1332,17 @@ gpt_write_to_disk(struct disk_partitions else sprintf(label_arg, "-l %s", p->gp_label); - run_program(RUN_SILENT, - "gpt -n add -b %" PRIu64 " -s %" PRIu64 "s -t %s %s %s", - p->gp_start, p->gp_size, p->gp_type->tid, - label_arg, arg->disk); + if (p->gp_type != NULL) + run_program(RUN_SILENT, + "gpt -n add -b %" PRIu64 " -s %" PRIu64 + "s -t %s %s %s", + p->gp_start, p->gp_size, p->gp_type->tid, + label_arg, arg->disk); + else + run_program(RUN_SILENT, + "gpt -n add -b %" PRIu64 " -s %" PRIu64 + "s %s %s", + p->gp_start, p->gp_size, label_arg, arg->disk); gpt_apply_attr(arg->disk, "set", p->gp_start, p->gp_attr); gpt_read_part(arg->disk, p->gp_start, p); p->gp_flags |= GPEF_ON_DISK; @@ -1399,7 +1416,8 @@ gpt_custom_attribute_writable(const stru if (p == NULL) return false; - if (p->fs_type == FS_SWAP || p->gp_type->gent.generic_ptype == PT_swap) + if (p->fs_type == FS_SWAP || + (p->gp_type != NULL && p->gp_type->gent.generic_ptype == PT_swap)) return false; return true; @@ -1437,9 +1455,12 @@ gpt_format_custom_attribute(const struct strlcpy(out, p->gp_label, out_space); else if (label == MSG_ptn_uuid) strlcpy(out, p->gp_id, out_space); - else if (label == MSG_ptn_gpt_type) - strlcpy(out, p->gp_type->gent.description, out_space); - else if (label == MSG_ptn_boot) + else if (label == MSG_ptn_gpt_type) { + if (p->gp_type != NULL) + strlcpy(out, p->gp_type->gent.description, out_space); + else if (out_space > 1) + out[0] = 0; + } else if (label == MSG_ptn_boot) strlcpy(out, msg_string(p->gp_attr & GPT_ATTR_BOOT ? MSG_Yes : MSG_No), out_space); else