1#!/bin/sh
2#-
3# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4#
5# Copyright (c) 2010 iXsystems, Inc.  All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28# $FreeBSD$
29
30ARGS=$1
31FLAGS_MD=""
32FLAGS_CD=""
33FLAGS_VERBOSE=""
34
35shift
36while [ -n "$1" ]
37do
38  case "$1" in
39    -m)
40      FLAGS_MD=1
41      ;;
42    -v)
43      FLAGS_VERBOSE=1
44      ;;
45    -c)
46      FLAGS_CD=1
47      ;;
48  esac
49  shift
50done
51
52# Create our device listing
53SYSDISK=$(sysctl -n kern.disks)
54if [ -n "${FLAGS_MD}" ]
55then
56  MDS=`mdconfig -l`
57  if [ -n "${MDS}" ]
58  then
59    SYSDISK="${SYSDISK} ${MDS}"
60  fi
61fi
62
63# Add any RAID devices
64if [ -d "/dev/raid" ] ; then
65  cd /dev/raid
66  for i in `ls`
67  do
68      SYSDISK="${SYSDISK} ${i}"
69  done
70fi
71
72# Now loop through these devices, and list the disk drives
73for i in ${SYSDISK}
74do
75
76  # Get the current device
77  DEV="${i}"
78
79  # Make sure we don't find any cd devices
80  if [ -z "${FLAGS_CD}" ]
81  then
82    case "${DEV}" in
83      acd[0-9]*|cd[0-9]*|scd[0-9]*) continue ;;
84    esac
85  fi
86
87  # Try and get some identification information from GEOM
88  NEWLINE=$(geom disk list $DEV 2>/dev/null | sed -ne 's/^   descr: *//p')
89  if [ -z "$NEWLINE" ]; then
90    	NEWLINE=" <Unknown Device>"
91  fi
92
93  if [ -n "${FLAGS_MD}" ] && echo "${DEV}" | grep -E '^md[0-9]+' >/dev/null 2>/dev/null
94  then
95	NEWLINE=" <Memory Disk>"
96  fi
97
98  if [ -n "${FLAGS_VERBOSE}" ]
99  then
100	:
101  fi
102
103  # Save the disk list
104  if [ ! -z "$DLIST" ]
105  then
106    DLIST="\n${DLIST}"
107  fi
108
109  DLIST="${DEV}:${NEWLINE}${DLIST}"
110
111done
112
113# Echo out the found line
114echo -e "$DLIST" | sort
115