Module Name:    src
Committed By:   joerg
Date:           Thu Dec  5 21:17:23 UTC 2013

Modified Files:
        src/include: cdbr.h
        src/lib/libc/cdb: cdbr.3 cdbr.c
        src/lib/libc/include: namespace.h

Log Message:
Add cdbr_open_mem.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/include/cdbr.h
cvs rdiff -u -r1.3 -r1.4 src/lib/libc/cdb/cdbr.3
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/cdb/cdbr.c
cvs rdiff -u -r1.169 -r1.170 src/lib/libc/include/namespace.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/include/cdbr.h
diff -u src/include/cdbr.h:1.1 src/include/cdbr.h:1.2
--- src/include/cdbr.h:1.1	Sun Apr 25 00:54:45 2010
+++ src/include/cdbr.h	Thu Dec  5 21:17:23 2013
@@ -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 @@ struct cdbr;
 __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,

Index: src/lib/libc/cdb/cdbr.3
diff -u src/lib/libc/cdb/cdbr.3:1.3 src/lib/libc/cdb/cdbr.3:1.4
--- src/lib/libc/cdb/cdbr.3:1.3	Sat Jul 20 21:39:56 2013
+++ src/lib/libc/cdb/cdbr.3	Thu Dec  5 21:17:23 2013
@@ -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 @@ returned by
 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 .

Index: src/lib/libc/cdb/cdbr.c
diff -u src/lib/libc/cdb/cdbr.c:1.4 src/lib/libc/cdb/cdbr.c:1.5
--- src/lib/libc/cdb/cdbr.c:1.4	Thu Sep 27 00:37:43 2012
+++ src/lib/libc/cdb/cdbr.c	Thu Dec  5 21:17:23 2013
@@ -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 @@ __RCSID("$NetBSD: cdbr.c,v 1.4 2012/09/2
 #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_close,_cdbr_close)
 __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 @@ __weak_alias(cdbr_open,_cdbr_open)
 #endif
 
 struct cdbr {
+	void (*unmap)(void *, void *, size_t);
+	void *cookie;
 	uint8_t *mmap_base;
 	size_t mmap_size;
 
@@ -91,27 +95,63 @@ struct cdbr {
 	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 @@ cdbr_open(const char *path, int flags)
 	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_open(const char *path, int flags)
 	    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 @@ cdbr_find(struct cdbr *cdbr, const void 
 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);
 }

Index: src/lib/libc/include/namespace.h
diff -u src/lib/libc/include/namespace.h:1.169 src/lib/libc/include/namespace.h:1.170
--- src/lib/libc/include/namespace.h:1.169	Wed Aug 28 17:47:07 2013
+++ src/lib/libc/include/namespace.h	Thu Dec  5 21:17:23 2013
@@ -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

Reply via email to