Module Name:    src
Committed By:   christos
Date:           Sun Dec  1 00:22:48 UTC 2013

Modified Files:
        src/lib/libc/db/btree: bt_open.c bt_overflow.c bt_utils.c
        src/lib/libc/db/db: Makefile.inc
        src/lib/libc/db/hash: hash.c hash_page.c
        src/lib/libc/db/recno: rec_open.c rec_put.c rec_utils.c
Added Files:
        src/lib/libc/db/db: dbfile.c

Log Message:
- centralize opening of regular and temp files to avoid code duplication
- don't cast malloc
- use malloc sizeof(*var) instead of sizeof(type)


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/lib/libc/db/btree/bt_open.c
cvs rdiff -u -r1.18 -r1.19 src/lib/libc/db/btree/bt_overflow.c
cvs rdiff -u -r1.14 -r1.15 src/lib/libc/db/btree/bt_utils.c
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/db/db/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/lib/libc/db/db/dbfile.c
cvs rdiff -u -r1.32 -r1.33 src/lib/libc/db/hash/hash.c
cvs rdiff -u -r1.25 -r1.26 src/lib/libc/db/hash/hash_page.c
cvs rdiff -u -r1.19 -r1.20 src/lib/libc/db/recno/rec_open.c \
    src/lib/libc/db/recno/rec_put.c
cvs rdiff -u -r1.12 -r1.13 src/lib/libc/db/recno/rec_utils.c

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

Modified files:

Index: src/lib/libc/db/btree/bt_open.c
diff -u src/lib/libc/db/btree/bt_open.c:1.26 src/lib/libc/db/btree/bt_open.c:1.27
--- src/lib/libc/db/btree/bt_open.c:1.26	Tue Mar 13 17:13:32 2012
+++ src/lib/libc/db/btree/bt_open.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bt_open.c,v 1.26 2012/03/13 21:13:32 christos Exp $	*/
+/*	$NetBSD: bt_open.c,v 1.27 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: bt_open.c,v 1.26 2012/03/13 21:13:32 christos Exp $");
+__RCSID("$NetBSD: bt_open.c,v 1.27 2013/12/01 00:22:48 christos Exp $");
 
 /*
  * Implementation of btree access method for 4.4BSD.
@@ -71,7 +71,6 @@ __RCSID("$NetBSD: bt_open.c,v 1.26 2012/
 
 static int byteorder(void);
 static int nroot(BTREE *);
-static int tmp(void);
 
 /*
  * __BT_OPEN -- Open a btree.
@@ -161,7 +160,7 @@ __bt_open(const char *fname, int flags, 
 		goto einval;
 
 	/* Allocate and initialize DB and BTREE structures. */
-	if ((t = (BTREE *)malloc(sizeof(BTREE))) == NULL)
+	if ((t = malloc(sizeof(*t))) == NULL)
 		goto err;
 	memset(t, 0, sizeof(BTREE));
 	t->bt_fd = -1;			/* Don't close unopened fd on error. */
@@ -171,7 +170,7 @@ __bt_open(const char *fname, int flags, 
 	t->bt_pfx = b.prefix;
 	t->bt_rfd = -1;
 
-	if ((t->bt_dbp = dbp = (DB *)malloc(sizeof(DB))) == NULL)
+	if ((t->bt_dbp = dbp = malloc(sizeof(*dbp))) == NULL)
 		goto err;
 	memset(t->bt_dbp, 0, sizeof(DB));
 	if (t->bt_lorder != machine_lorder)
@@ -202,24 +201,17 @@ __bt_open(const char *fname, int flags, 
 		default:
 			goto einval;
 		}
-		
-		if ((t->bt_fd = open(fname, flags, mode)) == -1)
-			goto err;
-		if (fcntl(t->bt_fd, F_SETFD, FD_CLOEXEC) == -1)
+		if ((t->bt_fd = __dbopen(fname, flags, mode, &sb)) == -1)
 			goto err;
 	} else {
 		if ((flags & O_ACCMODE) != O_RDWR)
 			goto einval;
-		if ((t->bt_fd = tmp()) == -1)
+		if ((t->bt_fd = __dbtemp("bt.", &sb)) == -1)
 			goto err;
 		F_SET(t, B_INMEM);
 	}
 
-	if (fcntl(t->bt_fd, F_SETFD, FD_CLOEXEC) == -1)
-		goto err;
 
-	if (fstat(t->bt_fd, &sb))
-		goto err;
 	if (sb.st_size) {
 		if ((nr = read(t->bt_fd, &m, sizeof(BTMETA))) < 0)
 			goto err;
@@ -390,37 +382,6 @@ nroot(BTREE *t)
 }
 
 static int
-tmp(void)
-{
-	sigset_t set, oset;
-	int len;
-	int fd;
-	char *envtmp;
-	char path[PATH_MAX];
-
-	if (issetugid())
-		envtmp = NULL;
-	else
-		envtmp = getenv("TMPDIR");
-
-	len = snprintf(path,
-	    sizeof(path), "%s/bt.XXXXXX", envtmp ? envtmp : _PATH_TMP);
-	if (len < 0 || (size_t)len >= sizeof(path)) {
-		errno = ENAMETOOLONG;
-		return -1;
-	}
-	
-	(void)sigfillset(&set);
-	(void)sigprocmask(SIG_BLOCK, &set, &oset);
-	if ((fd = mkstemp(path)) != -1) {
-		(void)unlink(path);
-		(void)fcntl(fd, F_SETFD, FD_CLOEXEC);
-	}
-	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
-	return(fd);
-}
-
-static int
 byteorder(void)
 {
 	uint32_t x;

Index: src/lib/libc/db/btree/bt_overflow.c
diff -u src/lib/libc/db/btree/bt_overflow.c:1.18 src/lib/libc/db/btree/bt_overflow.c:1.19
--- src/lib/libc/db/btree/bt_overflow.c:1.18	Tue Mar 13 17:13:32 2012
+++ src/lib/libc/db/btree/bt_overflow.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bt_overflow.c,v 1.18 2012/03/13 21:13:32 christos Exp $	*/
+/*	$NetBSD: bt_overflow.c,v 1.19 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: bt_overflow.c,v 1.18 2012/03/13 21:13:32 christos Exp $");
+__RCSID("$NetBSD: bt_overflow.c,v 1.19 2013/12/01 00:22:48 christos Exp $");
 
 #include "namespace.h"
 #include <sys/param.h>
@@ -97,7 +97,7 @@ __ovfl_get(BTREE *t, void *p, size_t *ss
 #endif
 	/* Make the buffer bigger as necessary. */
 	if (*bufsz < sz) {
-		*buf = (*buf == NULL ? malloc(sz) : realloc(*buf, sz));
+		*buf = *buf == NULL ? malloc(sz) : realloc(*buf, sz);
 		if (*buf == NULL)
 			return (RET_ERROR);
 		*bufsz = sz;

Index: src/lib/libc/db/btree/bt_utils.c
diff -u src/lib/libc/db/btree/bt_utils.c:1.14 src/lib/libc/db/btree/bt_utils.c:1.15
--- src/lib/libc/db/btree/bt_utils.c:1.14	Wed Sep  4 09:03:22 2013
+++ src/lib/libc/db/btree/bt_utils.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bt_utils.c,v 1.14 2013/09/04 13:03:22 ryoon Exp $	*/
+/*	$NetBSD: bt_utils.c,v 1.15 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: bt_utils.c,v 1.14 2013/09/04 13:03:22 ryoon Exp $");
+__RCSID("$NetBSD: bt_utils.c,v 1.15 2013/12/01 00:22:48 christos Exp $");
 
 #include <sys/param.h>
 
@@ -88,8 +88,8 @@ __bt_ret(BTREE *t, EPG *e, DBT *key, DBT
 		key->data = rkey->data;
 	} else if (copy || F_ISSET(t, B_DB_LOCK)) {
 		if (bl->ksize > rkey->size) {
-			p = (void *)(rkey->data == NULL ?
-			    malloc(bl->ksize) : realloc(rkey->data, bl->ksize));
+			p = rkey->data == NULL ?
+			    malloc(bl->ksize) : realloc(rkey->data, bl->ksize);
 			if (p == NULL)
 				return (RET_ERROR);
 			rkey->data = p;
@@ -115,9 +115,9 @@ dataonly:
 	} else if (copy || F_ISSET(t, B_DB_LOCK)) {
 		/* Use +1 in case the first record retrieved is 0 length. */
 		if (bl->dsize + 1 > rdata->size) {
-			p = (void *)(rdata->data == NULL ?
+			p = rdata->data == NULL ?
 			    malloc(bl->dsize + 1) :
-			    realloc(rdata->data, bl->dsize + 1));
+			    realloc(rdata->data, bl->dsize + 1);
 			if (p == NULL)
 				return (RET_ERROR);
 			rdata->data = p;

Index: src/lib/libc/db/db/Makefile.inc
diff -u src/lib/libc/db/db/Makefile.inc:1.4 src/lib/libc/db/db/Makefile.inc:1.5
--- src/lib/libc/db/db/Makefile.inc:1.4	Mon Feb 27 08:21:22 1995
+++ src/lib/libc/db/db/Makefile.inc	Sat Nov 30 19:22:48 2013
@@ -1,6 +1,6 @@
-#	$NetBSD: Makefile.inc,v 1.4 1995/02/27 13:21:22 cgd Exp $
+#	$NetBSD: Makefile.inc,v 1.5 2013/12/01 00:22:48 christos Exp $
 #       @(#)Makefile.inc	8.1 (Berkeley) 6/4/93
 
 .PATH: ${.CURDIR}/db/db
 
-SRCS+=	db.c
+SRCS+=	db.c dbfile.c

Index: src/lib/libc/db/hash/hash.c
diff -u src/lib/libc/db/hash/hash.c:1.32 src/lib/libc/db/hash/hash.c:1.33
--- src/lib/libc/db/hash/hash.c:1.32	Tue Mar 13 17:13:32 2012
+++ src/lib/libc/db/hash/hash.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: hash.c,v 1.32 2012/03/13 21:13:32 christos Exp $	*/
+/*	$NetBSD: hash.c,v 1.33 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: hash.c,v 1.32 2012/03/13 21:13:32 christos Exp $");
+__RCSID("$NetBSD: hash.c,v 1.33 2013/12/01 00:22:48 christos Exp $");
 
 #include "namespace.h"
 #include <sys/param.h>
@@ -128,12 +128,8 @@ __hash_open(const char *file, int flags,
 		new_table = 1;
 	}
 	if (file) {
-		if ((hashp->fp = open(file, flags, mode)) == -1)
+		if ((hashp->fp = __dbopen(file, flags, mode, &statbuf)) == -1)
 			RETURN_ERROR(errno, error0);
-		if (fcntl(hashp->fp, F_SETFD, FD_CLOEXEC) == -1)
-			RETURN_ERROR(errno, error1);
-		if (fstat(hashp->fp, &statbuf) == -1)
-			RETURN_ERROR(errno, error1);
 		new_table |= statbuf.st_size == 0;
 	}
 	if (new_table) {
@@ -196,7 +192,7 @@ __hash_open(const char *file, int flags,
 	hashp->new_file = new_table;
 	hashp->save_file = file && (hashp->flags & O_RDWR);
 	hashp->cbucket = -1;
-	if (!(dbp = malloc(sizeof(DB)))) {
+	if (!(dbp = malloc(sizeof(*dbp)))) {
 		save_errno = errno;
 		hdestroy(hashp);
 		errno = save_errno;

Index: src/lib/libc/db/hash/hash_page.c
diff -u src/lib/libc/db/hash/hash_page.c:1.25 src/lib/libc/db/hash/hash_page.c:1.26
--- src/lib/libc/db/hash/hash_page.c:1.25	Tue Mar 13 17:13:33 2012
+++ src/lib/libc/db/hash/hash_page.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: hash_page.c,v 1.25 2012/03/13 21:13:33 christos Exp $	*/
+/*	$NetBSD: hash_page.c,v 1.26 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: hash_page.c,v 1.25 2012/03/13 21:13:33 christos Exp $");
+__RCSID("$NetBSD: hash_page.c,v 1.26 2013/12/01 00:22:48 christos Exp $");
 
 /*
  * PACKAGE:  hashing
@@ -52,7 +52,6 @@ __RCSID("$NetBSD: hash_page.c,v 1.25 201
  *	__add_ovflpage
  * Internal
  *	overflow_page
- *	open_temp
  */
 
 #include "namespace.h"
@@ -76,7 +75,6 @@ __RCSID("$NetBSD: hash_page.c,v 1.25 201
 
 static uint32_t	*fetch_bitmap(HTAB *, int);
 static uint32_t	 first_free(uint32_t);
-static int	 open_temp(HTAB *);
 static uint16_t	 overflow_page(HTAB *);
 static void	 putpair(char *, const DBT *, const DBT *);
 static void	 squeeze_key(uint16_t *, const DBT *, const DBT *);
@@ -597,7 +595,7 @@ __put_page(HTAB *hashp, char *p, uint32_
 	ssize_t wsize;
 
 	size = hashp->BSIZE;
-	if ((hashp->fp == -1) && open_temp(hashp))
+	if ((hashp->fp == -1) && (hashp->fp = __dbtemp("_hash", NULL)) == -1)
 		return (-1);
 	fd = hashp->fp;
 
@@ -859,42 +857,6 @@ __free_ovflpage(HTAB *hashp, BUFHEAD *ob
 }
 
 /*
- * Returns:
- *	 0 success
- *	-1 failure
- */
-static int
-open_temp(HTAB *hashp)
-{
-	sigset_t set, oset;
-	char *envtmp;
-	char namestr[PATH_MAX];
-	int len;
-
-	if (issetugid())
-		envtmp = NULL;
-	else
-		envtmp = getenv("TMPDIR");
-
-	len = snprintf(namestr, sizeof(namestr), "%s/_hashXXXXXX",
-	    envtmp ? envtmp : _PATH_TMP);
-	if (len < 0 || (size_t)len >= sizeof(namestr)) {
-		errno = ENAMETOOLONG;
-		return -1;
-	}
-
-	/* Block signals; make sure file goes away at process exit. */
-	(void)sigfillset(&set);
-	(void)sigprocmask(SIG_BLOCK, &set, &oset);
-	if ((hashp->fp = mkstemp(namestr)) != -1) {
-		(void)unlink(namestr);
-		(void)fcntl(hashp->fp, F_SETFD, FD_CLOEXEC);
-	}
-	(void)sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL);
-	return (hashp->fp != -1 ? 0 : -1);
-}
-
-/*
  * We have to know that the key will fit, but the last entry on the page is
  * an overflow pair, so we need to shift things.
  */

Index: src/lib/libc/db/recno/rec_open.c
diff -u src/lib/libc/db/recno/rec_open.c:1.19 src/lib/libc/db/recno/rec_open.c:1.20
--- src/lib/libc/db/recno/rec_open.c:1.19	Sun Jun 26 18:27:14 2011
+++ src/lib/libc/db/recno/rec_open.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rec_open.c,v 1.19 2011/06/26 22:27:14 christos Exp $	*/
+/*	$NetBSD: rec_open.c,v 1.20 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: rec_open.c,v 1.19 2011/06/26 22:27:14 christos Exp $");
+__RCSID("$NetBSD: rec_open.c,v 1.20 2013/12/01 00:22:48 christos Exp $");
 
 #include "namespace.h"
 #include <sys/types.h>
@@ -70,15 +70,8 @@ __rec_open(const char *fname, int flags,
 	dbp = NULL;
 	/* Open the user's file -- if this fails, we're done. */
 	if (fname != NULL) {
-#ifndef O_CLOEXEC
-#define O_CLOEXEC 0
-#endif
-		if ((rfd = open(fname, flags | O_CLOEXEC, mode)) == -1)
+		if ((rfd = __dbopen(fname, flags, mode, NULL)) == -1)
 			return NULL;
-#if O_CLOEXEC == 0
-		if (fcntl(rfd, F_SETFD, FD_CLOEXEC) == -1)
-			goto err;
-#endif
 	}
 
 	/* Create a btree in memory (backed by disk). */
Index: src/lib/libc/db/recno/rec_put.c
diff -u src/lib/libc/db/recno/rec_put.c:1.19 src/lib/libc/db/recno/rec_put.c:1.20
--- src/lib/libc/db/recno/rec_put.c:1.19	Sun Jun 26 18:18:16 2011
+++ src/lib/libc/db/recno/rec_put.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rec_put.c,v 1.19 2011/06/26 22:18:16 christos Exp $	*/
+/*	$NetBSD: rec_put.c,v 1.20 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -34,7 +34,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: rec_put.c,v 1.19 2011/06/26 22:18:16 christos Exp $");
+__RCSID("$NetBSD: rec_put.c,v 1.20 2013/12/01 00:22:48 christos Exp $");
 
 #include "namespace.h"
 #include <sys/types.h>
@@ -146,8 +146,7 @@ einval:		errno = EINVAL;
 			return (RET_ERROR);
 		if (nrec > t->bt_nrecs + 1) {
 			if (F_ISSET(t, R_FIXLEN)) {
-				if ((tdata.data =
-				    (void *)malloc(t->bt_reclen)) == NULL)
+				if ((tdata.data = malloc(t->bt_reclen)) == NULL)
 					return (RET_ERROR);
 				tdata.size = t->bt_reclen;
 				memset(tdata.data, t->bt_bval, tdata.size);

Index: src/lib/libc/db/recno/rec_utils.c
diff -u src/lib/libc/db/recno/rec_utils.c:1.12 src/lib/libc/db/recno/rec_utils.c:1.13
--- src/lib/libc/db/recno/rec_utils.c:1.12	Wed Sep 10 13:52:36 2008
+++ src/lib/libc/db/recno/rec_utils.c	Sat Nov 30 19:22:48 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rec_utils.c,v 1.12 2008/09/10 17:52:36 joerg Exp $	*/
+/*	$NetBSD: rec_utils.c,v 1.13 2013/12/01 00:22:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993, 1994
@@ -34,7 +34,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: rec_utils.c,v 1.12 2008/09/10 17:52:36 joerg Exp $");
+__RCSID("$NetBSD: rec_utils.c,v 1.13 2013/12/01 00:22:48 christos Exp $");
 
 #include <sys/param.h>
 
@@ -70,17 +70,17 @@ __rec_ret(BTREE *t, EPG *e, recno_t nrec
 		goto dataonly;
 
 	/* We have to copy the key, it's not on the page. */
-	if (sizeof(recno_t) > t->bt_rkey.size) {
-		p = (void *)(t->bt_rkey.data == NULL ?
-		    malloc(sizeof(recno_t)) :
-		    realloc(t->bt_rkey.data, sizeof(recno_t)));
+	if (sizeof(nrec) > t->bt_rkey.size) {
+		p = t->bt_rkey.data == NULL ?
+		    malloc(sizeof(nrec)) :
+		    realloc(t->bt_rkey.data, sizeof(nrec));
 		if (p == NULL)
 			return (RET_ERROR);
 		t->bt_rkey.data = p;
-		t->bt_rkey.size = sizeof(recno_t);
+		t->bt_rkey.size = sizeof(nrec);
 	}
-	memmove(t->bt_rkey.data, &nrec, sizeof(recno_t));
-	key->size = sizeof(recno_t);
+	memmove(t->bt_rkey.data, &nrec, sizeof(nrec));
+	key->size = sizeof(nrec);
 	key->data = t->bt_rkey.data;
 
 dataonly:
@@ -101,9 +101,9 @@ dataonly:
 	} else if (F_ISSET(t, B_DB_LOCK)) {
 		/* Use +1 in case the first record retrieved is 0 length. */
 		if (rl->dsize + 1 > t->bt_rdata.size) {
-			p = (void *)(t->bt_rdata.data == NULL ?
+			p = t->bt_rdata.data == NULL ?
 			    malloc(rl->dsize + 1) :
-			    realloc(t->bt_rdata.data, rl->dsize + 1));
+			    realloc(t->bt_rdata.data, rl->dsize + 1);
 			if (p == NULL)
 				return (RET_ERROR);
 			t->bt_rdata.data = p;

Added files:

Index: src/lib/libc/db/db/dbfile.c
diff -u /dev/null src/lib/libc/db/db/dbfile.c:1.1
--- /dev/null	Sat Nov 30 19:22:49 2013
+++ src/lib/libc/db/db/dbfile.c	Sat Nov 30 19:22:48 2013
@@ -0,0 +1,118 @@
+/*	$NetBSD: dbfile.c,v 1.1 2013/12/01 00:22:48 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, 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.
+ */
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: dbfile.c,v 1.1 2013/12/01 00:22:48 christos Exp $");
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <paths.h>
+#include <db.h>
+
+int
+__dbopen(const char *file, int flags, mode_t mode, struct stat *sb)
+{
+	int fd;
+	int serrno;
+
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
+	if ((fd = open(file, flags | O_CLOEXEC, mode)) == -1)
+		return -1;
+
+#if O_CLOEXEC == 0
+	if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+		goto out;
+#endif
+
+	if (sb && fstat(fd, sb) == -1)
+		goto out;
+
+	return fd;
+out:
+	serrno = errno;
+	close(fd);
+	errno = serrno;
+	return -1;
+	
+}
+
+int
+__dbtemp(const char *prefix, struct stat *sb)
+{
+	sigset_t set, oset;
+	int len;
+	int fd, serrno;
+	char *envtmp;
+	char path[PATH_MAX];
+
+	if (issetugid())
+		envtmp = NULL;
+	else
+		envtmp = getenv("TMPDIR");
+
+	len = snprintf(path, sizeof(path), "%s/%sXXXXXX",
+	    envtmp ? envtmp : _PATH_TMP, prefix);
+	if ((size_t)len >= sizeof(path)) {
+		errno = ENAMETOOLONG;
+		return -1;
+	}
+	
+	(void)sigfillset(&set);
+	(void)sigprocmask(SIG_BLOCK, &set, &oset);
+
+	if ((fd = mkstemp(path)) != -1) {
+		if (unlink(path) == -1)
+			goto out;
+
+		if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+			goto out;
+
+		if (sb && fstat(fd, sb) == -1)
+			goto out;
+	}
+	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
+	return fd;
+out:
+	serrno = errno;
+	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
+	close(fd);
+	errno = serrno;
+	return -1;
+}

Reply via email to