* keybox-defs.h: New BLOBTYPTE_EMPTY.
authorWerner Koch <wk@gnupg.org>
Mon, 22 Jul 2002 10:21:04 +0000 (10:21 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 22 Jul 2002 10:21:04 +0000 (10:21 +0000)
* keybox-dump.c (_keybox_dump_blob): Handle new type.
* keybox-file.c (_keybox_read_blob): Skip over empty blobs.  Store
the file offset.
* keybox-blob.c (_keybox_new_blob): Add new arg OFF.
(_keybox_get_blob_fileoffset): New.
* keybox-update.c (keybox_delete): Implemented.

kbx/ChangeLog
kbx/keybox-blob.c
kbx/keybox-defs.h
kbx/keybox-dump.c
kbx/keybox-file.c
kbx/keybox-update.c

index 715acbd..c53d48a 100644 (file)
@@ -1,3 +1,13 @@
+2002-07-22  Werner Koch  <wk@gnupg.org>
+
+       * keybox-defs.h: New BLOBTYPTE_EMPTY.
+       * keybox-dump.c (_keybox_dump_blob): Handle new type.
+       * keybox-file.c (_keybox_read_blob): Skip over empty blobs.  Store
+       the file offset.
+       * keybox-blob.c (_keybox_new_blob): Add new arg OFF.
+       (_keybox_get_blob_fileoffset): New.
+       * keybox-update.c (keybox_delete): Implemented.
+
 2002-06-19  Werner Koch  <wk@gnupg.org>
 
        * keybox-init.c (keybox_set_ephemeral): New.
index 34e2c97..48e2b5b 100644 (file)
@@ -171,6 +171,7 @@ struct fixup_list {
 struct keyboxblob {
   byte *blob;
   size_t bloblen;
+  off_t fileoffset;
   
   /* stuff used only by keybox_create_blob */
   unsigned char *serialbuf;
@@ -956,7 +957,7 @@ _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert,
 
 \f
 int
-_keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen)
+_keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen, off_t off)
 {
   KEYBOXBLOB blob;
   
@@ -967,6 +968,7 @@ _keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen)
 
   blob->blob = image;
   blob->bloblen = imagelen;
+  blob->fileoffset = off;
   *r_blob = blob;
   return 0;
 }
@@ -993,6 +995,13 @@ _keybox_release_blob (KEYBOXBLOB blob)
 const char *
 _keybox_get_blob_image ( KEYBOXBLOB blob, size_t *n )
 {
-    *n = blob->bloblen;
-    return blob->blob;
+  *n = blob->bloblen;
+  return blob->blob;
 }
+
+off_t
+_keybox_get_blob_fileoffset (KEYBOXBLOB blob)
+{
+  return blob->fileoffset;
+}
+
index 978bb22..1c66020 100644 (file)
@@ -35,6 +35,7 @@ typedef unsigned int u32; /* fixme */
 #endif
 
 enum {
+  BLOBTYPE_EMPTY = 0,
   BLOBTYPE_HEADER = 1,
   BLOBTYPE_PGP = 2,
   BLOBTYPE_X509 = 3
@@ -97,9 +98,11 @@ int _keybox_create_x509_blob (KEYBOXBLOB *r_blob, KsbaCert cert,
                               unsigned char *sha1_digest, int as_ephemeral);
 #endif /*KEYBOX_WITH_X509*/
 
-int  _keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen);
+int  _keybox_new_blob (KEYBOXBLOB *r_blob, char *image, size_t imagelen,
+                       off_t off);
 void _keybox_release_blob (KEYBOXBLOB blob);
 const char *_keybox_get_blob_image (KEYBOXBLOB blob, size_t *n);
+off_t _keybox_get_blob_fileoffset (KEYBOXBLOB blob);
 
 /*-- keybox-file.c --*/
 int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp);
index 530b464..4fb3a4e 100644 (file)
@@ -117,6 +117,10 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
   type = buffer[4];
   switch (type)
     {
+    case BLOBTYPE_EMPTY:
+      fprintf (fp, "Type:   Empty\n");
+      return 0;
+
     case BLOBTYPE_HEADER:
       fprintf (fp, "Type:   Header\n");
       return dump_header_blob (buffer, length, fp);
index 79a2e17..bbbf78e 100644 (file)
@@ -32,38 +32,54 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp)
 {
   char *image;
   size_t imagelen = 0;
-  int c1, c2, c3, c4;
+  int c1, c2, c3, c4, type;
   int rc;
+  off_t off;
 
+ again:
   *r_blob = NULL;
+  off = ftello (fp);
+  if (off == (off_t)-1)
+    return KEYBOX_Read_Error;
+
   if ((c1 = getc (fp)) == EOF
       || (c2 = getc (fp)) == EOF
       || (c3 = getc (fp)) == EOF
-      || (c4 = getc (fp)) == EOF ) {
-    if ( c1 == EOF && !ferror (fp) )
-      return -1; /* eof */
-    return KEYBOX_Read_Error;
-  }
+      || (c4 = getc (fp)) == EOF
+      || (type = getc (fp)) == EOF)
+    {
+      if ( c1 == EOF && !ferror (fp) )
+        return -1; /* eof */
+      return KEYBOX_Read_Error;
+    }
 
   imagelen = (c1 << 24) | (c2 << 16) | (c3 << 8 ) | c4;
   if (imagelen > 500000) /* sanity check */
     return KEYBOX_Blob_Too_Large;
   
-  if (imagelen < 4
+  if (imagelen < 5
     return KEYBOX_Blob_Too_Short;
-    
+
+  if (!type)
+    {
+      /* special treatment for empty blobs. */
+      if (fseek (fp, imagelen-5, SEEK_CUR))
+        return KEYBOX_Read_Error;
+      goto again;
+    }
+
   image = xtrymalloc (imagelen);
   if (!image) 
     return KEYBOX_Out_Of_Core;
 
-  image[0] = c1; image[1] = c2; image[2] = c3; image[3] = c4;
-  if (fread (image+4, imagelen-4, 1, fp) != 1)
+  image[0] = c1; image[1] = c2; image[2] = c3; image[3] = c4; image[4] = type;
+  if (fread (image+5, imagelen-5, 1, fp) != 1)
     {
       xfree (image);
       return KEYBOX_Read_Error;
     }
   
-  rc = r_blob? _keybox_new_blob (r_blob, image, imagelen) : 0;
+  rc = r_blob? _keybox_new_blob (r_blob, image, imagelen, off) : 0;
   if (rc || !r_blob)
         xfree (image);
   return rc;
index 96a30b9..8b189bb 100644 (file)
@@ -384,7 +384,50 @@ keybox_update_cert (KEYBOX_HANDLE hd, KsbaCert cert,
 int
 keybox_delete (KEYBOX_HANDLE hd)
 {
-  return -1;
+  off_t off;
+  const char *fname;
+  FILE *fp;
+  int rc;
+
+  if (!hd)
+    return KEYBOX_Invalid_Value;
+  if (!hd->found.blob)
+    return KEYBOX_Nothing_Found;
+  if (!hd->kb)
+    return KEYBOX_Invalid_Handle; 
+  fname = hd->kb->fname;
+  if (!fname)
+    return KEYBOX_Invalid_Handle; 
+
+  off = _keybox_get_blob_fileoffset (hd->found.blob);
+  if (off == (off_t)-1)
+    return KEYBOX_General_Error;
+  off += 4;
+
+  if (hd->fp)
+    {
+      fclose (hd->fp);
+      hd->fp = NULL;
+    }
+  
+  fp = fopen (hd->kb->fname, "r+b");
+  if (!fp)
+    return KEYBOX_File_Open_Error;
+
+  if (fseeko (fp, off, SEEK_SET))
+    rc = KEYBOX_Write_Error;
+  else if (putc (0, fp) == EOF)
+    rc = KEYBOX_Write_Error;
+  else
+    rc = 0;
+
+  if (fclose (fp))
+    {
+      if (!rc)
+        rc = KEYBOX_File_Close_Error;
+    }
+
+  return rc;
 }