> 2 packets transmitted, 0 packets received, 100.0% packet loss :)

I see many people are doing something in persistent memory
subsystems now. Maybe this diff could get some attention now
as well. :) Resending the whole thing.

--
WBR,
  Vadim Zhukov


Index: bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.129
diff -u -p -r1.129 bioctl.c
--- bioctl.c    18 Jul 2015 23:23:20 -0000      1.129
+++ bioctl.c    18 Apr 2016 11:17:06 -0000
@@ -69,7 +69,8 @@ void                  bio_kdf_generate(struct sr_crypto
 void                   derive_key_pkcs(int, u_int8_t *, size_t, u_int8_t *,
                            size_t, char *, int);
 
-void                   bio_inq(char *);
+void                   bio_listall();
+void                   bio_inq(char *, int);
 void                   bio_alarm(char *);
 int                    bio_getvolbyname(char *);
 void                   bio_setstate(char *, int, char *);
@@ -110,12 +111,17 @@ main(int argc, char *argv[])
        u_int16_t               cr_level = 0;
        int                     biodev = 0;
 
-       if (argc < 2)
-               usage();
+       if (argc < 2) {
+               bio_listall();
+               return 0;
+       }
 
-       while ((ch = getopt(argc, argv, "a:b:C:c:dH:hik:l:O:Pp:qr:R:st:u:v")) !=
+       while ((ch = getopt(argc, argv, "Aa:b:C:c:dH:hik:l:O:Pp:qr:R:st:u:v")) 
!=
            -1) {
                switch (ch) {
+               case 'A':
+                       bio_listall();
+                       return 0;
                case 'a': /* alarm */
                        func |= BIOC_ALARM;
                        al_arg = optarg;
@@ -243,7 +249,7 @@ main(int argc, char *argv[])
        } else if (changepass && !biodev) {
                bio_changepass(devicename);
        } else if (func & BIOC_INQ) {
-               bio_inq(devicename);
+               bio_inq(devicename, 0);
        } else if (func == BIOC_ALARM) {
                bio_alarm(al_arg);
        } else if (func == BIOC_BLINK) {
@@ -273,7 +279,7 @@ usage(void)
        extern char             *__progname;
 
        fprintf(stderr,
-               "usage: %s [-hiqv] [-a alarm-function] "
+               "usage: %s [-Ahiqv] [-a alarm-function] "
                "[-b channel:target[.lun]]\n"
                "\t[-H channel:target[.lun]] "
                "[-R device | channel:target[.lun]]\n"
@@ -355,6 +361,43 @@ str2patrol(const char *string, struct ti
 }
 
 void
+bio_listall(void)
+{
+       struct  bio_locate      bl;
+       struct  bioc_controllerlist cl;
+       int     rv;
+
+       memset(&cl, 0, sizeof(cl));
+       memset(&bl, 0, sizeof(bl));
+
+       devh = open("/dev/bio", O_RDONLY);
+       if (devh == -1)
+               err(1, "Can't open %s", "/dev/bio");
+
+       rv = ioctl(devh, BIOCLISTCONTROLLERS, &cl);
+       if (rv == -1)
+               err(1, "1 BIOCLISTCONTROLLERS");
+       if (cl.bcl_size == 0)
+               return;
+
+       cl.bcl_list = calloc(cl.bcl_size, sizeof(struct bioc_controller));
+       if (cl.bcl_list == NULL)
+               err(1, "calloc");
+       rv = ioctl(devh, BIOCLISTCONTROLLERS, &cl);
+       if (rv == -1)
+               err(1, "2 BIOCLISTCONTROLLERS");
+       while (cl.bcl_size--) {
+               bl.bl_name = cl.bcl_list[cl.bcl_size].bc_xname;
+               if (ioctl(devh, BIOCLOCATE, &bl))
+                       errx(1, "Can't locate %s device via %s",
+                           bl.bl_name, "/dev/bio");
+               bio_cookie = bl.bl_bio.bio_cookie;
+               bio_inq(NULL, 1);
+       }
+       free(cl.bcl_list);
+}
+
+void
 bio_status(struct bio_status *bs)
 {
        extern char             *__progname;
@@ -378,7 +421,7 @@ bio_status(struct bio_status *bs)
 }
 
 void
-bio_inq(char *name)
+bio_inq(char *name, int ignorenotsupp)
 {
        char                    *status, *cache;
        char                    size[64], scsiname[16], volname[32];
@@ -394,9 +437,10 @@ bio_inq(char *name)
        bi.bi_bio.bio_cookie = bio_cookie;
 
        if (ioctl(devh, BIOCINQ, &bi)) {
-               if (errno == ENOTTY)
-                       bio_diskinq(name);
-               else
+               if (errno == ENOTTY) {
+                       if (!ignorenotsupp)
+                               bio_diskinq(name);
+               } else
                        err(1, "BIOCINQ");
                return;
        }

Reply via email to