NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Subject: Re: bin/59861
The following reply was made to PR bin/59861; it has been noted by GNATS.
From: ssszcmawo <ssszcmawo%proton.me@localhost>
To: "gnats-bugs%NetBSD.org@localhost" <gnats-bugs%NetBSD.org@localhost>
Cc:
Subject: Subject: Re: bin/59861
Date: Sat, 14 Feb 2026 20:54:22 +0000
This patch fixes the output of dump_ccd and implements
a new function to print all ccd information, including size
and support for the -v flag.=20
>From a4f67cfad979d3978214bcc1c39f260dd5a95e5d Mon Sep 17 00:00:00 2001
From: ssszcmawo <belan2470%gmail.com@localhost>
Date: Sat, 14 Feb 2026 21:03:45 +0100
Subject: [PATCH 1/2] removed size from output,renamed print functions to du=
mp
---
sbin/ccdconfig/ccdconfig.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/sbin/ccdconfig/ccdconfig.c b/sbin/ccdconfig/ccdconfig.c
index ba05c3596..a812e7ab9 100644
--- a/sbin/ccdconfig/ccdconfig.c
+++ b/sbin/ccdconfig/ccdconfig.c
@@ -461,19 +461,18 @@ do_io(char *path, u_long cmd, struct ccd_ioctl *cciop=
)
}
=20
static void
-print_ccd_info(int u, struct ccddiskinfo *ccd, char *str)
+print_dumped_info(int u, struct ccddiskinfo *ccd, char *str)
{
=09static int header_printed =3D 0;
=20
=09if (header_printed =3D=3D 0 && verbose) {
-=09=09printf("# ccd\t\tileave\tflags\t\tsize\tcomponent devices\n");
+=09=09printf("# ccd\t\tileave\tflags\tcomponent devices\n");
=09=09header_printed =3D 1;
=09}
=20
=09/* Dump out softc information. */
=09printf("ccd%d\t\t%d\t0x%x\t%ju\t", u, ccd->ccd_ileave,
-=09 ccd->ccd_flags & CCDF_USERMASK,
-=09 (uintmax_t)ccd->ccd_size * DEV_BSIZE);
+=09 ccd->ccd_flags & CCDF_USERMASK);
=20
=09/* Read component pathname and display component info. */
=09for (size_t i =3D 0; i < ccd->ccd_ndisks; ++i) {
@@ -485,7 +484,7 @@ print_ccd_info(int u, struct ccddiskinfo *ccd, char *st=
r)
}
=20
static int
-printccdinfo(int u)
+dumpccdinfo(int u)
{
=09struct ccddiskinfo ccd;
=09size_t s =3D sizeof(ccd);
@@ -515,7 +514,7 @@ printccdinfo(int u)
=09=09free(names);
=09=09return 1;
=09}
-=09print_ccd_info(u, &ccd, names);
+=09print_dumped_info(u, &ccd, names);
=09free(names);
=09return 0;
}
@@ -552,7 +551,7 @@ dump_ccd(int argc, char **argv, int action)
=09=09=09err(EXIT_FAILURE, "2 error getting %s", sys);
=09=09nunits /=3D sizeof(*units);
=09=09for (size_t i =3D 0; i < nunits; i++)
-=09=09=09errs +=3D printccdinfo(units[i]);
+=09=09=09errs +=3D dumpccdinfo(units[i]);
=09=09free(units);
=09=09return errs;
=09}
@@ -575,7 +574,7 @@ dump_ccd(int argc, char **argv, int action)
=09=09=09errs++;
=09=09=09continue;
=09=09}
-=09=09errs +=3D printccdinfo(i);
+=09=09errs +=3D dumpccdinfo(i);
=09=09free(ccd);
=09}
=09return errs;
--=20
2.47.3
>From 5720aec21f59b2e5db68a09743f997f0901c5bec Mon Sep 17 00:00:00 2001
From: ssszcmawo <belan2470%gmail.com@localhost>
Date: Sat, 14 Feb 2026 21:31:25 +0100
Subject: [PATCH 2/2] added get_ccd_info and print_ccd_info functions
---
sbin/ccdconfig/ccdconfig.c | 148 ++++++++++++++++++++++++++++++++++++-
1 file changed, 145 insertions(+), 3 deletions(-)
diff --git a/sbin/ccdconfig/ccdconfig.c b/sbin/ccdconfig/ccdconfig.c
index a812e7ab9..bce852e5b 100644
--- a/sbin/ccdconfig/ccdconfig.c
+++ b/sbin/ccdconfig/ccdconfig.c
@@ -78,12 +78,14 @@ static struct=09flagval {
#define CCD_UNCONFIG=09=092=09/* unconfigure a device */
#define CCD_UNCONFIGALL=09=093=09/* unconfigure all devices */
#define CCD_DUMP=09=094=09/* dump a ccd's configuration */
+#define CCD_PRINT_INFO=09=095=09/* print ccd configuration info */
=20
static=09int checkdev(char *);
static=09int do_io(char *, u_long, struct ccd_ioctl *);
static=09int do_single(int, char **, int);
static=09int do_all(int);
static=09int dump_ccd(int, char **, int);
+static int print_ccd_info(int, char**, int);
static=09int flags_to_val(char *);
static=09int pathtounit(char *, int *);
static=09char *resolve_ccdname(char *);
@@ -96,7 +98,7 @@ main(int argc, char *argv[])
=20
=09egid =3D getegid();
=09setegid(getgid());
-=09while ((ch =3D getopt(argc, argv, "cCf:guUv")) !=3D -1) {
+=09while ((ch =3D getopt(argc, argv, "cCf:gpuUv")) !=3D -1) {
=09=09switch (ch) {
=09=09case 'c':
=09=09=09action =3D CCD_CONFIG;
@@ -112,7 +114,12 @@ main(int argc, char *argv[])
=09=09=09ccdconf =3D optarg;
=09=09=09break;
=20
-=09=09case 'g':
+=09=09case 'p':
+=09=09=09action =3D CCD_PRINT_INFO;
+=09=09=09++options;
+=09=09=09break;
+
+ =09=09case 'g':
=09=09=09action =3D CCD_DUMP;
=09=09=09break;
=20
@@ -145,6 +152,8 @@ main(int argc, char *argv[])
=09=09case CCD_UNCONFIG:
=09=09=09exit(do_single(argc, argv, action));
=09=09=09/* NOTREACHED */
+=09=09case CCD_PRINT_INFO:
+=09=09=09exit(print_ccd_info(argc, argv, action));
=20
=09=09case CCD_CONFIGALL:
=09=09case CCD_UNCONFIGALL:
@@ -471,7 +480,7 @@ print_dumped_info(int u, struct ccddiskinfo *ccd, char =
*str)
=09}
=20
=09/* Dump out softc information. */
-=09printf("ccd%d\t\t%d\t0x%x\t%ju\t", u, ccd->ccd_ileave,
+=09printf("ccd%d\t\t%d\t0x%x\t", u, ccd->ccd_ileave,
=09 ccd->ccd_flags & CCDF_USERMASK);
=20
=09/* Read component pathname and display component info. */
@@ -580,6 +589,139 @@ dump_ccd(int argc, char **argv, int action)
=09return errs;
}
=20
+static int
+get_ccd_info(int u)
+{
+ struct ccddiskinfo ccd;
+ size_t s =3D sizeof(ccd);
+ const char* str;
+ size_t len;
+
+ if (verbose)
+ {
+=09static int header_printed =3D 0;
+=09if (!header_printed)
+=09{
+=09 printf("# ccd\t\tileave\tflags\tsize\tcomponent devices\n");
+=09 header_printed =3D 1;
+=09}
+ }
+
+ if (sysctlbyname(str =3D "kern.ccd.info",&ccd,&s,&u,sizeof(u)) =3D=3D
+=09 -1)
+ {
+=09if (errno =3D=3D ENOENT)
+=09 warnx("ccd unit %d is not configured",u);
+=09else
+=09 warn("cannot get %s for ccd%d",str,u);
+=09return 1;
+=09
+ }
+
+ if (sysctlbyname(str =3D "kern.ccd.components",NULL,&len,&u,sizeof(u))
+=09 =3D=3D -1)
+ {
+=09warnx("error getting %s for ccd%d",str,u);
+=09return 1;
+ }
+
+ char* comp =3D emalloc(len);
+ if (sysctlbyname(str,comp,&len,&u,sizeof(u)) =3D=3D -1)
+ {
+=09warnx("error getting %s for ccd%d",str,u);
+=09free(comp);
+=09return 1;
+ }
+
+ printf("ccd%d\t\t%d\t0x%x\t%ju\t", u, ccd.ccd_ileave,
+ ccd.ccd_flags & CCDF_USERMASK, (uintmax_t)ccd.ccd_size);
+
+ char* p =3D comp;
+ for (size_t j =3D 0; j < ccd.ccd_ndisks; ++j)
+ {
+=09fputs(p, stdout);
+ fputc((j + 1 < ccd.ccd_ndisks) ? ' ' : '\n', stdout);
+ p +=3D strlen(p) + 1;
+ }
+
+ free(comp);
+ return 0;
+}
+
+static int=20
+print_ccd_info(int argc, char** argv, int action)
+{
+ int errs =3D 0;
+ const char* sys;=20
+
+ if (argc =3D=3D 0)
+ {
+=09size_t nunits =3D 0;
+=09if (sysctlbyname(sys =3D "kern.ccd.units", NULL, &nunits, NULL, 0)
+=09 =3D=3D -1)
+=09{
+=09 switch(errno)
+=09 {
+=09=09case ENOENT:
+=09=09 warnx("no ccd driver in the kernel");
+=09=09 return 1;
+=09=09case ENOMEM:
+=09=09 break;
+=09=09default:
+=09=09 err(EXIT_FAILURE,"error getting %s",sys);
+=09 }
+=09}
+
+=09if (nunits =3D=3D 0)
+=09{
+=09 warnx("no concatenated disks configured");
+=09 return 1;
+=09}
+
+=09int *units =3D emalloc(nunits);
+
+=09if (sysctlbyname(sys,units,&nunits,NULL,0) =3D=3D -1)
+=09 err(EXIT_FAILURE, "error getting %s",sys);
+
+=09nunits /=3D sizeof(*units);
+
+=09for (size_t i =3D 0; i < nunits; i++)
+=09{=20
+=09 errs +=3D get_ccd_info(units[i]);
+=09}
+
+=09free(units);
+=09return errs;=09
+ }
+
+ while(argc)
+ {
+=09char* cp =3D *argv++; --argc;=09=09
+=09char* ccd_path;
+=09int unit;
+=09int error;=09
+
+=09if((ccd_path =3D resolve_ccdname(cp)) =3D=3D NULL)
+=09{
+=09 warnx("invalid ccd name %s",cp);
+=09 errs++;
+=09 continue;
+=09}
+
+=09if((error =3D pathtounit(ccd_path,&unit)) !=3D 0)
+=09{
+=09 warnx("%s: cannot get unit", ccd_path);=20
+=09 free(ccd_path);
+=09 errs++;
+=09 continue;
+=09}
+
+=09errs +=3D get_ccd_info(unit);
+=09free(ccd_path);
+
+ }
+ return errs;
+}
=20
static int
flags_to_val(char *flags)
--=20
2.47.3
Home |
Main Index |
Thread Index |
Old Index