summaryrefslogtreecommitdiffstats
path: root/sbin/camcontrol
diff options
context:
space:
mode:
authorscottl <scottl@FreeBSD.org>2013-12-29 20:48:47 +0000
committerscottl <scottl@FreeBSD.org>2013-12-29 20:48:47 +0000
commit0d338d1a7e159e9f425f9be2b5e5b8ffe9ce2433 (patch)
tree3fea9a33b309716f517761b3b75d028f3680c9a7 /sbin/camcontrol
parenta6fa8f7ccfb7f91fd05c44d5831c87445fab7dc0 (diff)
downloadFreeBSD-src-0d338d1a7e159e9f425f9be2b5e5b8ffe9ce2433.zip
FreeBSD-src-0d338d1a7e159e9f425f9be2b5e5b8ffe9ce2433.tar.gz
Add the '-b' flag to 'camcontrol devlist'. This prints only the existing
buses and their parent sims, useful for creating a sim->bus->device map. Obtained from: Netflix MFC after: 3 days
Diffstat (limited to 'sbin/camcontrol')
-rw-r--r--sbin/camcontrol/camcontrol.85
-rw-r--r--sbin/camcontrol/camcontrol.c34
2 files changed, 31 insertions, 8 deletions
diff --git a/sbin/camcontrol/camcontrol.8 b/sbin/camcontrol/camcontrol.8
index 3b5eafe..856edc4 100644
--- a/sbin/camcontrol/camcontrol.8
+++ b/sbin/camcontrol/camcontrol.8
@@ -41,6 +41,7 @@
.Op command args
.Nm
.Ic devlist
+.Op Fl b
.Op Fl v
.Nm
.Ic periphlist
@@ -361,6 +362,10 @@ With the
.Fl v
argument, SCSI bus number, adapter name and unit numbers are printed as
well.
+On the other hand, with the
+.Fl b
+argument, only the bus adapter, and unit information will be printed, and
+device information will be omitted.
.It Ic periphlist
List all peripheral drivers attached to a given physical device (logical
unit).
diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c
index f3e1011..e96eb0d 100644
--- a/sbin/camcontrol/camcontrol.c
+++ b/sbin/camcontrol/camcontrol.c
@@ -202,7 +202,7 @@ static struct camcontrol_opts option_table[] = {
{"defects", CAM_CMD_READ_DEFECTS, CAM_ARG_NONE, readdefect_opts},
{"defectlist", CAM_CMD_READ_DEFECTS, CAM_ARG_NONE, readdefect_opts},
#endif /* MINIMALISTIC */
- {"devlist", CAM_CMD_DEVTREE, CAM_ARG_NONE, NULL},
+ {"devlist", CAM_CMD_DEVTREE, CAM_ARG_NONE, "-b"},
#ifndef MINIMALISTIC
{"periphlist", CAM_CMD_DEVLIST, CAM_ARG_NONE, NULL},
{"modepage", CAM_CMD_MODE_PAGE, CAM_ARG_NONE, "bdelm:P:"},
@@ -254,7 +254,7 @@ camcontrol_optret getoption(struct camcontrol_opts *table, char *arg,
#ifndef MINIMALISTIC
static int getdevlist(struct cam_device *device);
#endif /* MINIMALISTIC */
-static int getdevtree(void);
+static int getdevtree(int argc, char **argv, char *combinedopt);
#ifndef MINIMALISTIC
static int testunitready(struct cam_device *device, int retry_count,
int timeout, int quiet);
@@ -411,7 +411,7 @@ getdevlist(struct cam_device *device)
#endif /* MINIMALISTIC */
static int
-getdevtree(void)
+getdevtree(int argc, char **argv, char *combinedopt)
{
union ccb ccb;
int bufsize, fd;
@@ -419,6 +419,19 @@ getdevtree(void)
int need_close = 0;
int error = 0;
int skip_device = 0;
+ int busonly = 0;
+ char c;
+
+ while ((c = getopt(argc, argv, combinedopt)) != -1) {
+ switch(c) {
+ case 'b':
+ if ((arglist & CAM_ARG_VERBOSE) == 0)
+ busonly = 1;
+ break;
+ default:
+ break;
+ }
+ }
if ((fd = open(XPT_DEVICE, O_RDWR)) == -1) {
warn("couldn't open %s", XPT_DEVICE);
@@ -478,7 +491,8 @@ getdevtree(void)
* Only print the bus information if the
* user turns on the verbose flag.
*/
- if ((arglist & CAM_ARG_VERBOSE) == 0)
+ if ((busonly == 0) &&
+ (arglist & CAM_ARG_VERBOSE) == 0)
break;
bus_result =
@@ -489,11 +503,12 @@ getdevtree(void)
need_close = 0;
}
- fprintf(stdout, "scbus%d on %s%d bus %d:\n",
+ fprintf(stdout, "scbus%d on %s%d bus %d%s\n",
bus_result->path_id,
bus_result->dev_name,
bus_result->unit_number,
- bus_result->bus_id);
+ bus_result->bus_id,
+ (busonly ? "" : ":"));
break;
}
case DEV_MATCH_DEVICE: {
@@ -501,6 +516,9 @@ getdevtree(void)
char vendor[16], product[48], revision[16];
char fw[5], tmpstr[256];
+ if (busonly == 1)
+ break;
+
dev_result =
&ccb.cdm.matches[i].result.device_result;
@@ -582,7 +600,7 @@ getdevtree(void)
periph_result =
&ccb.cdm.matches[i].result.periph_result;
- if (skip_device != 0)
+ if (busonly || skip_device != 0)
break;
if (need_close > 1)
@@ -8178,7 +8196,7 @@ main(int argc, char **argv)
break;
#endif /* MINIMALISTIC */
case CAM_CMD_DEVTREE:
- error = getdevtree();
+ error = getdevtree(argc, argv, combinedopt);
break;
#ifndef MINIMALISTIC
case CAM_CMD_TUR:
OpenPOWER on IntegriCloud