Index: bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.97
diff -u -p -r1.97 bioctl.c
--- bioctl.c    10 Jul 2010 02:56:16 -0000      1.97
+++ bioctl.c    12 Sep 2010 21:40:23 -0000
@@ -71,7 +71,7 @@ int                   bio_getvolbyname(char *);
 void                   bio_setstate(char *, int, char *);
 void                   bio_setblink(char *, char *, int);
 void                   bio_blink(char *, int, int);
-void                   bio_createraid(u_int16_t, char *, char *);
+int                    bio_createraid(u_int16_t, char *, char *);
 void                   bio_deleteraid(char *);
 void                   bio_changepass(char *);
 u_int32_t              bio_createflags(char *);
@@ -102,11 +102,14 @@ main(int argc, char *argv[])
        int                     ss_func = 0;
        u_int16_t               cr_level = 0;
        int                     biodev = 0;
+       int                     success = 0;
+       int                     more_tries = 0;
+       int                     retries = 0;

        if (argc < 2)
                usage();

-       while ((ch = getopt(argc, argv, "a:b:C:c:dH:hik:l:Pp:qr:R:vu:")) !=
+       while ((ch = getopt(argc, argv, "a:b:C:c:dH:hik:l:Pp:qr:R:t:vu:")) !=
            -1) {
                switch (ch) {
                case 'a': /* alarm */
@@ -132,6 +135,14 @@ main(int argc, char *argv[])
                        /* delete volume */
                        func |= BIOC_DELETERAID;
                        break;
+               case 't':
+                       /* ask for password retries-times */
+                       more_tries = 1;
+                       retries = strtonum(optarg, 0, 1000, &errstr);
+                       if (errstr != NULL)
+                               errx(1, "Number of retries is %s: %s",
+                                       errstr, optarg);
+                       break;
                case 'u': /* unblink */
                        func |= BIOC_BLINK;
                        blink = BIOC_SBUNBLINK;
@@ -234,7 +245,17 @@ main(int argc, char *argv[])
                        errx(1, "need -l parameter");
                if (!biodev)
                        errx(1, "must use bio device");
-               bio_createraid(cr_level, dev_list, key_disk);
+               if (more_tries == 1)
+                       if ( retries == 0 )
+                               do
+                                       success=bio_createraid(cr_level, 
dev_list, key_disk);
+                               while ( success == -1 );
+                       else
+                               do
+                                       success=bio_createraid(cr_level, 
dev_list, key_disk);
+                               while ( --retries > 0 && success == -1 );
+               else
+                       bio_createraid(cr_level, dev_list, key_disk);
        }

        return (0);
@@ -255,7 +276,8 @@ usage(void)
                 "       %s [-dhiPqv] "
                 "[-C flag[,flag,...]] [-c raidlevel] [-k keydisk]\n"
                 "\t[-l special[,special,...]] [-p passfile]\n"
-                "\t[-R device | channel:target[.lun] [-r rounds] "
+                "\t[-R device | channel:target[.lun] [-r rounds]\n"
+               "\t[-t retries] "
                "device\n", __progname, __progname);
        
        exit(1);
@@ -685,7 +707,7 @@ bio_blink(char *enclosure, int target, i
        close(bioh);
 }

-void
+int
 bio_createraid(u_int16_t level, char *dev_list, char *key_disk)
 {
        struct bioc_createraid  create;
@@ -798,8 +820,10 @@ bio_createraid(u_int16_t level, char *de
        memset(&kdfinfo, 0, sizeof(kdfinfo));
        memset(&create, 0, sizeof(create));
        if (rv == -1) {
-               if (errno == EPERM)
-                       errx(1, "Incorrect passphrase");
+               if (errno == EPERM) {
+                       fprintf(stderr,"Incorrect passphrase\n");
+                       return -1;
+               }
                err(1, "BIOCCREATERAID");
        }

Reply via email to