sending the patch fot bioctl I'm quite a newbie, so if you find some problem (and you certainly will), could you please explain it for me? there is a little change from the previous patch - parameter has been renamed to -t and expects the number of retries (0 means infinitely).
*** /usr/src/sbin/bioctl/bioctl.c Sun Sep 12 00:15:18 2010 --- /usr/src/sbin/bioctl/bioctl.c Sun Sep 12 23:41:27 2010 *************** *** 71,77 **** 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 *); void bio_deleteraid(char *); void bio_changepass(char *); u_int32_t bio_createflags(char *); --- 71,77 ---- void bio_setstate(char *, int, char *); void bio_setblink(char *, char *, int); void bio_blink(char *, int, int); ! int bio_createraid(u_int16_t, char *, char *); void bio_deleteraid(char *); void bio_changepass(char *); u_int32_t bio_createflags(char *); *************** *** 102,112 **** int ss_func = 0; u_int16_t cr_level = 0; int biodev = 0; if (argc < 2) usage(); ! while ((ch = getopt(argc, argv, "a:b:C:c:dH:hik:l:Pp:qr:R:vu:")) != -1) { switch (ch) { case 'a': /* alarm */ --- 102,115 ---- 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:t:vu:")) != -1) { switch (ch) { case 'a': /* alarm */ *************** *** 132,137 **** --- 135,148 ---- /* 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,240 **** errx(1, "need -l parameter"); if (!biodev) errx(1, "must use bio device"); ! bio_createraid(cr_level, dev_list, key_disk); } return (0); --- 245,264 ---- errx(1, "need -l parameter"); if (!biodev) errx(1, "must use bio device"); ! 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); *************** *** 685,691 **** close(bioh); } ! void bio_createraid(u_int16_t level, char *dev_list, char *key_disk) { struct bioc_createraid create; --- 709,715 ---- close(bioh); } ! int bio_createraid(u_int16_t level, char *dev_list, char *key_disk) { struct bioc_createraid create; *************** *** 798,805 **** memset(&kdfinfo, 0, sizeof(kdfinfo)); memset(&create, 0, sizeof(create)); if (rv == -1) { ! if (errno == EPERM) ! errx(1, "Incorrect passphrase"); err(1, "BIOCCREATERAID"); } --- 822,831 ---- memset(&kdfinfo, 0, sizeof(kdfinfo)); memset(&create, 0, sizeof(create)); if (rv == -1) { ! if (errno == EPERM) { ! fprintf(stderr,"Incorrect passphrase\n"); ! return -1; ! } err(1, "BIOCCREATERAID"); }