diff options
author | nbm <nbm@FreeBSD.org> | 2000-06-23 14:01:06 +0000 |
---|---|---|
committer | nbm <nbm@FreeBSD.org> | 2000-06-23 14:01:06 +0000 |
commit | 0b74e561b2f945cb85409f180e1e43164c2b02b1 (patch) | |
tree | 63667c660ebe620e72b9da2f9e6a7eab5a4acd99 /lib/libdisk/disk.c | |
parent | 50f0a99314ec4285733841fdd944376307b6f57e (diff) | |
download | FreeBSD-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/disk.c')
-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 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++) { |