Module Name:    src
Committed By:   christos
Date:           Fri Jun 21 21:54:39 UTC 2019

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

Log Message:
refactor disk ioctl stuff to make it smaller.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.34 -r1.35 src/usr.sbin/sysinst/disks.c
cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/sysinst/geom.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.35 src/usr.sbin/sysinst/defs.h:1.36
--- src/usr.sbin/sysinst/defs.h:1.35	Thu Jun 20 11:56:41 2019
+++ src/usr.sbin/sysinst/defs.h	Fri Jun 21 17:54:39 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.35 2019/06/20 15:56:41 christos Exp $	*/
+/*	$NetBSD: defs.h,v 1.36 2019/06/21 21:54:39 christos Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -658,8 +658,11 @@ void	get_disk_info(char *);
 void	set_disk_info(char *);
 
 /* from geom.c */
-int	get_disk_geom(const char *, struct disk_geom *);
-int	get_label_geom(const char *, struct disklabel *);
+bool	disk_ioctl(const char *, unsigned long, void *);
+bool	get_wedge_list(const char *, struct dkwedge_list *);
+bool	get_wedge_info(const char *, struct dkwedge_info *);
+bool	get_disk_geom(const char *, struct disk_geom *);
+bool	get_label_geom(const char *, struct disklabel *);
 
 /* from net.c */
 extern int network_up;

Index: src/usr.sbin/sysinst/disks.c
diff -u src/usr.sbin/sysinst/disks.c:1.34 src/usr.sbin/sysinst/disks.c:1.35
--- src/usr.sbin/sysinst/disks.c:1.34	Thu Jun 20 11:49:20 2019
+++ src/usr.sbin/sysinst/disks.c	Fri Jun 21 17:54:39 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: disks.c,v 1.34 2019/06/20 15:49:20 christos Exp $ */
+/*	$NetBSD: disks.c,v 1.35 2019/06/21 21:54:39 christos Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -205,7 +205,7 @@ scsi_strvis(char *sdst, size_t dlen, con
 
 
 static int
-get_descr_scsi(struct disk_desc *dd, int fd)
+get_descr_scsi(struct disk_desc *dd)
 {
 	struct scsipi_inquiry_data inqbuf;
 	struct scsipi_inquiry cmd;
@@ -215,7 +215,6 @@ get_descr_scsi(struct disk_desc *dd, int
 	     product[(sizeof(inqbuf.product) * 4) + 1],
 	     revision[(sizeof(inqbuf.revision) * 4) + 1];
 	char size[5];
-	int error;
 
 	memset(&inqbuf, 0, sizeof(inqbuf));
 	memset(&cmd, 0, sizeof(cmd));
@@ -231,8 +230,8 @@ get_descr_scsi(struct disk_desc *dd, int
 	req.flags = SCCMD_READ;
 	req.senselen = SENSEBUFLEN;
 
-	error = ioctl(fd, SCIOCCOMMAND, &req);
-	if (error == -1 || req.retsts != SCCMD_OK)
+	if (!disk_ioctl(dd->dd_name, SCIOCCOMMAND, &req)
+	    || req.retsts != SCCMD_OK)
 		return 0;
 
 	scsi_strvis(vendor, sizeof(vendor), inqbuf.vendor,
@@ -254,7 +253,7 @@ get_descr_scsi(struct disk_desc *dd, int
 }
 
 static int
-get_descr_ata(struct disk_desc *dd, int fd)
+get_descr_ata(struct disk_desc *dd)
 {
 	struct atareq req;
 	static union {
@@ -264,7 +263,7 @@ get_descr_ata(struct disk_desc *dd, int 
 	struct ataparams *inqbuf = &inbuf.inqbuf;
 	char model[sizeof(inqbuf->atap_model)+1];
 	char size[5];
-	int error, needswap = 0;
+	int needswap = 0;
 
 	memset(&inbuf, 0, sizeof(inbuf));
 	memset(&req, 0, sizeof(req));
@@ -275,8 +274,8 @@ get_descr_ata(struct disk_desc *dd, int 
 	req.datalen = sizeof(inbuf);
 	req.timeout = 1000;
 
-	error = ioctl(fd, ATAIOCCOMMAND, &req);
-	if (error == -1 || req.retsts != ATACMD_OK)
+	if (!disk_ioctl(dd->dd_name, ATAIOCCOMMAND, &req)
+	    || req.retsts != ATACMD_OK)
 		return 0;
 
 #if BYTE_ORDER == LITTLE_ENDIAN
@@ -311,26 +310,20 @@ get_descr_ata(struct disk_desc *dd, int 
 static void
 get_descr(struct disk_desc *dd)
 {
-	char diskpath[MAXPATHLEN], size[5];
-	int fd = -1;
-
-	fd = opendisk(dd->dd_name, O_RDONLY, diskpath, sizeof(diskpath), 0);
-	if (fd < 0)
-		goto done;
-
+	char size[5];
 	dd->dd_descr[0] = '\0';
 
 	/* try ATA */
-	if (get_descr_ata(dd, fd))
+	if (get_descr_ata(dd))
 		goto done;
 	/* try SCSI */
-	if (get_descr_scsi(dd, fd))
+	if (get_descr_scsi(dd))
 		goto done;
 
 	/* XXX: identify for ld @ NVME or microSD */
 
 	/* XXX: get description from raid, cgd, vnd... */
-
+done:
 	/* punt, just give some generic info */
 	humanize_number(size, sizeof(size),
 	    (uint64_t)dd->dd_secsize * (uint64_t)dd->dd_totsec,
@@ -338,10 +331,6 @@ get_descr(struct disk_desc *dd)
 
 	snprintf(dd->dd_descr, sizeof(dd->dd_descr),
 	    "%s (%s)", dd->dd_name, size);
-
-done:
-	if (fd >= 0)
-		close(fd);
 }
 
 /*
@@ -396,80 +385,39 @@ static bool
 get_wedge_descr(struct disk_desc *dd)
 {
 	struct dkwedge_info dkw;
-	char buf[MAXPATHLEN];
-	int fd;
-	bool ok = false;
 
-	fd = opendisk(dd->dd_name, O_RDONLY, buf, sizeof(buf), 0);
-	if (fd == -1)
+	if (!get_wedge_info(dd->dd_name, &dkw))
 		return false;
 
-	if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == 0) {
-		sprintf(dd->dd_descr, "%s (%s@%s)",
-		    dkw.dkw_wname, dkw.dkw_devname, dkw.dkw_parent);
-		ok = true;
-	}
-	close(fd);
-	return ok;
+	snprintf(dd->dd_descr, sizeof(dd->dd_descr), "%s (%s@%s)",
+	    dkw.dkw_wname, dkw.dkw_devname, dkw.dkw_parent);
+	return true;
 }
 
 static bool
 get_name_and_parent(const char *dev, char *name, char *parent)
 {
 	struct dkwedge_info dkw;
-	char buf[MAXPATHLEN];
-	int fd;
-	bool res = false;
 
-	fd = opendisk(dev, O_RDONLY, buf, sizeof(buf), 0);
-	if (fd == -1)
+	if (!get_wedge_info(dev, &dkw))
 		return false;
-
-	if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == 0) {
-		strcpy(name, (const char *)dkw.dkw_wname);
-		strcpy(parent, dkw.dkw_parent);
-		res = true;
-	}
-	close(fd);
-	return res;
+	strcpy(name, (const char *)dkw.dkw_wname);
+	strcpy(parent, dkw.dkw_parent);
+	return true;
 }
 
 static bool
 find_swap_part_on(const char *dev, char *swap_name)
 {
-	struct dkwedge_info *dkw;
 	struct dkwedge_list dkwl;
-	char buf[MAXPATHLEN];
-	size_t bufsize;
-	int fd;
+	struct dkwedge_info *dkw;
 	u_int i;
 	bool res = false;
 
-	dkw = NULL;
-	dkwl.dkwl_buf = dkw;
-	dkwl.dkwl_bufsize = 0;
-
-	fd = opendisk(dev, O_RDONLY, buf, sizeof(buf), 0);
-	if (fd == -1)
+	if (!get_wedge_list(dev, &dkwl))
 		return false;
 
-	for (;;) {
-		if (ioctl(fd, DIOCLWEDGES, &dkwl) == -1) {
-			dkwl.dkwl_ncopied = 0;
-			break;
-		}
-		if (dkwl.dkwl_nwedges == dkwl.dkwl_ncopied)
-			break;
-		bufsize = dkwl.dkwl_nwedges * sizeof(*dkw);
-		if (dkwl.dkwl_bufsize < bufsize) {
-			dkw = realloc(dkwl.dkwl_buf, bufsize);
-			if (dkw == NULL)
-				break;
-			dkwl.dkwl_buf = dkw;
-			dkwl.dkwl_bufsize = bufsize;
-		}
-	}
-
+	dkw = dkwl.dkwl_buf;
 	for (i = 0; i < dkwl.dkwl_nwedges; i++) {
 		res = strcmp(dkw[i].dkw_ptype, DKW_PTYPE_SWAP) == 0;
 		if (res) {
@@ -477,8 +425,7 @@ find_swap_part_on(const char *dev, char 
 			break;
 		}
 	}
-
-	close(fd);
+	free(dkwl.dkwl_buf);
 
 	return res;
 }
@@ -487,21 +434,11 @@ static bool
 is_ffs_wedge(const char *dev)
 {
 	struct dkwedge_info dkw;
-	char buf[MAXPATHLEN];
-	int fd;
-	bool res;
 
-	fd = opendisk(dev, O_RDONLY, buf, sizeof(buf), 0);
-	if (fd == -1)
-		return false;
-
-	if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == -1)
+	if (!get_wedge_info(dev, &dkw))
 		return false;
 
-	res = strcmp(dkw.dkw_ptype, DKW_PTYPE_FFS) == 0;
-	close(fd);
-
-	return res;
+	return strcmp(dkw.dkw_ptype, DKW_PTYPE_FFS) == 0;
 }
 
 /*
@@ -1775,36 +1712,16 @@ get_dkwedges_sort(const void *a, const v
 int
 get_dkwedges(struct dkwedge_info **dkw, const char *diskdev)
 {
-	int fd;
-	char buf[STRSIZE];
-	size_t bufsize;
 	struct dkwedge_list dkwl;
 
 	*dkw = NULL;
-	dkwl.dkwl_buf = *dkw;
-	dkwl.dkwl_bufsize = 0;
-	fd = opendisk(diskdev, O_RDONLY, buf, STRSIZE, 0);
-	if (fd < 0)
+	if (!get_wedge_list(diskdev, &dkwl))
 		return -1;
 
-	for (;;) {
-		if (ioctl(fd, DIOCLWEDGES, &dkwl) == -1)
-			return -2;
-		if (dkwl.dkwl_nwedges == dkwl.dkwl_ncopied)
-			break;
-		bufsize = dkwl.dkwl_nwedges * sizeof(**dkw);
-		if (dkwl.dkwl_bufsize < bufsize) {
-			*dkw = realloc(dkwl.dkwl_buf, bufsize);
-			if (*dkw == NULL)
-				return -3;
-			dkwl.dkwl_buf = *dkw;
-			dkwl.dkwl_bufsize = bufsize;
-		}
+	if (dkwl.dkwl_nwedges > 0 && *dkw != NULL) {
+		qsort(*dkw, dkwl.dkwl_nwedges, sizeof(**dkw),
+		    get_dkwedges_sort);
 	}
 
-	if (dkwl.dkwl_nwedges > 0 && *dkw != NULL)
-		qsort(*dkw, dkwl.dkwl_nwedges, sizeof(**dkw), get_dkwedges_sort);
-
-	close(fd);
 	return dkwl.dkwl_nwedges;
 }

Index: src/usr.sbin/sysinst/geom.c
diff -u src/usr.sbin/sysinst/geom.c:1.2 src/usr.sbin/sysinst/geom.c:1.3
--- src/usr.sbin/sysinst/geom.c:1.2	Wed Jun 12 02:20:17 2019
+++ src/usr.sbin/sysinst/geom.c	Fri Jun 21 17:54:39 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: geom.c,v 1.2 2019/06/12 06:20:17 martin Exp $	*/
+/*	$NetBSD: geom.c,v 1.3 2019/06/21 21:54:39 christos Exp $	*/
 
 /*
  * Copyright (c) 1995, 1997 Jason R. Thorpe.
@@ -39,13 +39,14 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <util.h>
+#include <stdint.h>
 #include <errno.h>
 #include "partutil.h"
 
 #include "defs.h"
 
-static int
-get_label(const char *disk, struct disklabel *l, unsigned long cmd)
+bool
+disk_ioctl(const char *disk, unsigned long cmd, void *d)
 {
 	char diskpath[MAXPATHLEN];
 	int fd;
@@ -53,40 +54,69 @@ get_label(const char *disk, struct diskl
 
 	/* Open the disk. */
 	fd = opendisk(disk, O_RDONLY, diskpath, sizeof(diskpath), 0);
-	if (fd < 0) 
-		return 0;
+	if (fd == -1) 
+		return false;
 
-	if (ioctl(fd, cmd, l) < 0) {
+	if (ioctl(fd, cmd, d) == -1) {
 		sv_errno = errno;
 		(void)close(fd);
 		errno = sv_errno;
-		return 0;
+		return false;
 	}
 	(void)close(fd);
-	return 1;
+	return true;
 }
 
-int
+bool
+get_wedge_list(const char *disk, struct dkwedge_list *dkwl)
+{
+	struct dkwedge_info *dkw;
+	memset(dkwl, 0, sizeof(*dkwl));
+
+	for (;;) {
+		if (!disk_ioctl(disk, DIOCLWEDGES, dkwl))
+			goto out;
+		if (dkwl->dkwl_nwedges == dkwl->dkwl_ncopied)
+			return true;
+		dkwl->dkwl_bufsize = dkwl->dkwl_nwedges * sizeof(*dkw);
+		dkw = realloc(dkwl->dkwl_buf, dkwl->dkwl_bufsize);
+		if (dkw == NULL)
+			goto out;
+		dkwl->dkwl_buf = dkw;
+	}
+out:
+	free(dkwl->dkwl_buf);
+	return false;
+}
+
+bool
+get_wedge_info(const char *disk, struct dkwedge_info *dkw)
+{
+
+	return disk_ioctl(disk, DIOCGWEDGEINFO, dkw);
+}
+
+bool
 get_disk_geom(const char *disk, struct disk_geom *d)
 {
 	char buf[MAXPATHLEN];
 	int fd, error;
 	    
 	if ((fd = opendisk(disk, O_RDONLY, buf, sizeof(buf), 0)) == -1)
-		return 0;
+		return false;
   
 	error = getdiskinfo(disk, fd, NULL, d, NULL);
 	close(fd);
 	if (error < 0) {
 		errno = error;
-		return 0;
+		return false;
 	}
-	return 1;
+	return true;
 }
 
-int
+bool
 get_label_geom(const char *disk, struct disklabel *l)
 {
 
-	return get_label(disk, l, DIOCGDINFO);
+	return disk_ioctl(disk, DIOCGDINFO, l);
 }

Reply via email to