Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Add cdbr_open_mem.



details:   https://anonhg.NetBSD.org/src/rev/50beda35c1d1
branches:  trunk
changeset: 325098:50beda35c1d1
user:      joerg <joerg%NetBSD.org@localhost>
date:      Thu Dec 05 21:17:23 2013 +0000

description:
Add cdbr_open_mem.

diffstat:

 include/cdbr.h               |   4 +-
 lib/libc/cdb/cdbr.3          |  31 +++++++++++++++++-
 lib/libc/cdb/cdbr.c          |  73 ++++++++++++++++++++++++++++++++-----------
 lib/libc/include/namespace.h |   3 +-
 4 files changed, 88 insertions(+), 23 deletions(-)

diffs (248 lines):

diff -r 12d9ef420ac0 -r 50beda35c1d1 include/cdbr.h
--- a/include/cdbr.h    Thu Dec 05 16:26:04 2013 +0000
+++ b/include/cdbr.h    Thu Dec 05 21:17:23 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cdbr.h,v 1.1 2010/04/25 00:54:45 joerg Exp $   */
+/*     $NetBSD: cdbr.h,v 1.2 2013/12/05 21:17:23 joerg Exp $   */
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -45,6 +45,8 @@
 __BEGIN_DECLS
 
 struct cdbr    *cdbr_open(const char *, int);
+struct cdbr    *cdbr_open_mem(void *, size_t, int,
+    void (*)(void *, void *, size_t), void *);
 uint32_t        cdbr_entries(struct cdbr *);
 int             cdbr_get(struct cdbr *, uint32_t, const void **, size_t *);
 int             cdbr_find(struct cdbr *, const void *, size_t,
diff -r 12d9ef420ac0 -r 50beda35c1d1 lib/libc/cdb/cdbr.3
--- a/lib/libc/cdb/cdbr.3       Thu Dec 05 16:26:04 2013 +0000
+++ b/lib/libc/cdb/cdbr.3       Thu Dec 05 21:17:23 2013 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: cdbr.3,v 1.3 2013/07/20 21:39:56 wiz Exp $
+.\"    $NetBSD: cdbr.3,v 1.4 2013/12/05 21:17:23 joerg Exp $
 .\"
 .\" Copyright (c) 2010 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -28,12 +28,13 @@
 .\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
-.Dd March 3, 2010
+.Dd December 5, 2013
 .Dt CDBR 3
 .Os
 .Sh NAME
 .Nm cdbr
 .Nm cdbr_open ,
+.Nm cdbr_open_mem ,
 .Nm cdbr_entries ,
 .Nm cdbr_get ,
 .Nm cdbr_find ,
@@ -43,6 +44,13 @@
 .Sh SYNOPSIS
 .Ft "struct cdbr *"
 .Fn cdbr_open "const char *path" "int flags"
+.Ft "struct cdbr *"
+.Fo cdbr_open_mem
+.Fa "void *base"
+.Fa "size_t size"
+.Fa "void (*unmap)(void *, void *, size_t)"
+.Fa "void *cookie"
+.Fc
 .Ft uint32_t
 .Fn cdbr_entries "struct cdbr *cdbr"
 .Ft int
@@ -78,6 +86,25 @@
 and
 .Fn cdbr_find
 is invalidated.
+.Fn cdbr_open_mem
+works like
+.Fn cdbr_open ,
+but takes a memory reference to the content of the database file.
+If
+.Va unmap
+is not
+.Dv NULL ,
+it is called by
+.Fn cdbr_close
+with
+.Va cookie ,
+.Va base
+and
+.Va size
+as arguments.
+It is not called by
+.Fn cdbr_open_mem
+on error.
 .Pp
 The number of records in the database can be obtained by calling
 .Fn cdbr_entries .
diff -r 12d9ef420ac0 -r 50beda35c1d1 lib/libc/cdb/cdbr.c
--- a/lib/libc/cdb/cdbr.c       Thu Dec 05 16:26:04 2013 +0000
+++ b/lib/libc/cdb/cdbr.c       Thu Dec 05 21:17:23 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cdbr.c,v 1.4 2012/09/27 00:37:43 joerg Exp $   */
+/*     $NetBSD: cdbr.c,v 1.5 2013/12/05 21:17:23 joerg Exp $   */
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -36,7 +36,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: cdbr.c,v 1.4 2012/09/27 00:37:43 joerg Exp $");
+__RCSID("$NetBSD: cdbr.c,v 1.5 2013/12/05 21:17:23 joerg Exp $");
 
 #include "namespace.h"
 
@@ -53,6 +53,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -62,6 +63,7 @@
 __weak_alias(cdbr_find,_cdbr_find)
 __weak_alias(cdbr_get,_cdbr_get)
 __weak_alias(cdbr_open,_cdbr_open)
+__weak_alias(cdbr_open_mem,_cdbr_open_mem)
 #endif
 
 #if HAVE_NBTOOL_CONFIG_H
@@ -70,6 +72,8 @@
 #endif
 
 struct cdbr {
+       void (*unmap)(void *, void *, size_t);
+       void *cookie;
        uint8_t *mmap_base;
        size_t mmap_size;
 
@@ -91,27 +95,63 @@
        uint8_t entries_index_s1, entries_index_s2;
 };
 
+static void
+cdbr_unmap(void *cookie __unused, void *base, size_t size)
+{
+       munmap(base, size);
+}
+
 /* ARGSUSED */
 struct cdbr *
 cdbr_open(const char *path, int flags)
 {
-       uint8_t buf[40];
+       void *base;
+       size_t size;
        int fd;
        struct cdbr *cdbr;
        struct stat sb;
 
        if ((fd = open(path, O_RDONLY)) == -1)
                return NULL;
-
-       errno = EINVAL;
-       if (fstat(fd, &sb) == -1 ||
-           read(fd, buf, sizeof(buf)) != sizeof(buf) ||
-           memcmp(buf, "NBCDB\n\0\001", 8) ||
-           (cdbr = malloc(sizeof(*cdbr))) == NULL) {
+       if (fstat(fd, &sb) == -1) {
                close(fd);
                return NULL;
        }
 
+       if (sb.st_size >= SSIZE_MAX) {
+               errno = EINVAL;
+               return NULL;
+       }
+
+
+       size = (size_t)sb.st_size;
+       base = mmap(NULL, size, PROT_READ, MAP_FILE|MAP_SHARED, fd, 0);
+       close(fd);
+
+       if (base == MAP_FAILED)
+               return NULL;
+
+       cdbr = cdbr_open_mem(base, size, flags, cdbr_unmap, NULL);
+       if (cdbr == NULL)
+               munmap(base, size);
+       return cdbr;
+}
+
+struct cdbr *
+cdbr_open_mem(void *base, size_t size, int flags,
+    void (*unmap)(void *, void *, size_t), void *cookie)
+{
+       struct cdbr *cdbr;
+       uint8_t *buf = base;
+       if (size < 40 || memcmp(buf, "NBCDB\n\0\001", 8)) {
+               errno = EINVAL;
+               return NULL;
+       }
+
+       cdbr = malloc(sizeof(*cdbr));
+       cdbr->unmap = unmap;
+       cdbr->cookie = cookie;
+
        cdbr->data_size = le32dec(buf + 24);
        cdbr->entries = le32dec(buf + 28);
        cdbr->entries_index = le32dec(buf + 32);
@@ -131,14 +171,8 @@
        else
                cdbr->index_size = 4;
 
-       cdbr->mmap_size = (size_t)sb.st_size;
-       cdbr->mmap_base = mmap(NULL, cdbr->mmap_size, PROT_READ, MAP_FILE|MAP_SHARED, fd, 0);
-       close(fd);
-
-       if (cdbr->mmap_base == MAP_FAILED) {
-               free(cdbr);
-               return NULL;
-       }
+       cdbr->mmap_base = base;
+       cdbr->mmap_size = size;
 
        cdbr->hash_base = cdbr->mmap_base + 40;
        cdbr->offset_base = cdbr->hash_base + cdbr->entries_index * cdbr->index_size;
@@ -154,7 +188,7 @@
            cdbr->data_base + cdbr->data_size >
            cdbr->mmap_base + cdbr->mmap_size) {
                errno = EINVAL;
-               cdbr_close(cdbr);
+               free(cdbr);
                return NULL;
        }
 
@@ -255,6 +289,7 @@
 void
 cdbr_close(struct cdbr *cdbr)
 {
-       munmap(cdbr->mmap_base, cdbr->mmap_size);
+       if (cdbr->unmap)
+               (*cdbr->unmap)(cdbr->cookie, cdbr->mmap_base, cdbr->mmap_size);
        free(cdbr);
 }
diff -r 12d9ef420ac0 -r 50beda35c1d1 lib/libc/include/namespace.h
--- a/lib/libc/include/namespace.h      Thu Dec 05 16:26:04 2013 +0000
+++ b/lib/libc/include/namespace.h      Thu Dec 05 21:17:23 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: namespace.h,v 1.169 2013/08/28 17:47:07 riastradh Exp $        */
+/*     $NetBSD: namespace.h,v 1.170 2013/12/05 21:17:23 joerg Exp $    */
 
 /*-
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -186,6 +186,7 @@
 #define cdbr_find              _cdbr_find
 #define cdbr_get               _cdbr_get
 #define cdbr_open              _cdbr_open
+#define cdbr_open_mem          _cdbr_open_mem
 #define cdbw_close             _cdbw_close
 #define cdbw_open              _cdbw_open
 #define cdbw_put               _cdbw_put



Home | Main Index | Thread Index | Old Index