diff options
author | Neil Blakey-Milner <nbm@FreeBSD.org> | 2000-06-23 14:01:06 +0000 |
---|---|---|
committer | Neil Blakey-Milner <nbm@FreeBSD.org> | 2000-06-23 14:01:06 +0000 |
commit | 0138fc17c5a70e8b54ae293fdfd215582df265d8 (patch) | |
tree | 19c1df0217eb9f3601e936a5974f8798b3f415cc /lib/libdisk | |
parent | 16a3f31561eebd73c3ec821b2798b74c48a6ffd6 (diff) | |
download | src-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.c | 15 |
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++) { |