Module Name: src
Committed By: christos
Date: Sat Apr 27 17:12:37 UTC 2013
Modified Files:
src/sbin/ccdconfig: Makefile ccdconfig.8 ccdconfig.c
Log Message:
one less kvm groveller. Use sysctl to get ccd info.
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sbin/ccdconfig/Makefile
cvs rdiff -u -r1.25 -r1.26 src/sbin/ccdconfig/ccdconfig.8
cvs rdiff -u -r1.51 -r1.52 src/sbin/ccdconfig/ccdconfig.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/ccdconfig/Makefile
diff -u src/sbin/ccdconfig/Makefile:1.8 src/sbin/ccdconfig/Makefile:1.9
--- src/sbin/ccdconfig/Makefile:1.8 Mon May 28 08:06:22 2007
+++ src/sbin/ccdconfig/Makefile Sat Apr 27 13:12:36 2013
@@ -1,14 +1,11 @@
-# $NetBSD: Makefile,v 1.8 2007/05/28 12:06:22 tls Exp $
+# $NetBSD: Makefile,v 1.9 2013/04/27 17:12:36 christos Exp $
USE_FORT?=yes # setgid
PROG= ccdconfig
MAN= ccdconfig.8 ccd.conf.5
-BINGRP= kmem
-BINMODE=2555
-
-DPADD= ${LIBKVM} ${LIBUTIL}
-LDADD= -lkvm -lutil
+DPADD= ${LIBUTIL}
+LDADD= -lutil
.include <bsd.prog.mk>
Index: src/sbin/ccdconfig/ccdconfig.8
diff -u src/sbin/ccdconfig/ccdconfig.8:1.25 src/sbin/ccdconfig/ccdconfig.8:1.26
--- src/sbin/ccdconfig/ccdconfig.8:1.25 Fri Aug 21 20:14:21 2009
+++ src/sbin/ccdconfig/ccdconfig.8 Sat Apr 27 13:12:36 2013
@@ -1,4 +1,4 @@
-.\" $NetBSD: ccdconfig.8,v 1.25 2009/08/22 00:14:21 joerg Exp $
+.\" $NetBSD: ccdconfig.8,v 1.26 2013/04/27 17:12:36 christos Exp $
.\"
.\" Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -56,8 +56,6 @@
.Op Fl f Ar config_file
.Nm
.Fl g
-.Op Fl M Ar core
-.Op Fl N Ar system
.Oo
.Ar ccd Oo ...
.Oc
@@ -87,16 +85,6 @@ Dump the current ccd configuration in a
for use as the ccd configuration file.
If no arguments are specified, every configured ccd is dumped.
Otherwise, the configuration of each listed ccd is dumped.
-.It Fl M Ar core
-Extract values associated with the name list from
-.Pa core
-instead of the default
-.Pa /dev/mem .
-.It Fl N Ar system
-Extract the name list from
-.Pa system
-instead of the default
-.Pa /netbsd .
.It Fl u
Unconfigure a ccd.
.It Fl U
Index: src/sbin/ccdconfig/ccdconfig.c
diff -u src/sbin/ccdconfig/ccdconfig.c:1.51 src/sbin/ccdconfig/ccdconfig.c:1.52
--- src/sbin/ccdconfig/ccdconfig.c:1.51 Sat Aug 27 12:29:51 2011
+++ src/sbin/ccdconfig/ccdconfig.c Sat Apr 27 13:12:36 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: ccdconfig.c,v 1.51 2011/08/27 16:29:51 joerg Exp $ */
+/* $NetBSD: ccdconfig.c,v 1.52 2013/04/27 17:12:36 christos Exp $ */
/*-
* Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1996, 1997\
The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: ccdconfig.c,v 1.51 2011/08/27 16:29:51 joerg Exp $");
+__RCSID("$NetBSD: ccdconfig.c,v 1.52 2013/04/27 17:12:36 christos Exp $");
#endif
#include <sys/param.h>
@@ -46,7 +46,6 @@ __RCSID("$NetBSD: ccdconfig.c,v 1.51 201
#include <err.h>
#include <errno.h>
#include <fcntl.h>
-#include <kvm.h>
#include <limits.h>
#include <nlist.h>
#include <stdio.h>
@@ -65,9 +64,6 @@ static gid_t egid;
static int verbose;
static const char *ccdconf = _PATH_CCDCONF;
-static char *core;
-static char *kernel;
-
static struct flagval {
const char *fv_flag;
int fv_val;
@@ -77,16 +73,6 @@ static struct flagval {
{ NULL, 0 },
};
-static struct nlist nl[] = {
- { .n_name = "_ccd_softc" },
-#define SYM_CCDSOFTC 0
- { .n_name = "_numccd" },
-#define SYM_NUMCCD 1
- { .n_name = "_ccd_softc_elemsize" },
-#define SYM_CCDSOFTCELEMSIZE 2
- { .n_name = NULL },
-};
-
#define CCD_CONFIG 0 /* configure a device */
#define CCD_CONFIGALL 1 /* configure all devices */
#define CCD_UNCONFIG 2 /* unconfigure a device */
@@ -100,7 +86,6 @@ static int do_all(int);
static int dump_ccd(int, char **, int);
static int flags_to_val(char *);
static int pathtounit(char *, int *);
-static void print_ccd_info(struct ccd_softc *, kvm_t *);
static char *resolve_ccdname(char *);
__dead static void usage(void);
@@ -111,7 +96,7 @@ main(int argc, char *argv[])
egid = getegid();
setegid(getgid());
- while ((ch = getopt(argc, argv, "cCf:gM:N:uUv")) != -1) {
+ while ((ch = getopt(argc, argv, "cCf:guUv")) != -1) {
switch (ch) {
case 'c':
action = CCD_CONFIG;
@@ -131,14 +116,6 @@ main(int argc, char *argv[])
action = CCD_DUMP;
break;
- case 'M':
- core = optarg;
- break;
-
- case 'N':
- kernel = optarg;
- break;
-
case 'u':
action = CCD_UNCONFIG;
++options;
@@ -163,17 +140,6 @@ main(int argc, char *argv[])
if (options > 1)
usage();
- /*
- * Discard setgid privileges. If not the running kernel, we toss
- * them away totally so that bad guys can't print interesting stuff
- * from kernel memory, otherwise switch back to kmem for the
- * duration of the kvm_openfiles() call.
- *
- * We also do this if we aren't just looking...
- */
- if (core != NULL || kernel != NULL || action != CCD_DUMP)
- setgid(getgid());
-
switch (action) {
case CCD_CONFIG:
case CCD_UNCONFIG:
@@ -268,12 +234,7 @@ do_single(int argc, char **argv, int act
}
/* Next is the list of disks to make the ccd from. */
- disks = malloc(argc * sizeof(char *));
- if (disks == NULL) {
- warnx("no memory to configure ccd");
- free(ccd);
- return (1);
- }
+ disks = emalloc(argc * sizeof(char *));
for (ui = 0; argc != 0; ) {
cp = *argv++; --argc;
if ((j = checkdev(cp)) == 0)
@@ -353,11 +314,7 @@ do_all(int action)
if (vp == NULL)
continue;
- if ((nargv = realloc(argv,
- sizeof(char *) * (argc + 1))) == NULL) {
- warnx("no memory to configure ccds");
- return (1);
- }
+ nargv = erealloc(argv, sizeof(char *) * (argc + 1));
argv = nargv;
argc++;
argv[argc - 1] = vp;
@@ -428,7 +385,7 @@ resolve_ccdname(char *name)
if (name[0] == '/' || name[0] == '.') {
/* Assume they gave the correct pathname. */
- return (strdup(name));
+ return estrdup(name);
}
len = strlen(name);
@@ -436,14 +393,12 @@ resolve_ccdname(char *name)
if (isdigit((unsigned char)c)) {
if ((rawpart = getrawpartition()) < 0)
- return (NULL);
- if (asprintf(&path, "/dev/%s%c", name, 'a' + rawpart) < 0)
- return (NULL);
+ return NULL;
+ easprintf(&path, "/dev/%s%c", name, 'a' + rawpart);
} else
- if (asprintf(&path, "/dev/%s", name) < 0)
- return (NULL);
+ easprintf(&path, "/dev/%s", name);
- return (path);
+ return path;
}
static int
@@ -479,188 +434,125 @@ do_io(char *path, u_long cmd, struct ccd
return (0);
}
-#define KVM_ABORT(kd, str) { \
- (void)kvm_close((kd)); \
- warnx("%s", (str)); \
- warnx("%s", kvm_geterr((kd))); \
- return (1); \
-}
-
-static int
-dump_ccd(int argc, char **argv, int action)
+static void
+print_ccd_info(int u, struct ccddiskinfo *ccd, char *str)
{
- char errbuf[_POSIX2_LINE_MAX], *ccd, *cp;
- struct ccd_softc *cs, *kcs;
- void *vcs;
- size_t readsize;
- int i, error, numccd, ccd_softc_elemsize, numconfiged = 0;
- kvm_t *kd;
-
- memset(errbuf, 0, sizeof(errbuf));
+ static int header_printed = 0;
- vcs = NULL;
- (void)setegid(egid);
- if ((kd = kvm_openfiles(kernel, core, NULL, O_RDONLY,
- errbuf)) == NULL) {
- warnx("can't open kvm: %s", errbuf);
- return (1);
+ if (header_printed == 0 && verbose) {
+ printf("# ccd\t\tileave\tflags\t\tsize\tcomponent devices\n");
+ header_printed = 1;
}
- (void)setgid(getgid());
- if (kvm_nlist(kd, nl))
- KVM_ABORT(kd, "ccd-related symbols not available");
-
- /* Check to see how many ccds are currently configured. */
- if (kvm_read(kd, nl[SYM_NUMCCD].n_value, (void *)&numccd,
- sizeof(numccd)) != sizeof(numccd))
- KVM_ABORT(kd, "can't determine number of configured ccds");
+ /* Dump out softc information. */
+ printf("ccd%d\t\t%d\t0x%x\t%zu\t", u, ccd->ccd_ileave,
+ ccd->ccd_flags & CCDF_USERMASK, ccd->ccd_size * DEV_BSIZE);
- if (numccd == 0) {
- printf("ccd driver in kernel, but is uninitialized\n");
- goto done;
+ /* Read component pathname and display component info. */
+ for (size_t i = 0; i < ccd->ccd_ndisks; ++i) {
+ fputs(str, stdout);
+ fputc((i + 1 < ccd->ccd_ndisks) ? ' ' : '\n', stdout);
+ str += strlen(str) + 1;
}
+ fflush(stdout);
+}
- if (kvm_read(kd, nl[SYM_CCDSOFTCELEMSIZE].n_value,
- (void *)&ccd_softc_elemsize, sizeof(ccd_softc_elemsize))
- != sizeof(ccd_softc_elemsize))
- KVM_ABORT(kd, "can't determine size of ccd_softc");
+static int
+printccdinfo(int u)
+{
+ struct ccddiskinfo ccd;
+ size_t s = sizeof(ccd);
+ size_t len;
+ const char *str;
- /* Allocate space for the kernel's configuration data. */
- readsize = numccd * ccd_softc_elemsize;
- if ((vcs = malloc(readsize)) == NULL) {
- warnx("no memory for configuration data");
- goto bad;
+ if (sysctlbyname(str = "kern.ccd.info", &ccd, &s, &u, sizeof(u))
+ == -1) {
+ if (errno == ENOENT)
+ warnx("ccd unit %d not configured", u);
+ else
+ warn("error getting %s for ccd%d", str, u);
+ return 1;
}
- memset(vcs, 0, readsize);
- /*
- * Read the ccd configuration data from the kernel.
- * The kernel's ccd_softc is larger than userland's
- * (the former contains extra structure members at
- * the end of the structure), so read the kernel
- * ccd_softcs into a temporary buffer and convert
- * into userland ccd_softcs.
- */
- if (kvm_read(kd, nl[SYM_CCDSOFTC].n_value, (void *)&kcs,
- sizeof(kcs)) != sizeof(kcs)) {
- free(vcs);
- KVM_ABORT(kd, "can't find pointer to configuration data");
- }
- if ((size_t)kvm_read(kd, (u_long)kcs, vcs, readsize) != readsize) {
- free(vcs);
- KVM_ABORT(kd, "can't read configuration data");
- }
-
- if ((cs = calloc(numccd, sizeof(struct ccd_softc))) == NULL) {
- warnx("no memory for configuration data");
- free(vcs);
- goto bad;
- }
- for (i = 0; i < numccd; i++) {
- memcpy(&cs[i], (char *)vcs + i * ccd_softc_elemsize,
- sizeof(struct ccd_softc));
- }
- free(vcs);
+ if (sysctlbyname(str = "kern.ccd.components", NULL, &len, &u, sizeof(u))
+ == -1) {
+ warn("Error getting %s for ccd%d", str, u);
+ return 1;
+ }
+
+ char *names;
+ names = emalloc(len);
+ if (sysctlbyname(str = "kern.ccd.components", names, &len, &u,
+ sizeof(u)) == -1) {
+ warn("error getting %s for ccd%d", str, u);
+ free(names);
+ return 1;
+ }
+ print_ccd_info(u, &ccd, names);
+ free(names);
+ return 0;
+}
- /* Dump ccd configuration to stdout. */
+static int
+dump_ccd(int argc, char **argv, int action)
+{
+ const char *sys;
+ int errs = 0;
if (argc == 0) {
- for (i = 0; i < numccd; ++i)
- if (cs[i].sc_flags & CCDF_INITED) {
- ++numconfiged;
- print_ccd_info(&cs[i], kd);
+ int *units;
+ size_t nunits = 0;
+ if (sysctlbyname(sys = "kern.ccd.units", NULL, &nunits, NULL, 0)
+ == -1) {
+ switch (errno) {
+ case ENOENT:
+ warnx("no ccd driver in the kernel");
+ return 1;
+ case ENOMEM:
+ break;
+ default:
+ err(EXIT_FAILURE, "1 error getting %s", sys);
}
+ }
- if (numconfiged == 0)
- printf("# no concatenated disks configured\n");
- } else {
- while (argc) {
- cp = *argv++; --argc;
- if ((ccd = resolve_ccdname(cp)) == NULL) {
- warnx("invalid ccd name: %s", cp);
- continue;
- }
- if ((error = pathtounit(ccd, &i)) != 0) {
- warn("%s", ccd);
- free(ccd);
- continue;
- }
- if (i >= numccd) {
- warnx("ccd%d not configured", i);
- free(ccd);
- continue;
- }
- if (cs[i].sc_flags & CCDF_INITED)
- print_ccd_info(&cs[i], kd);
- else
- printf("# ccd%d not configured\n", i);
+ if (nunits == 0) {
+ warnx("no concatenated disks configured");
+ return 1;
+ }
+
+ units = emalloc(nunits);
+
+ if (sysctlbyname(sys, units, &nunits, NULL, 0) == -1)
+ err(EXIT_FAILURE, "2 error getting %s", sys);
+ nunits /= sizeof(*units);
+ for (size_t i = 0; i < nunits; i++)
+ errs += printccdinfo(units[i]);
+ free(units);
+ return errs;
+ }
+
+ /* Dump ccd configuration to stdout. */
+ while (argc) {
+ int i;
+ int error;
+ char *cp = *argv++; --argc;
+ char *ccd;
+
+ if ((ccd = resolve_ccdname(cp)) == NULL) {
+ warnx("invalid ccd name: %s", cp);
+ errs++;
+ continue;
+ }
+ if ((error = pathtounit(ccd, &i)) != 0) {
+ warn("%s", ccd);
free(ccd);
+ errs++;
+ continue;
}
+ errs += printccdinfo(i);
}
-
- free(cs);
-
- done:
- (void)kvm_close(kd);
- return (0);
-
- bad:
- (void)kvm_close(kd);
- return (1);
+ return errs;
}
-static void
-print_ccd_info(struct ccd_softc *cs, kvm_t *kd)
-{
- static int header_printed = 0;
- struct ccdcinfo *cip;
- size_t readsize;
- char path[MAXPATHLEN];
- unsigned int i;
-
- if (header_printed == 0 && verbose) {
- printf("# ccd\t\tileave\tflags\tcompnent devices\n");
- header_printed = 1;
- }
-
- readsize = cs->sc_nccdisks * sizeof(struct ccdcinfo);
- if ((cip = malloc(readsize)) == NULL) {
- warn("%s: can't allocate memory for component info",
- cs->sc_xname);
- return;
- }
- memset(cip, 0, readsize);
-
- /* Dump out softc information. */
- printf("%s\t\t%d\t%d\t", cs->sc_xname, cs->sc_ileave,
- cs->sc_flags & CCDF_USERMASK);
- fflush(stdout);
-
- /* Read in the component info. */
- if ((size_t)kvm_read(kd, (u_long)cs->sc_cinfo, (void *)cip,
- readsize) != readsize) {
- printf("\n");
- warnx("can't read component info");
- warnx("%s", kvm_geterr(kd));
- goto done;
- }
-
- /* Read component pathname and display component info. */
- for (i = 0; i < cs->sc_nccdisks; ++i) {
- if ((size_t)kvm_read(kd, (u_long)cip[i].ci_path, (void *)path,
- cip[i].ci_pathlen) != cip[i].ci_pathlen) {
- printf("\n");
- warnx("can't read component pathname");
- warnx("%s", kvm_geterr(kd));
- goto done;
- }
- fputs(path, stdout);
- fputc((i + 1 < cs->sc_nccdisks) ? ' ' : '\n', stdout);
- fflush(stdout);
- }
-
- done:
- free(cip);
-}
static int
flags_to_val(char *flags)
@@ -680,8 +572,7 @@ flags_to_val(char *flags)
flagslen = strlen(flags);
/* Check for values represented by strings. */
- if ((cp = strdup(flags)) == NULL)
- err(1, "no memory to parse flags");
+ cp = estrdup(flags);
tmp = 0;
for (tok = cp; (tok = strtok(tok, ",")) != NULL; tok = NULL) {
for (i = 0; flagvaltab[i].fv_flag != NULL; ++i)
@@ -730,7 +621,7 @@ usage(void)
fprintf(stderr, " %s -C [-v] [-f config_file]\n", progname);
fprintf(stderr, " %s -u [-v] ccd [...]\n", progname);
fprintf(stderr, " %s -U [-v] [-f config_file]\n", progname);
- fprintf(stderr, " %s -g [-M core] [-N system] [ccd [...]]\n",
+ fprintf(stderr, " %s -g [ccd [...]]\n",
progname);
exit(1);
}