Module Name:    src
Committed By:   martin
Date:           Wed Nov  7 21:20:23 UTC 2018

Modified Files:
        src/usr.sbin/sysinst: defs.h disks.c main.c util.c
        src/usr.sbin/sysinst/arch/emips: md.h
        src/usr.sbin/sysinst/arch/i386: md.h
        src/usr.sbin/sysinst/arch/vax: md.h

Log Message:
Unify handling of CDROM device names.
Skip CDs when looking for install targets (we do not support installing
onto a blueray with UDF).

Fix search for the default CDROM device and the CD we booted from
for ports with nonstandard CDROM device names.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.17 -r1.18 src/usr.sbin/sysinst/disks.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/main.c
cvs rdiff -u -r1.13 -r1.14 src/usr.sbin/sysinst/util.c
cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/sysinst/arch/emips/md.h
cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/sysinst/arch/i386/md.h
cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/sysinst/arch/vax/md.h

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/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.20 src/usr.sbin/sysinst/defs.h:1.21
--- src/usr.sbin/sysinst/defs.h:1.20	Sat Oct  6 18:45:37 2018
+++ src/usr.sbin/sysinst/defs.h	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.20 2018/10/06 18:45:37 martin Exp $	*/
+/*	$NetBSD: defs.h,v 1.21 2018/11/07 21:20:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -179,7 +179,7 @@ enum {
 		       (p)->pi_fstype == FS_BSDFFS)
 
 /* standard cd0 device */
-#define CD_NAMES "cd0a"
+#define CD_NAMES "cd*"
 
 /* Types */
 
@@ -473,7 +473,7 @@ int	md_update(void);
 void	toplevel(void);
 
 /* from disks.c */
-const char *get_default_cdrom(void);
+bool	get_default_cdrom(char *, size_t);
 int	find_disks(const char *);
 struct menudesc;
 void	fmt_fspart(struct menudesc *, int, void *);

Index: src/usr.sbin/sysinst/disks.c
diff -u src/usr.sbin/sysinst/disks.c:1.17 src/usr.sbin/sysinst/disks.c:1.18
--- src/usr.sbin/sysinst/disks.c:1.17	Mon Nov  5 19:45:56 2018
+++ src/usr.sbin/sysinst/disks.c	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: disks.c,v 1.17 2018/11/05 19:45:56 martin Exp $ */
+/*	$NetBSD: disks.c,v 1.18 2018/11/07 21:20:23 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -355,10 +355,10 @@ done:
  * returns the first entry in hw.disknames matching a cdrom_device, or
  * first entry on error or no match
  */
-const char *
-get_default_cdrom(void)
+bool
+get_default_cdrom(char *cd, size_t max_len)
 {
-	static const char *cdrom_devices[] = { CD_NAMES, 0};
+	static const char *cdrom_devices[] = { CD_NAMES, 0 };
 	static const char mib_name[] = "hw.disknames";
 	size_t len;
 	char *disknames;
@@ -502,8 +502,40 @@ is_ffs_wedge(const char *dev)
 	return res;
 }
 
+/*
+ * Does this device match an entry in our default CDROM device list?
+ */
+static bool
+is_cdrom_device(const char *dev)
+{
+	static const char *cdrom_devices[] = { CD_NAMES, 0 };
+	char pat[SSTRSIZE], *star;
+	const char **dev_pat;
+
+	for (dev_pat = cdrom_devices; *dev_pat; dev_pat++) {
+		strcpy(pat, *dev_pat);
+		star = strchr(pat, '*');
+		if (star)
+			*star = 0;
+
+		if (strcmp(dev, pat) == 0)
+			return true;
+	}
+
+	return false;
+}
+
+/*
+ * Multi-purpose helper function:
+ * iterate all known disks, either
+ *  - skip all CD devices
+ *  - recognize the first available CD device and set its name
+ * When doing non-CDs, optionally skip non-partionable devices
+ * (i.e. wedges).
+ */
 static int
-get_disks(struct disk_desc *dd, bool with_non_partitionable)
+get_disks(struct disk_desc *dd, bool with_non_partitionable,
+	char *cd_dev, size_t max_len)
 {
 	static const int mib[] = { CTL_HW, HW_DISKNAMES };
 	static const unsigned int miblen = __arraycount(mib);
@@ -528,6 +560,18 @@ get_disks(struct disk_desc *dd, bool wit
 	}
 
 	for (xd = strtok(disk_names, " "); xd != NULL; xd = strtok(NULL, " ")) {
+		/* is this a CD device? */
+		if (is_cdrom_device(xd)) {
+			if (cd_dev && max_len) {
+				/* return first found CD device name */
+				strlcpy(cd_dev, xd, max_len);
+				return 1;
+			} else {
+				/* skip this device */
+				continue;
+			}
+		}
+
 		strlcpy(dd->dd_name, xd, sizeof dd->dd_name - 2);
 		dd->dd_no_mbr = false;
 		dd->dd_no_part = false;
@@ -600,7 +644,7 @@ find_disks(const char *doingwhat)
 	pm_devs_t *pm_i, *pm_last = NULL;
 
 	/* Find disks. */
-	numdisks = get_disks(disks, partman_go <= 0);
+	numdisks = get_disks(disks, partman_go <= 0, NULL, 0);
 
 	/* need a redraw here, kernel messages hose everything */
 	touchwin(stdscr);
@@ -1187,12 +1231,15 @@ done_with_disks:
 #endif
 	}
 
+	if (cdrom_dev[0] == 0)
+		get_default_cdrom(cdrom_dev, sizeof(cdrom_dev));
+
 	/* Add /kern, /proc and /dev/pts to fstab and make mountpoint. */
 	scripting_fprintf(f, "kernfs\t\t/kern\tkernfs\trw\n");
 	scripting_fprintf(f, "ptyfs\t\t/dev/pts\tptyfs\trw\n");
 	scripting_fprintf(f, "procfs\t\t/proc\tprocfs\trw\n");
 	scripting_fprintf(f, "/dev/%s\t\t/cdrom\tcd9660\tro,noauto\n",
-	    get_default_cdrom());
+	    cdrom_dev);
 	scripting_fprintf(f, "%stmpfs\t\t/var/shm\ttmpfs\trw,-m1777,-sram%%25\n",
 	    tmpfs_on_var_shm() ? "" : "#");
 	make_target_dir("/kern");

Index: src/usr.sbin/sysinst/main.c
diff -u src/usr.sbin/sysinst/main.c:1.12 src/usr.sbin/sysinst/main.c:1.13
--- src/usr.sbin/sysinst/main.c:1.12	Sat Nov  3 18:30:00 2018
+++ src/usr.sbin/sysinst/main.c	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.12 2018/11/03 18:30:00 martin Exp $	*/
+/*	$NetBSD: main.c,v 1.13 2018/11/07 21:20:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -148,7 +148,7 @@ init(void)
 
 	for (arg = fflagopts; arg->name != NULL; arg++) {
 		if (arg->var == cdrom_dev)
-			strlcpy(arg->var, get_default_cdrom(), arg->size);
+			get_default_cdrom(arg->var, arg->size);
 		else
 			strlcpy(arg->var, arg->dflt, arg->size);
 	}

Index: src/usr.sbin/sysinst/util.c
diff -u src/usr.sbin/sysinst/util.c:1.13 src/usr.sbin/sysinst/util.c:1.14
--- src/usr.sbin/sysinst/util.c:1.13	Mon Nov  5 17:04:03 2018
+++ src/usr.sbin/sysinst/util.c	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: util.c,v 1.13 2018/11/05 17:04:03 martin Exp $	*/
+/*	$NetBSD: util.c,v 1.14 2018/11/07 21:20:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -419,64 +419,83 @@ get_iso9660_volname(int dev, int sess, c
 static int
 get_available_cds(void)
 {
-	char dname[16], volname[80];
+	static const char *cdrom_devices[] = { CD_NAMES, 0 };
+	char dname[16], volname[80], fmt[80], tmp[80], *star;
 	struct cd_info *info = cds;
 	struct disklabel label;
 	int i, part, dev, error, sess, ready, count = 0;
 
-	for (i = 0; i < MAX_CD_DEVS; i++) {
-		sprintf(dname, "/dev/rcd%d%c", i, 'a'+RAW_PART);
-		dev = open(dname, O_RDONLY, 0);
-		if (dev == -1)
-			break;
-		ready = 0;
-		error = ioctl(dev, DIOCTUR, &ready);
-		if (error != 0 || ready == 0) {
+	for (const char **dev_pat = cdrom_devices; *dev_pat; dev_pat++) {
+		for (i = 0; i < MAX_CD_DEVS; i++) {
+			strcpy(fmt, *dev_pat);
+			star = strchr(fmt, '*');
+			if (star) {
+				strcpy(star, "%d");
+				sprintf(tmp, "/dev/r%s%%c", fmt);
+				sprintf(dname, tmp, i, 'a'+RAW_PART);
+			} else {
+				sprintf(dname, "/dev/r%s%c", fmt,
+				    'a'+RAW_PART);
+			}
+			dev = open(dname, O_RDONLY, 0);
+			if (dev == -1)
+				continue;
+			ready = 0;
+			error = ioctl(dev, DIOCTUR, &ready);
+			if (error != 0 || ready == 0) {
+				close(dev);
+				continue;
+			}
+			error = ioctl(dev, DIOCGDINFO, &label);
 			close(dev);
-			continue;
-		}
-		error = ioctl(dev, DIOCGDINFO, &label);
-		close(dev);
-		if (error == 0) {
-			for (part = 0; part < label.d_npartitions; part++) {
-				if (label.d_partitions[part].p_fstype
-					== FS_UNUSED
-				    || label.d_partitions[part].p_size == 0)
-					continue;
-				if (label.d_partitions[part].p_fstype
-				    == FS_ISO9660) {
-					sess = label.d_partitions[part]
-					    .p_cdsession;
-					sprintf(dname, "/dev/rcd%d%c", i,
-					    'a'+part);
-					dev = open(dname, O_RDONLY, 0);
-					if (dev == -1)
-						continue;
-					error = get_iso9660_volname(dev, sess,
-					    volname);
-					close(dev);
-					if (error) continue;
-					sprintf(info->device_name, "cd%d%c",
-						i, 'a'+part);
-					sprintf(info->menu, "%s (%s)",
-						info->device_name,
-						volname);
-				} else {
-					/*
-					 * All install CDs use partition
-					 * a for the sets.
-					 */
-					if (part > 0)
+			if (error == 0) {
+				for (part = 0; part < label.d_npartitions;
+				    part++) {
+					if (label.d_partitions[part].p_fstype
+						== FS_UNUSED
+					    || label.d_partitions[part].p_size == 0)
 						continue;
-					sprintf(info->device_name, "cd%d%c",
-						i, 'a'+part);
-					strcpy(info->menu, info->device_name);
+					if (label.d_partitions[part].p_fstype
+					    == FS_ISO9660) {
+						sess = label.d_partitions[part]
+						    .p_cdsession;
+						sprintf(dname, "/dev/rcd%d%c", i,
+						    'a'+part);
+						dev = open(dname, O_RDONLY, 0);
+						if (dev == -1)
+							continue;
+						error = get_iso9660_volname(dev, sess,
+						    volname);
+						close(dev);
+						if (error) continue;
+						sprintf(info->device_name, "cd%d%c",
+							i, 'a'+part);
+						sprintf(info->menu, "%s (%s)",
+							info->device_name,
+							volname);
+					} else {
+						/*
+						 * All install CDs use partition
+						 * a for the sets.
+						 */
+						if (part > 0)
+							continue;
+						sprintf(info->device_name, "cd%d%c",
+							i, 'a'+part);
+						strcpy(info->menu, info->device_name);
+					}
+					info++;
+					if (++count >= MAX_CD_INFOS)
+						break;
 				}
-				info++;
-				if (++count >= MAX_CD_INFOS)
-					break;
 			}
+			if (++count >= MAX_CD_INFOS)
+				break;
+			if (!star)
+				break;
 		}
+		if (++count >= MAX_CD_INFOS)
+			break;
 	}
 	return count;
 }

Index: src/usr.sbin/sysinst/arch/emips/md.h
diff -u src/usr.sbin/sysinst/arch/emips/md.h:1.2 src/usr.sbin/sysinst/arch/emips/md.h:1.3
--- src/usr.sbin/sysinst/arch/emips/md.h:1.2	Mon Nov  5 19:45:56 2018
+++ src/usr.sbin/sysinst/arch/emips/md.h	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.h,v 1.2 2018/11/05 19:45:56 martin Exp $	*/
+/*	$NetBSD: md.h,v 1.3 2018/11/07 21:20:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -80,4 +80,4 @@
 #ifdef CD_NAMES
 #undef CD_NAMES
 #endif
-#define CD_NAMES "ace1a"
+#define CD_NAMES "ace1"

Index: src/usr.sbin/sysinst/arch/i386/md.h
diff -u src/usr.sbin/sysinst/arch/i386/md.h:1.2 src/usr.sbin/sysinst/arch/i386/md.h:1.3
--- src/usr.sbin/sysinst/arch/i386/md.h:1.2	Mon Nov  5 19:45:56 2018
+++ src/usr.sbin/sysinst/arch/i386/md.h	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.h,v 1.2 2018/11/05 19:45:56 martin Exp $	*/
+/*	$NetBSD: md.h,v 1.3 2018/11/07 21:20:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -101,7 +101,7 @@ extern struct mbr_bootsel *mbs;
 #ifdef CD_NAMES
 #undef CD_NAMES
 #endif
-#define CD_NAMES "cd0a","mcd0a"
+#define CD_NAMES "cd*","mcd*"
 
 /*
  *  prototypes for MD code.

Index: src/usr.sbin/sysinst/arch/vax/md.h
diff -u src/usr.sbin/sysinst/arch/vax/md.h:1.2 src/usr.sbin/sysinst/arch/vax/md.h:1.3
--- src/usr.sbin/sysinst/arch/vax/md.h:1.2	Mon Nov  5 19:45:56 2018
+++ src/usr.sbin/sysinst/arch/vax/md.h	Wed Nov  7 21:20:23 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.h,v 1.2 2018/11/05 19:45:56 martin Exp $	*/
+/*	$NetBSD: md.h,v 1.3 2018/11/07 21:20:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -69,4 +69,4 @@
 #ifdef CD_NAMES
 #undef CD_NAMES
 #endif
-#define CD_NAMES "cd0a","racd0a"
+#define CD_NAMES "cd*","racd*"

Reply via email to