summaryrefslogtreecommitdiffstats
path: root/lib/libdisk
diff options
context:
space:
mode:
authornbm <nbm@FreeBSD.org>2000-06-23 14:01:06 +0000
committernbm <nbm@FreeBSD.org>2000-06-23 14:01:06 +0000
commit0b74e561b2f945cb85409f180e1e43164c2b02b1 (patch)
tree63667c660ebe620e72b9da2f9e6a7eab5a4acd99 /lib/libdisk
parent50f0a99314ec4285733841fdd944376307b6f57e (diff)
downloadFreeBSD-src-0b74e561b2f945cb85409f180e1e43164c2b02b1.zip
FreeBSD-src-0b74e561b2f945cb85409f180e1e43164c2b02b1.tar.gz
Let Disk_Names() take advantage of the kern.disks sysctl if it's
available. If not, it falls back to the existing hack and slash method. A positive side effect is that non-root users may now use Disk_Names(), for non-dangerous libh/disk.tcl testing. Reviewed by: phk
Diffstat (limited to 'lib/libdisk')
-rw-r--r--lib/libdisk/disk.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c
index f75dcbf..c23c0ed 100644
--- a/lib/libdisk/disk.c
+++ b/lib/libdisk/disk.c
@@ -16,6 +16,7 @@
#include <fcntl.h>
#include <string.h>
#include <err.h>
+#include <sys/sysctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
@@ -457,9 +458,23 @@ Disk_Names()
struct diskslices ds;
int fd;
static char **disks;
+ int error;
+ size_t listsize;
+ char *disklist, **dp;
disks = malloc(sizeof *disks * (1 + MAX_NO_DISKS));
memset(disks,0,sizeof *disks * (1 + MAX_NO_DISKS));
+ error = sysctlbyname("kern.disks", NULL, &listsize, NULL, 0);
+ if (!error) {
+ disklist = (char *)malloc(listsize);
+ error = sysctlbyname("kern.disks", disklist, &listsize, NULL, 0);
+ if (error)
+ err(1, "sysctlbyname(\"kern.disks\") failed");
+ k = 0;
+ for (dp = disks; ((*dp = strsep(&disklist, " ")) != NULL) && k < MAX_NO_DISKS; k++, dp++);
+ return disks;
+ }
+ warn("kern.disks sysctl not available");
k = 0;
for (j = 0; device_list[j]; j++) {
for (i = 0; i < MAX_NO_DISKS; i++) {
OpenPOWER on IntegriCloud