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);
}