Module Name:    src
Committed By:   martin
Date:           Thu Nov  8 20:29:38 UTC 2018

Modified Files:
        src/usr.sbin/sysinst: defs.h disks.c util.c

Log Message:
Adapt other cd-device query functions to new world order, fix
default cd device (assume 'a' partition).


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/usr.sbin/sysinst/defs.h \
    src/usr.sbin/sysinst/disks.c
cvs rdiff -u -r1.14 -r1.15 src/usr.sbin/sysinst/util.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/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.21 src/usr.sbin/sysinst/defs.h:1.22
--- src/usr.sbin/sysinst/defs.h:1.21	Wed Nov  7 21:20:23 2018
+++ src/usr.sbin/sysinst/defs.h	Thu Nov  8 20:29:37 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.21 2018/11/07 21:20:23 martin Exp $	*/
+/*	$NetBSD: defs.h,v 1.22 2018/11/08 20:29:37 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -475,6 +475,9 @@ void	toplevel(void);
 /* from disks.c */
 bool	get_default_cdrom(char *, size_t);
 int	find_disks(const char *);
+bool enumerate_disks(void *state,bool (*func)(void *state, const char *dev));
+bool is_cdrom_device(const char *dev);
+
 struct menudesc;
 void	fmt_fspart(struct menudesc *, int, void *);
 void	disp_cur_fspart(int, int);
Index: src/usr.sbin/sysinst/disks.c
diff -u src/usr.sbin/sysinst/disks.c:1.21 src/usr.sbin/sysinst/disks.c:1.22
--- src/usr.sbin/sysinst/disks.c:1.21	Thu Nov  8 11:56:56 2018
+++ src/usr.sbin/sysinst/disks.c	Thu Nov  8 20:29:37 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: disks.c,v 1.21 2018/11/08 11:56:56 martin Exp $ */
+/*	$NetBSD: disks.c,v 1.22 2018/11/08 20:29:37 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -110,8 +110,6 @@ static int fsck_preen(const char *, int,
 static void fixsb(const char *, const char *, char);
 static bool is_gpt(const char *);
 static int incoregpt(pm_devs_t *, partinfo *);
-static bool enumerate_disks(void *state,
-	bool (*func)(void *state, const char *dev));
 
 
 static bool tmpfs_on_var_shm(void);
@@ -371,7 +369,11 @@ get_default_cdrom_helper(void *state, co
 {
 	struct default_cdrom_data *data = state;
 
+	if (!is_cdrom_device(dev))
+		return true;
+
 	strlcpy(data->device, dev, data->max_len);
+	strlcat(data->device, "a", data->max_len); /* default to partition a */
 	data->found = true;
 
 	return false;	/* one is enough, stop iteration */
@@ -510,7 +512,7 @@ is_ffs_wedge(const char *dev)
 /*
  * Does this device match an entry in our default CDROM device list?
  */
-static bool
+bool
 is_cdrom_device(const char *dev)
 {
 	static const char *cdrom_devices[] = { CD_NAMES, 0 };
@@ -528,7 +530,7 @@ is_cdrom_device(const char *dev)
  * Stop iteration when the callback returns false.
  * Return true when iteration actually happend, false on error.
  */
-static bool
+bool
 enumerate_disks(void *state, bool (*func)(void *state, const char *dev))
 {
 	static const int mib[] = { CTL_HW, HW_DISKNAMES };

Index: src/usr.sbin/sysinst/util.c
diff -u src/usr.sbin/sysinst/util.c:1.14 src/usr.sbin/sysinst/util.c:1.15
--- src/usr.sbin/sysinst/util.c:1.14	Wed Nov  7 21:20:23 2018
+++ src/usr.sbin/sysinst/util.c	Thu Nov  8 20:29:37 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: util.c,v 1.14 2018/11/07 21:20:23 martin Exp $	*/
+/*	$NetBSD: util.c,v 1.15 2018/11/08 20:29:37 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -413,91 +413,97 @@ get_iso9660_volname(int dev, int sess, c
 }
 
 /*
- * Get a list of all available CD media (not drives!), return
- * the number of entries collected.
+ * Local state while iterating CDs and collecting volumes
  */
-static int
-get_available_cds(void)
+struct get_available_cds_state {
+	struct cd_info *info;
+	size_t count;
+};
+
+/*
+ * Callback function: if this is a CD, enumerate all volumes on it
+ */
+static bool
+get_available_cds_helper(void *arg, const char *device)
 {
-	static const char *cdrom_devices[] = { CD_NAMES, 0 };
-	char dname[16], volname[80], fmt[80], tmp[80], *star;
-	struct cd_info *info = cds;
+	struct get_available_cds_state *state = arg;
+	char dname[16], volname[80];
 	struct disklabel label;
-	int i, part, dev, error, sess, ready, count = 0;
+	int part, dev, error, sess, ready;
 
-	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);
-			}
+	if (!is_cdrom_device(device))
+		return true;
+
+	sprintf(dname, "/dev/r%s%c", device, 'a'+RAW_PART);
+	dev = open(dname, O_RDONLY, 0);
+	if (dev == -1)
+		return true;
+
+	ready = 0;
+	error = ioctl(dev, DIOCTUR, &ready);
+	if (error != 0 || ready == 0) {
+		close(dev);
+		return true;
+	}
+	error = ioctl(dev, DIOCGDINFO, &label);
+	close(dev);
+	if (error != 0)
+		return true;
+
+	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/r%s%c", device, 'a'+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);
+			error = get_iso9660_volname(dev, sess, volname);
 			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)
-							continue;
-						sprintf(info->device_name, "cd%d%c",
-							i, 'a'+part);
-						strcpy(info->menu, info->device_name);
-					}
-					info++;
-					if (++count >= MAX_CD_INFOS)
-						break;
-				}
-			}
-			if (++count >= MAX_CD_INFOS)
-				break;
-			if (!star)
-				break;
+			if (error)
+				continue;
+			sprintf(state->info->device_name,
+			    "%s%c", device, 'a'+part);
+			sprintf(state->info->menu, "%s (%s)",
+			    state->info->device_name, volname);
+		} else {
+			/*
+			 * All install CDs use partition
+			 * a for the sets.
+			 */
+			if (part > 0)
+				continue;
+			sprintf(state->info->device_name,
+			    "%s%c", device, 'a'+part);
+			strcpy(state->info->menu, state->info->device_name);
 		}
-		if (++count >= MAX_CD_INFOS)
-			break;
+		state->info++;
+		if (++state->count >= MAX_CD_INFOS)
+			return false;
 	}
-	return count;
+
+	return true;
+}
+
+/*
+ * Get a list of all available CD media (not drives!), return
+ * the number of entries collected.
+ */
+static int
+get_available_cds(void)
+{
+	struct get_available_cds_state data;
+
+	data.info = cds;
+	data.count = 0;
+
+	enumerate_disks(&data, get_available_cds_helper);
+
+	return data.count;
 }
 
 static int

Reply via email to