Release 2.1.4.
[u/mdw/catacomb] / key-file.c
index ab620e7..3245b93 100644 (file)
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: key-file.c,v 1.1 1999/12/22 15:47:48 mdw Exp $
+ * $Id$
  *
  * System-dependent key filing operations
  *
  * (c) 1999 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: key-file.c,v $
- * Revision 1.1  1999/12/22 15:47:48  mdw
- * Major key-management revision.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <errno.h>
@@ -68,6 +60,7 @@
 static int fdcopy(int source, int dest)
 {
   char buf[4096];
+  char *p;
 
   if (lseek(source, 0, SEEK_SET) < 0||
       lseek(dest, 0, SEEK_SET) < 0 ||
@@ -79,8 +72,14 @@ static int fdcopy(int source, int dest)
       return (-1);
     else if (n == 0)
       break;
-    else if (write(dest, buf, n) < 0)
-      return (-1);
+    p = buf;
+    while (n) {
+      int nn = write(dest, p, n);
+      if (nn < 0)
+       return (-1);
+      p += nn;
+      n -= nn;
+    }
   }
   return (0);
 }
@@ -108,6 +107,8 @@ int key_save(key_file *f)
 
   if (!(f->f & KF_MODIFIED))
     return (KWRITE_OK);
+  if (!f->fp)
+    return (KWRITE_FAIL);
 
   /* --- Write a new key file out --- *
    *
@@ -196,6 +197,9 @@ int key_save(key_file *f)
 
   unlink(n_new.buf);
   unlink(n_older.buf);
+  dstr_destroy(&n_new);
+  dstr_destroy(&n_old);
+  dstr_destroy(&n_older);
   return (KWRITE_OK);
 
   /* --- Failure while writing the new key file --- *
@@ -253,16 +257,16 @@ fail_shift:
   dstr_destroy(&n_old);
   dstr_destroy(&n_older);
   return (rc);
-  
-/* --- Failure during write of new data --- *
- *
- * Clean up the new file and return.  These errors can never cause
- * breakage.
- */
+
+  /* --- Failure during write of new data --- *
  *
  * Clean up the new file and return.  These errors can never cause
  * breakage.
  */
 
 fail_write:
   unlink(n_new.buf);
-  fail_open:
+fail_open:
   dstr_destroy(&n_new);
   return (rc);
 }
@@ -271,7 +275,7 @@ fail_write:
  *
  * Arguments:  @key_file *f@ = pointer to file structure to initialize
  *             @const char *file@ = pointer to the file name
- *             @int how@ = opening options (@KOPEN_*@).
+ *             @unsigned how@ = opening options (@KOPEN_*@).
  *
  * Returns:    Zero if it worked, nonzero otherwise.
  *
@@ -286,15 +290,22 @@ fail_write:
  *             for the private use of @key_open@.
  */
 
-int key_lockfile(key_file *f, const char *file, int how)
+int key_lockfile(key_file *f, const char *file, unsigned how)
 {
   int of, lf;
   const char *ff;
   int fd;
 
+  /* --- Handle the magic no-file option --- */
+
+  if (how & KOPEN_NOFILE) {
+    f->fp = 0;
+    return (0);
+  }
+
   /* --- Lots of things depend on whether we're writing --- */
 
-  switch (how) {
+  switch (how & KOPEN_MASK) {
     case KOPEN_READ:
       of = O_RDONLY;
       lf = LOCK_NONEXCL;