diff options
Diffstat (limited to 'bdb/os/os_open.c')
-rw-r--r-- | bdb/os/os_open.c | 257 |
1 files changed, 0 insertions, 257 deletions
diff --git a/bdb/os/os_open.c b/bdb/os/os_open.c deleted file mode 100644 index 0a4dbadc6e8..00000000000 --- a/bdb/os/os_open.c +++ /dev/null @@ -1,257 +0,0 @@ -/*- - * See the file LICENSE for redistribution information. - * - * Copyright (c) 1997-2002 - * Sleepycat Software. All rights reserved. - */ - -#include "db_config.h" - -#ifndef lint -static const char revid[] = "$Id: os_open.c,v 11.37 2002/06/21 20:35:16 sandstro Exp $"; -#endif /* not lint */ - -#ifndef NO_SYSTEM_INCLUDES -#include <sys/types.h> - -#include <fcntl.h> -#include <string.h> -#endif - -#include "db_int.h" - -#ifdef HAVE_QNX -static int __os_region_open __P((DB_ENV *, const char *, int, int, DB_FH *)); -#endif - -/* - * __os_open -- - * Open a file. - * - * PUBLIC: int __os_open __P((DB_ENV *, const char *, u_int32_t, int, DB_FH *)); - */ -int -__os_open(dbenv, name, flags, mode, fhp) - DB_ENV *dbenv; - const char *name; - u_int32_t flags; - int mode; - DB_FH *fhp; -{ - int oflags, ret; - - oflags = 0; - -#ifdef DIAGNOSTIC -#define OKFLAGS \ - (DB_OSO_CREATE | DB_OSO_DIRECT | DB_OSO_EXCL | DB_OSO_LOG | \ - DB_OSO_RDONLY | DB_OSO_REGION | DB_OSO_SEQ | DB_OSO_TEMP | \ - DB_OSO_TRUNC) - if ((ret = __db_fchk(dbenv, "__os_open", flags, OKFLAGS)) != 0) - return (ret); -#endif - -#if defined(O_BINARY) - /* - * If there's a binary-mode open flag, set it, we never want any - * kind of translation. Some systems do translations by default, - * e.g., with Cygwin, the default mode for an open() is set by the - * mode of the mount that underlies the file. - */ - oflags |= O_BINARY; -#endif - - /* - * 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; - -#ifdef HAVE_O_DIRECT - if (LF_ISSET(DB_OSO_DIRECT)) - oflags |= O_DIRECT; -#endif - -#ifdef HAVE_QNX - if (LF_ISSET(DB_OSO_REGION)) - return (__os_region_open(dbenv, name, oflags, mode, fhp)); -#endif - /* Open the file. */ - if ((ret = __os_openhandle(dbenv, name, oflags, mode, fhp)) != 0) - return (ret); - -#ifdef HAVE_DIRECTIO - if (LF_ISSET(DB_OSO_DIRECT)) - (void)directio(fhp->fd, DIRECTIO_ON); -#endif - - /* - * Delete any temporary file. - * - * !!! - * There's a race here, where we've created a file and we crash before - * we can unlink it. Temporary files aren't common in DB, regardless, - * it's not a security problem because the file is empty. There's no - * reasonable way to avoid the race (playing signal games isn't worth - * the portability nightmare), so we just live with it. - */ - if (LF_ISSET(DB_OSO_TEMP)) { -#if defined(HAVE_UNLINK_WITH_OPEN_FAILURE) || defined(CONFIG_TEST) - if ((ret = __os_strdup(dbenv, name, &fhp->name)) != 0) { - (void)__os_closehandle(dbenv, fhp); - (void)__os_unlink(dbenv, name); - return (ret); - } - F_SET(fhp, DB_FH_UNLINK); -#else - (void)__os_unlink(dbenv, name); -#endif - } - - return (0); -} - -#ifdef HAVE_QNX -/* - * __os_region_open -- - * Open a shared memory region file using POSIX shm_open. - */ -static int -__os_region_open(dbenv, name, oflags, mode, fhp) - DB_ENV *dbenv; - const char *name; - int oflags; - int mode; - DB_FH *fhp; -{ - int ret; - char *newname; - - if ((ret = __os_shmname(dbenv, name, &newname)) != 0) - goto err; - memset(fhp, 0, sizeof(*fhp)); - fhp->fd = shm_open(newname, oflags, mode); - if (fhp->fd == -1) - ret = __os_get_errno(); - else { -#ifdef HAVE_FCNTL_F_SETFD - /* Deny file descriptor acces to any child process. */ - if (fcntl(fhp->fd, F_SETFD, 1) == -1) { - ret = __os_get_errno(); - __db_err(dbenv, "fcntl(F_SETFD): %s", strerror(ret)); - __os_closehandle(dbenv, fhp); - } else -#endif - F_SET(fhp, DB_FH_VALID); - } - /* - * Once we have created the object, we don't need the name - * anymore. Other callers of this will convert themselves. - */ -err: - if (newname != NULL) - __os_free(dbenv, newname); - return (ret); -} - -/* - * __os_shmname -- - * Translate a pathname into a shm_open memory object name. - * - * PUBLIC: #ifdef HAVE_QNX - * PUBLIC: int __os_shmname __P((DB_ENV *, const char *, char **)); - * PUBLIC: #endif - */ -int -__os_shmname(dbenv, name, newnamep) - DB_ENV *dbenv; - const char *name; - char **newnamep; -{ - int ret; - size_t size; - char *p, *q, *tmpname; - - *newnamep = NULL; - - /* - * POSIX states that the name for a shared memory object - * may begin with a slash '/' and support for subsequent - * slashes is implementation-dependent. The one implementation - * we know of right now, QNX, forbids subsequent slashes. - * We don't want to be parsing pathnames for '.' and '..' in - * the middle. In order to allow easy conversion, just take - * the last component as the shared memory name. This limits - * the namespace a bit, but makes our job a lot easier. - * - * We should not be modifying user memory, so we use our own. - * Caller is responsible for freeing the memory we give them. - */ - if ((ret = __os_strdup(dbenv, name, &tmpname)) != 0) - return (ret); - /* - * Skip over filename component. - * We set that separator to '\0' so that we can do another - * __db_rpath. However, we immediately set it then to ':' - * so that we end up with the tailing directory:filename. - * We require a home directory component. Return an error - * if there isn't one. - */ - p = __db_rpath(tmpname); - if (p == NULL) - return (EINVAL); - if (p != tmpname) { - *p = '\0'; - q = p; - p = __db_rpath(tmpname); - *q = ':'; - } - if (p != NULL) { - /* - * If we have a path component, copy and return it. - */ - ret = __os_strdup(dbenv, p, newnamep); - __os_free(dbenv, tmpname); - return (ret); - } - - /* - * We were given just a directory name with no path components. - * Add a leading slash, and copy the remainder. - */ - size = strlen(tmpname) + 2; - if ((ret = __os_malloc(dbenv, size, &p)) != 0) - return (ret); - p[0] = '/'; - memcpy(&p[1], tmpname, size-1); - __os_free(dbenv, tmpname); - *newnamep = p; - return (0); -} -#endif |