On 01/15/11 03:06, Ted Unangst wrote: > On Thu, 13 Jan 2011, Ted Unangst wrote: > >> If I type the wrong password into bioctl at boot, disks don't exist, >> filesystems don't get mounted, and generally lots of things go wrong. All >> I need is a second chance to remind me to type the right password. > > After some feedback, here's a revised edition. Keep prompting until the > user gets it right. If you want out, ^C, ^D, or just plain enter will > quit. > > This also tweaks the password length check to abort on empty passwords. > (readpassphrase 'succeeds' after hitting ^D.) > > Index: bioctl.c > =================================================================== > RCS file: /home/tedu/cvs/src/sbin/bioctl/bioctl.c,v > retrieving revision 1.98 > diff -u -r1.98 bioctl.c > --- bioctl.c 1 Dec 2010 19:40:18 -0000 1.98 > +++ bioctl.c 15 Jan 2011 02:04:14 -0000 > @@ -738,6 +738,7 @@ > if (level == 'C' && no_dev != min_disks) > errx(1, "not exactly one partition"); > > +again: > memset(&create, 0, sizeof(create)); > create.bc_cookie = bl.bl_cookie; > create.bc_level = level; > @@ -802,8 +803,10 @@ > memset(&kdfinfo, 0, sizeof(kdfinfo)); > memset(&create, 0, sizeof(create)); > if (rv == -1) { > - if (errno == EPERM) > - errx(1, "Incorrect passphrase"); > + if (errno == EPERM) { > + warnx("Incorrect passphrase. Try again."); > + goto again; > + } > err(1, "BIOCCREATERAID"); > }
I haven't looked very close but should not the handling differ between the key_disk vs passphrase cases? I bet there would be a way to make it loop... :-) /Alexander > > @@ -1065,18 +1068,17 @@ > > if (fgets(passphrase, sizeof(passphrase), f) == NULL) > err(1, "can't read passphrase file"); > - pl = strlen(passphrase); > - if (pl > 0 && passphrase[pl - 1] == '\n') > - passphrase[pl - 1] = '\0'; > - else > - errx(1, "invalid passphrase length"); > - > fclose(f); > } else { > if (readpassphrase(prompt, passphrase, sizeof(passphrase), > rpp_flag) == NULL) > errx(1, "unable to read passphrase"); > } > + pl = strlen(passphrase); > + if (pl > 0 && passphrase[pl - 1] == '\n') > + passphrase[--pl] = '\0'; > + if (pl == 0) > + errx(1, "invalid passphrase length"); > > if (verify) { > /* request user to re-type it */