Replace use of opt.homedir by accessor functions.
[gnupg.git] / dirmngr / cdblib.c
index 16d53ae..23cb317 100644 (file)
@@ -7,7 +7,7 @@
  * inclusion into Dirmngr.  By Werner Koch <wk@gnupg.org> 2003-12-12.
  */
 
-/* A cdb database is a single file used to map `keys' to `values',
+/* A cdb database is a single file used to map 'keys' to 'values',
    having records of (key,value) pairs.  File consists of 3 parts: toc
    (table of contents), data and index (hash tables).
 
@@ -59,7 +59,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
-#include <stdlib.h> 
+#include <stdlib.h>
 #include <errno.h>
 #include <string.h>
 #include <unistd.h>
@@ -89,7 +89,7 @@ struct cdb_rec {
   cdbi_t hval;
   cdbi_t rpos;
 };
-  
+
 struct cdb_rl {
   struct cdb_rl *next;
   cdbi_t cnt;
@@ -115,9 +115,10 @@ cdb_init(struct cdb *cdbp, int fd)
 {
   struct stat st;
   unsigned char *mem;
-  unsigned fsize;
 #ifdef _WIN32
   HANDLE hFile, hMapping;
+#else
+  unsigned int fsize;
 #endif
 
   /* get file size */
@@ -128,14 +129,13 @@ cdb_init(struct cdb *cdbp, int fd)
     gpg_err_set_errno (EPROTO);
     return -1;
   }
-  fsize = (unsigned)(st.st_size & 0xffffffffu);
   /* memory-map file */
 #ifdef _WIN32
 # ifdef __MINGW32CE__
   hFile = fd;
 # else
   hFile = (HANDLE) _get_osfhandle(fd);
-#endif
+# endif
   if (hFile == (HANDLE) -1)
     return -1;
   hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
@@ -144,11 +144,13 @@ cdb_init(struct cdb *cdbp, int fd)
   mem = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
   if (!mem)
     return -1;
-#else
+  cdbp->cdb_mapping = hMapping;
+#else /*!_WIN32*/
+  fsize = (unsigned int)(st.st_size & 0xffffffffu);
   mem = (unsigned char*)mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0);
   if (mem == MAP_FAILED)
     return -1;
-#endif /* _WIN32 */
+#endif /*!_WIN32*/
 
   cdbp->cdb_fd = fd;
   cdbp->cdb_fsize = st.st_size;
@@ -180,17 +182,9 @@ cdb_free(struct cdb *cdbp)
 {
   if (cdbp->cdb_mem) {
 #ifdef _WIN32
-    HANDLE hFile, hMapping;
-#endif
-#ifdef _WIN32
-#ifdef __MINGW32CE__
-    hFile = cdbp->cdb_fd;
-#else
-    hFile = (HANDLE) _get_osfhandle(cdbp->cdb_fd);
-#endif
-    hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
-    UnmapViewOfFile((void*) cdbp->cdb_mem);
-    CloseHandle(hMapping);
+    UnmapViewOfFile ((void*) cdbp->cdb_mem);
+    CloseHandle (cdbp->cdb_mapping);
+    cdbp->cdb_mapping = NULL;
 #else
     munmap((void*)cdbp->cdb_mem, cdbp->cdb_fsize);
 #endif /* _WIN32 */
@@ -313,7 +307,7 @@ cdb_find(struct cdb *cdbp, const void *key, cdbi_t klen)
    result), use cdb_datapos() and cdb_datalen() macros with cdbp
    pointer.  It is error to use cdb_findnext() after it returned 0 or
    error condition.  These routines is a bit slower than
-   cdb_find(). 
+   cdb_find().
 
    Setting KEY to NULL will start a sequential search through the
    entire DB.
@@ -351,7 +345,7 @@ cdb_findinit(struct cdb_find *cdbfp, struct cdb *cdbp,
     }
   else /* Walk over all entries. */
     {
-      cdbfp->cdb_hval = 0; 
+      cdbfp->cdb_hval = 0;
       /* Force stepping in findnext. */
       cdbfp->cdb_htp = cdbfp->cdb_htend = cdbp->cdb_mem;
     }
@@ -360,7 +354,7 @@ cdb_findinit(struct cdb_find *cdbfp, struct cdb *cdbp,
 
 
 /* See cdb_findinit. */
-int 
+int
 cdb_findnext(struct cdb_find *cdbfp)
 {
   cdbi_t pos, n;
@@ -410,7 +404,7 @@ cdb_findnext(struct cdb_find *cdbfp)
             {
               if (cdbfp->cdb_hval > 255)
                 return 0; /* No more items. */
-              
+
               cdbfp->cdb_htp = cdbp->cdb_mem + cdbfp->cdb_hval * 8;
               cdbfp->cdb_hval++; /* Advance for next round. */
               pos = cdb_unpack (cdbfp->cdb_htp);     /* Offset of table. */
@@ -423,22 +417,22 @@ cdb_findnext(struct cdb_find *cdbfp)
                   gpg_err_set_errno (EPROTO);
                   return -1;
                 }
-              
+
               cdbfp->cdb_htab  = cdbp->cdb_mem + pos;
               cdbfp->cdb_htend = cdbfp->cdb_htab + cdbfp->cdb_httodo;
               cdbfp->cdb_htp   = cdbfp->cdb_htab;
             }
-          
+
           pos = cdb_unpack (cdbfp->cdb_htp + 4); /* Offset of record. */
           cdbfp->cdb_htp += 8;
-        } 
+        }
       while (!pos);
       if (pos > cdbp->cdb_fsize - 8)
         {
           gpg_err_set_errno (EPROTO);
           return -1;
         }
-      
+
       cdbp->cdb_kpos = pos + 8;
       cdbp->cdb_klen = cdb_unpack(cdbp->cdb_mem + pos);
       cdbp->cdb_vpos = pos + 8 + cdbp->cdb_klen;
@@ -702,7 +696,7 @@ make_find (struct cdb_make *cdbmp,
 {
   struct cdb_rl *rl = cdbmp->cdb_rec[hval&255];
   int r, i;
-  int seeked = 0;
+  int sought = 0;
   while(rl) {
     for(i = rl->cnt - 1; i >= 0; --i) { /* search backward */
       if (rl->rec[i].hval != hval)
@@ -717,7 +711,7 @@ make_find (struct cdb_make *cdbmp,
           return -1;
         cdbmp->cdb_bpos = cdbmp->cdb_buf;
       }
-      seeked = 1;
+      sought = 1;
       r = match(cdbmp->cdb_fd, rl->rec[i].rpos, key, klen);
       if (!r)
        continue;
@@ -731,7 +725,7 @@ make_find (struct cdb_make *cdbmp,
     }
     rl = rl->next;
   }
-  if (seeked && lseek(cdbmp->cdb_fd, cdbmp->cdb_dpos, SEEK_SET) < 0)
+  if (sought && lseek(cdbmp->cdb_fd, cdbmp->cdb_dpos, SEEK_SET) < 0)
     return -1;
   return 0;
 }