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