Module Name:    src
Committed By:   martin
Date:           Wed Aug 14 13:58:00 UTC 2019

Modified Files:
        src/usr.sbin/sysinst: disklabel.c

Log Message:
Fix some "partition index" (as used in the abstract interface)
versus disklabel "partition letter" confusion.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/disklabel.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/disklabel.c
diff -u src/usr.sbin/sysinst/disklabel.c:1.12 src/usr.sbin/sysinst/disklabel.c:1.13
--- src/usr.sbin/sysinst/disklabel.c:1.12	Wed Aug 14 13:02:23 2019
+++ src/usr.sbin/sysinst/disklabel.c	Wed Aug 14 13:58:00 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: disklabel.c,v 1.12 2019/08/14 13:02:23 martin Exp $	*/
+/*	$NetBSD: disklabel.c,v 1.13 2019/08/14 13:58:00 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -814,9 +814,25 @@ disklabel_get_part_device(const struct d
     part_id ptn, char *devname, size_t max_devname_len, int *part,
     enum dev_name_usage which_name, bool with_path)
 {
+	const struct disklabel_disk_partitions *parts =
+	    (const struct disklabel_disk_partitions*)arg;
+	part_id id;
+	int part_index;
+	char pname;
+
+	if (ptn >= parts->l.d_npartitions)
+		return false;
+
+	for (id = part_index = 0; id < ptn &&
+	    part_index < parts->l.d_npartitions; part_index++)
+		if (parts->l.d_partitions[part_index].p_fstype != FS_UNUSED ||
+		    parts->l.d_partitions[part_index].p_size != 0)
+			id++;
 
 	if (part != 0)
-		*part = ptn;
+		*part = part_index;
+
+	pname = 'a'+ part_index;
 
 	switch (which_name) {
 	case parent_device_only:
@@ -826,18 +842,18 @@ disklabel_get_part_device(const struct d
 	case plain_name:
 		if (with_path)
 			snprintf(devname, max_devname_len, _PATH_DEV "%s%c",
-			    arg->disk, (char)ptn + 'a');
+			    arg->disk, pname);
 		else
 			snprintf(devname, max_devname_len, "%s%c",
-			    arg->disk, (char)ptn + 'a');
+			    arg->disk, pname);
 		return true;
 	case raw_dev_name:
 		if (with_path)
 			snprintf(devname, max_devname_len, _PATH_DEV "r%s%c",
-			    arg->disk, (char)ptn + 'a');
+			    arg->disk, pname);
 		else
 			snprintf(devname, max_devname_len, "r%s%c",
-			    arg->disk, (char)ptn + 'a');
+			    arg->disk, pname);
 		return true;
 	}
 
@@ -1024,7 +1040,7 @@ disklabel_find_by_name(struct disk_parti
 	    (const struct disklabel_disk_partitions*)arg;
 	char *sl, part;
 	ptrdiff_t n;
-	part_id pno;
+	part_id pno, id, i;
 
 	sl = strrchr(name, '/');
 	if (sl == NULL)
@@ -1040,7 +1056,11 @@ disklabel_find_by_name(struct disk_parti
 		return NO_PART;
 	if (parts->l.d_partitions[pno].p_fstype == FS_UNUSED)
 		return NO_PART;
-	return pno;
+	for (id = 0, i = 0; i < pno; i++)
+		if (parts->l.d_partitions[i].p_fstype != FS_UNUSED ||
+		    parts->l.d_partitions[i].p_size != 0)
+			id++;
+	return id;
 }
 
 static void

Reply via email to