#include "db_config.h"
#include "db_int.h"
int
__os_open(env, name, page_size, flags, mode, fhpp)
ENV *env;
const char *name;
u_int32_t page_size, flags;
int mode;
DB_FH **fhpp;
{
DB_ENV *dbenv;
DB_FH *fhp;
int oflags, ret;
COMPQUIET(page_size, 0);
dbenv = env == NULL ? NULL : env->dbenv;
*fhpp = NULL;
oflags = 0;
if (dbenv != NULL &&
FLD_ISSET(dbenv->verbose, DB_VERB_FILEOPS | DB_VERB_FILEOPS_ALL))
__db_msg(env, "fileops: open %s", name);
#define OKFLAGS \
(DB_OSO_ABSMODE | DB_OSO_CREATE | DB_OSO_DIRECT | DB_OSO_DSYNC |\
DB_OSO_EXCL | DB_OSO_RDONLY | DB_OSO_REGION | DB_OSO_SEQ | \
DB_OSO_TEMP | DB_OSO_TRUNC)
if ((ret = __db_fchk(env, "__os_open", flags, OKFLAGS)) != 0)
return (ret);
#if defined(O_BINARY)
oflags |= O_BINARY;
#endif
if (LF_ISSET(DB_OSO_CREATE))
oflags |= O_CREAT;
if (LF_ISSET(DB_OSO_EXCL))
oflags |= O_EXCL;
#ifdef HAVE_O_DIRECT
if (LF_ISSET(DB_OSO_DIRECT))
oflags |= O_DIRECT;
#endif
#ifdef O_DSYNC
if (LF_ISSET(DB_OSO_DSYNC))
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 (dbenv != NULL &&
env->dir_mode != 0 && LF_ISSET(DB_OSO_CREATE) &&
(ret = __db_mkpath(env, name)) != 0)
return (ret);
#ifdef HAVE_QNX
if (LF_ISSET(DB_OSO_REGION))
ret = __os_qnx_region_open(env, name, oflags, mode, &fhp);
else
#endif
ret = __os_openhandle(env, name, oflags, mode, &fhp);
if (ret != 0)
return (ret);
if (LF_ISSET(DB_OSO_REGION))
F_SET(fhp, DB_FH_REGION);
#ifdef HAVE_FCHMOD
if (LF_ISSET(DB_OSO_CREATE) && LF_ISSET(DB_OSO_ABSMODE))
(void)fchmod(fhp->fd, mode);
#endif
#ifdef O_DSYNC
if (LF_ISSET(DB_OSO_DSYNC))
F_SET(fhp, DB_FH_NOSYNC);
#endif
#if defined(HAVE_DIRECTIO) && defined(DIRECTIO_ON)
if (LF_ISSET(DB_OSO_DIRECT))
(void)directio(fhp->fd, DIRECTIO_ON);
#endif
if (LF_ISSET(DB_OSO_TEMP)) {
#if defined(HAVE_UNLINK_WITH_OPEN_FAILURE) || defined(CONFIG_TEST)
F_SET(fhp, DB_FH_UNLINK);
#else
(void)__os_unlink(env, name, 0);
#endif
}
*fhpp = fhp;
return (0);
}