Gather up another utility.
[u/mdw/catacomb] / passphrase.c
index ced4385..0b8ddcf 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: passphrase.c,v 1.1 1999/12/22 15:58:20 mdw Exp $
+ * $Id: passphrase.c,v 1.6 2004/04/08 01:36:15 mdw Exp $
  *
  * Reading of passphrases (Unix-specific)
  *
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: passphrase.c,v $
- * Revision 1.1  1999/12/22 15:58:20  mdw
- * Portable interface to reading passphrases.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <errno.h>
@@ -54,9 +46,7 @@
 static int fd = -1;
 static unsigned flags = 0;
 
-enum {
-  f_fail = 1
-};
+#define f_fail 1u
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -99,34 +89,43 @@ static int pconn(void)
 int passphrase_read(const char *tag, unsigned mode, char *buf, size_t sz)
 {
   dstr d = DSTR_INIT;
+  int rc = 1;
 
   /* --- Try talking to the pixie --- */
 
   if (!pconn()) {
-    if (pixie_read(fd, tag, mode, buf, sz)) {
+    rc = pixie_read(fd, tag, mode, buf, sz);
+    if (rc < 0) {
       close(fd);
       fd = -1;
       return (-1);
     }
-    return (0);
+    if (rc == 0)
+      return (0);
   }
 
   /* --- Read from the terminal --- */
 
-  dstr_putf(&d, "Passphrase %s: ", tag);
+  dstr_putf(&d, "%s %s: ",
+           mode == PMODE_READ ? "Passphrase" : "New passphrase",
+           tag);
   if (pixie_getpass(d.buf, buf, sz))
     goto fail;
   if (mode == PMODE_VERIFY) {
     char b[1024];
     DRESET(&d);
     dstr_putf(&d, "Verify passphrase %s: ", tag);
-    if (pixie_getpass(d.buf, b, sizeof(b)) ||
-       strcmp(b, buf) != 0) {
+    if (pixie_getpass(d.buf, b, sizeof(b)) || strcmp(b, buf) != 0) {
       memset(b, 0, sizeof(b));
       goto fail;
     }
   }
   dstr_destroy(&d);
+
+  /* --- If the pixie is interested, tell it the new passphrase --- */
+
+  if (fd >= 0)
+    pixie_set(fd, tag, buf);
   return (0);
 
   /* --- Tidy up after a failure --- */