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"); }