I am not a fan of this. Why wouldn't you do this in the wrapping script? I added some style nits too for future reference
On Sun, Sep 12, 2010 at 11:42:26PM +0200, Merlyn wrote: > 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 ); ^ no space ^ > + else > + do > + success=bio_createraid(cr_level, > dev_list, key_disk); > + while ( --retries > 0 && success == -1 ); ^ no space there ^ > + 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"); > }