00001 /*- 00002 * See the file LICENSE for redistribution information. 00003 * 00004 * Copyright (c) 1997, 1998, 1999, 2000 00005 * Sleepycat Software. All rights reserved. 00006 */ 00007 00008 #include "config.h" 00009 00010 #ifndef lint 00011 static const char revid[] = "$Id: os__open_8c-source.html,v 1.1 2008年06月08日 10:21:26 sebdiaz Exp $"; 00012 #endif /* not lint */ 00013 00014 #ifndef NO_SYSTEM_INCLUDES 00015 #include <sys/types.h> 00016 00017 #include <fcntl.h> 00018 #include <string.h> 00019 #endif 00020 00021 #include "db_int.h" 00022 00023 /* 00024 * CDB___os_open -- 00025 * Open a file. 00026 * 00027 * PUBLIC: int CDB___os_open __P((DB_ENV *, const char *, u_int32_t, int, DB_FH *)); 00028 */ 00029 int 00030 CDB___os_open(dbenv, name, flags, mode, fhp) 00031 DB_ENV *dbenv; 00032 const char *name; 00033 u_int32_t flags; 00034 int mode; 00035 DB_FH *fhp; 00036 { 00037 int oflags, ret; 00038 00039 oflags = 0; 00040 00041 /* 00042 * DB requires the POSIX 1003.1 semantic that two files opened at the 00043 * same time with DB_OSO_CREATE/O_CREAT and DB_OSO_EXCL/O_EXCL flags 00044 * set return an EEXIST failure in at least one. 00045 */ 00046 if (LF_ISSET(DB_OSO_CREATE)) 00047 oflags |= O_CREAT; 00048 00049 if (LF_ISSET(DB_OSO_EXCL)) 00050 oflags |= O_EXCL; 00051 00052 #if defined(O_DSYNC) && defined(XXX_NEVER_SET) 00053 /* 00054 * !!! 00055 * We should get better performance if we push the log files to disk 00056 * immediately instead of waiting for the sync. However, Solaris 00057 * (and likely any other system based on the 4BSD filesystem releases), 00058 * doesn't implement O_DSYNC correctly, only flushing data blocks and 00059 * not inode or indirect blocks. 00060 */ 00061 if (LF_ISSET(DB_OSO_LOG)) 00062 oflags |= O_DSYNC; 00063 #endif 00064 00065 if (LF_ISSET(DB_OSO_RDONLY)) 00066 oflags |= O_RDONLY; 00067 else 00068 oflags |= O_RDWR; 00069 00070 if (LF_ISSET(DB_OSO_TRUNC)) 00071 oflags |= O_TRUNC; 00072 00073 /* Open the file. */ 00074 if ((ret = CDB___os_openhandle(dbenv, name, oflags, mode, fhp)) != 0) 00075 return (ret); 00076 00077 /* 00078 * Delete any temporary file. 00079 * 00080 * !!! 00081 * There's a race here, where we've created a file and we crash before 00082 * we can unlink it. Temporary files aren't common in DB, regardless, 00083 * it's not a security problem because the file is empty. There's no 00084 * reasonable way to avoid the race (playing signal games isn't worth 00085 * the portability nightmare), so we just live with it. 00086 */ 00087 if (LF_ISSET(DB_OSO_TEMP)) 00088 (void)CDB___os_unlink(dbenv, name); 00089 00090 return (0); 00091 }