You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.4 KiB
110 lines
2.4 KiB
3 years ago
|
/*-
|
||
|
* See the file LICENSE for redistribution information.
|
||
|
*
|
||
|
* Copyright (c) 1997, 1998, 1999
|
||
|
* Sleepycat Software. All rights reserved.
|
||
|
*/
|
||
|
|
||
|
#include "db_config.h"
|
||
|
|
||
|
#ifndef lint
|
||
|
static const char sccsid[] = "@(#)os_open.c 11.1 (Sleepycat) 7/25/99";
|
||
|
#endif /* not lint */
|
||
|
|
||
|
#ifndef NO_SYSTEM_INCLUDES
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
#include <fcntl.h>
|
||
|
#include <signal.h>
|
||
|
#endif
|
||
|
|
||
|
#include "db_int.h"
|
||
|
|
||
|
/*
|
||
|
* CDB___os_open --
|
||
|
* Open a file.
|
||
|
*
|
||
|
* PUBLIC: int CDB___os_open __P((const char *, u_int32_t, int, DB_FH *));
|
||
|
*/
|
||
|
int
|
||
|
CDB___os_open(name, flags, mode, fhp)
|
||
|
const char *name;
|
||
|
u_int32_t flags;
|
||
|
int mode;
|
||
|
DB_FH *fhp;
|
||
|
{
|
||
|
#if defined(HAVE_SIGFILLSET)
|
||
|
sigset_t set, oset;
|
||
|
#endif
|
||
|
int oflags, ret;
|
||
|
|
||
|
oflags = 0;
|
||
|
|
||
|
/*
|
||
|
* DB requires the POSIX 1003.1 semantic that two files opened at the
|
||
|
* same time with DB_OSO_CREATE/O_CREAT and DB_OSO_EXCL/O_EXCL flags
|
||
|
* set return an EEXIST failure in at least one.
|
||
|
*/
|
||
|
if (LF_ISSET(DB_OSO_CREATE))
|
||
|
oflags |= O_CREAT;
|
||
|
|
||
|
if (LF_ISSET(DB_OSO_EXCL))
|
||
|
oflags |= O_EXCL;
|
||
|
|
||
|
#if defined(O_DSYNC) && defined(XXX_NEVER_SET)
|
||
|
/*
|
||
|
* !!!
|
||
|
* We should get better performance if we push the log files to disk
|
||
|
* immediately instead of waiting for the sync. However, Solaris
|
||
|
* (and likely any other system based on the 4BSD filesystem releases),
|
||
|
* doesn't implement O_DSYNC correctly, only flushing data blocks and
|
||
|
* not inode or indirect blocks.
|
||
|
*/
|
||
|
if (LF_ISSET(DB_OSO_LOG))
|
||
|
oflags |= O_DSYNC;
|
||
|
#endif
|
||
|
|
||
|
if (LF_ISSET(DB_OSO_RDONLY))
|
||
|
oflags |= O_RDONLY;
|
||
|
else
|
||
|
oflags |= O_RDWR;
|
||
|
|
||
|
if (LF_ISSET(DB_OSO_TRUNC))
|
||
|
oflags |= O_TRUNC;
|
||
|
|
||
|
#if defined(HAVE_SIGFILLSET)
|
||
|
/*
|
||
|
* We block every signal we can get our hands on so that the temporary
|
||
|
* file isn't left around if we're interrupted at the wrong time. Of
|
||
|
* course, if we drop core in-between the calls we'll hang forever, but
|
||
|
* that's probably okay. ;-)
|
||
|
*/
|
||
|
if (LF_ISSET(DB_OSO_TEMP)) {
|
||
|
(void)sigfillset(&set);
|
||
|
(void)sigprocmask(SIG_BLOCK, &set, &oset);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* Open the file. */
|
||
|
if ((ret = CDB___os_openhandle(name, oflags, mode, fhp)) != 0)
|
||
|
return (ret);
|
||
|
|
||
|
/* Delete any temporary file. */
|
||
|
if (LF_ISSET(DB_OSO_TEMP)) {
|
||
|
(void)CDB___os_unlink(name);
|
||
|
#if defined(HAVE_SIGFILLSET)
|
||
|
(void)sigprocmask(SIG_SETMASK, &oset, NULL);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#if defined(HAVE_FCNTL_F_SETFD)
|
||
|
/* Deny file descriptor access to any child process. */
|
||
|
if (fcntl(fhp->fd, F_SETFD, 1) == -1) {
|
||
|
ret = CDB___os_get_errno();
|
||
|
(void)CDB___os_closehandle(fhp);
|
||
|
return (ret);
|
||
|
}
|
||
|
#endif
|
||
|
return (0);
|
||
|
}
|