aboutsummaryrefslogtreecommitdiff
path: root/lib/libdisk
diff options
context:
space:
mode:
authorNeil Blakey-Milner <nbm@FreeBSD.org>2000-06-23 14:01:06 +0000
committerNeil Blakey-Milner <nbm@FreeBSD.org>2000-06-23 14:01:06 +0000
commit0138fc17c5a70e8b54ae293fdfd215582df265d8 (patch)
tree19c1df0217eb9f3601e936a5974f8798b3f415cc /lib/libdisk
parent16a3f31561eebd73c3ec821b2798b74c48a6ffd6 (diff)
downloadsrc-0138fc17c5a70e8b54ae293fdfd215582df265d8.tar.gz
src-0138fc17c5a70e8b54ae293fdfd215582df265d8.zip
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
Notes
Notes: svn path=/head/; revision=62008
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 f75dcbf27673..c23c0ed25152 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++) {