From c656fc32fc772c72b23db32b322f4efe0b2be414 Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 17 Jan 2003 13:23:41 +0000 Subject: [PATCH] Fix various details so we get to WARNS=3. Center operation on unit number rather than path name. --- sbin/ccdconfig/Makefile | 2 +- sbin/ccdconfig/ccdconfig.c | 114 +++++++++++-------------------------- 2 files changed, 33 insertions(+), 83 deletions(-) diff --git a/sbin/ccdconfig/Makefile b/sbin/ccdconfig/Makefile index 811a5aae2965..cb2bc74eecb9 100644 --- a/sbin/ccdconfig/Makefile +++ b/sbin/ccdconfig/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ PROG= ccdconfig -WARNS= 0 +WARNS?= 3 MAN= ccdconfig.8 .include diff --git a/sbin/ccdconfig/ccdconfig.c b/sbin/ccdconfig/ccdconfig.c index 3e27f02c5e41..290839951606 100644 --- a/sbin/ccdconfig/ccdconfig.c +++ b/sbin/ccdconfig/ccdconfig.c @@ -60,10 +60,10 @@ static const char rcsid[] = static int lineno = 0; static int verbose = 0; -static char *ccdconf = _PATH_CCDCONF; +static const char *ccdconf = _PATH_CCDCONF; struct flagval { - char *fv_flag; + const char *fv_flag; int fv_val; } flagvaltab[] = { { "CCDF_UNIFORM", CCDF_UNIFORM }, @@ -78,15 +78,13 @@ struct flagval { #define CCD_DUMP 4 /* dump a ccd's configuration */ static int checkdev(char *); -static int do_io(char *, u_long, struct ccd_ioctl *); +static int do_io(int, u_long, struct ccd_ioctl *); static int do_single(int, char **, int); static int do_all(int); static int dump_ccd(int, char **); -static int getmaxpartitions(void); -static int getrawpartition(void); static int flags_to_val(char *); static void print_ccd_info(struct ccd_s *); -static char *resolve_ccdname(char *); +static int resolve_ccdname(char *); static void usage(void); int @@ -167,8 +165,9 @@ static int do_single(int argc, char **argv, int action) { struct ccd_ioctl ccio; - char *ccd, *cp, *cp2, **disks; - int noflags = 0, i, ileave, flags = 0, j; + char *cp, *cp2, **disks; + int ccd, noflags = 0, i, ileave, flags = 0, j; + u_int u; bzero(&ccio, sizeof(ccio)); @@ -261,14 +260,14 @@ do_single(int argc, char **argv, int action) if (verbose) { printf("ccd%d: %d components ", ccio.ccio_unit, ccio.ccio_ndisks); - for (i = 0; i < ccio.ccio_ndisks; ++i) { - if ((cp2 = strrchr(disks[i], '/')) != NULL) + for (u = 0; u < ccio.ccio_ndisks; ++u) { + if ((cp2 = strrchr(disks[u], '/')) != NULL) ++cp2; else - cp2 = disks[i]; + cp2 = disks[u]; printf("%c%s%c", - i == 0 ? '(' : ' ', cp2, - i == ccio.ccio_ndisks - 1 ? ')' : ','); + u == 0 ? '(' : ' ', cp2, + u == ccio.ccio_ndisks - 1 ? ')' : ','); } printf(", %lu blocks ", (u_long)ccio.ccio_size); if (ccio.ccio_ileave != 0) @@ -360,62 +359,27 @@ checkdev(char *path) } static int -pathtounit(char *path, int *unitp) -{ - struct stat st; - int maxpartitions; - - if (stat(path, &st) != 0) - return (errno); - - if (!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode)) - return (EINVAL); - - if ((maxpartitions = getmaxpartitions()) < 0) - return (errno); - - *unitp = minor(st.st_rdev) / maxpartitions; - - return (0); -} - -static char * resolve_ccdname(char *name) { - char c, *path; - size_t len, newlen; - int rawpart; - if (name[0] == '/' || name[0] == '.') { - /* Assume they gave the correct pathname. */ - return (strdup(name)); - } - - len = strlen(name); - c = name[len - 1]; - - newlen = len + 8; - if ((path = malloc(newlen)) == NULL) - return (NULL); - bzero(path, newlen); - - if (isdigit(c)) { - if ((rawpart = getrawpartition()) < 0) { - free(path); - return (NULL); - } - (void)sprintf(path, "%s%s%c", _PATH_DEV, name, 'a' + rawpart); - } else - (void)sprintf(path, "%s%s", _PATH_DEV, name); - - return (path); + if (!strncmp(name, _PATH_DEV, strlen(_PATH_DEV))) + name += strlen(_PATH_DEV); + if (strncmp(name, "ccd", 3)) + return -1; + name += 3; + if (!isdigit(*name)) + return -1; + return (strtoul(name, NULL, 10)); } static int -do_io(char *path, u_long cmd, struct ccd_ioctl *cciop) +do_io(int unit, u_long cmd, struct ccd_ioctl *cciop) { int fd; char *cp; + char *path; + + asprintf(&path, "%sccd%dc", _PATH_DEV, unit); if ((fd = open(path, O_RDWR, 0640)) < 0) { warn("open: %s", path); @@ -453,15 +417,16 @@ do_io(char *path, u_long cmd, struct ccd_ioctl *cciop) static int dump_ccd(int argc, char **argv) { - char *ccd, *cp; + char *cp; int i, error, numccd, numconfiged = 0; struct ccdconf conf; + int ccd; /* * Read the ccd configuration data from the kernel and dump * it to stdout. */ - if ((ccd = resolve_ccdname("ccd0")) == NULL) { /* XXX */ + if ((ccd = resolve_ccdname("ccd0")) < 0) { /* XXX */ warnx("invalid ccd name: %s", cp); return (1); } @@ -489,17 +454,13 @@ dump_ccd(int argc, char **argv) } else { while (argc) { cp = *argv++; --argc; - if ((ccd = resolve_ccdname(cp)) == NULL) { + if ((ccd = resolve_ccdname(cp)) < 0) { warnx("invalid ccd name: %s", cp); continue; } - if ((error = pathtounit(ccd, &numccd)) != 0) { - warnx("%s: %s", ccd, strerror(error)); - continue; - } error = 1; for (i = 0; i < numconfiged; i++) { - if (conf.buffer[i].sc_unit == numccd) { + if (conf.buffer[i].sc_unit == ccd) { print_ccd_info(&(conf.buffer[i])); error = 0; break; @@ -518,9 +479,10 @@ dump_ccd(int argc, char **argv) static void print_ccd_info(struct ccd_s *cs) { - char *cp, *ccd; + char *cp; static int header_printed = 0; struct ccdcpps cpps; + int ccd; /* Print out header if necessary*/ if (header_printed == 0 && verbose) { @@ -543,7 +505,7 @@ print_ccd_info(struct ccd_s *cs) return; } - if ((ccd = resolve_ccdname(cp)) == NULL) { + if ((ccd = resolve_ccdname(cp)) < 0) { printf("\n"); warnx("can't read component info: invalid ccd name: %s", cp); return; @@ -576,18 +538,6 @@ print_ccd_info(struct ccd_s *cs) return; } -static int -getmaxpartitions(void) -{ - return (MAXPARTITIONS); -} - -static int -getrawpartition(void) -{ - return (RAW_PART); -} - static int flags_to_val(char *flags) {