Update from db-2.3.12.
[kopensolaris-gnu/glibc.git] / db2 / os / os_open.c
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1997
5  *      Sleepycat Software.  All rights reserved.
6  */
7
8 #include "config.h"
9
10 #ifndef lint
11 static const char sccsid[] = "@(#)os_open.c     10.19 (Sleepycat) 10/28/97";
12 #endif /* not lint */
13
14 #ifndef NO_SYSTEM_INCLUDES
15 #include <sys/types.h>
16
17 #include <errno.h>
18 #include <fcntl.h>
19 #include <unistd.h>
20 #endif
21
22 #include "db_int.h"
23
24 /*
25  * __db_open --
26  *      Open a file descriptor.
27  *
28  * PUBLIC: int __db_open __P((const char *, int, int, int, int *));
29  */
30 int
31 __db_open(name, arg_flags, ok_flags, mode, fdp)
32         const char *name;
33         int arg_flags, ok_flags, mode, *fdp;
34 {
35         int fd, flags;
36
37         if (arg_flags & ~ok_flags)
38                 return (EINVAL);
39
40         flags = 0;
41         if (arg_flags & DB_CREATE)
42                 flags |= O_CREAT;
43
44         if (arg_flags & DB_EXCL)
45                 flags |= O_EXCL;
46
47         if (arg_flags & DB_RDONLY)
48                 flags |= O_RDONLY;
49         else
50                 flags |= O_RDWR;
51
52 #ifdef _WIN32
53 #ifdef _MSC_VER
54         if (arg_flags & DB_SEQUENTIAL)
55                 flags |= _O_SEQUENTIAL;
56         else
57                 flags |= _O_RANDOM;
58
59         if (arg_flags & DB_TEMPORARY)
60                 flags |= _O_TEMPORARY;
61 #endif
62         flags |= O_BINARY | O_NOINHERIT;
63 #endif
64
65         if (arg_flags & DB_TRUNCATE)
66                 flags |= O_TRUNC;
67
68         /* Open the file. */
69         if ((fd = __os_open(name, flags, mode)) == -1)
70                 return (errno);
71
72 #ifndef _WIN32
73         /* Delete any temporary file; done for Win32 by _O_TEMPORARY. */
74         if (arg_flags & DB_TEMPORARY)
75                 (void)__os_unlink(name);
76 #endif
77
78 #if !defined(_WIN32) && !defined(macintosh)
79         /*
80          * Deny access to any child process; done for Win32 by O_NOINHERIT,
81          * MacOS has neither child processes nor fd inheritance.
82          */
83         if (fcntl(fd, F_SETFD, 1) == -1) {
84                 int ret = errno;
85
86                 (void)__os_close(fd);
87                 return (ret);
88         }
89 #endif
90         *fdp = fd;
91         return (0);
92 }
93
94 /*
95  * __db_close --
96  *      Close a file descriptor.
97  *
98  * PUBLIC: int __db_close __P((int));
99  */
100 int
101 __db_close(fd)
102         int fd;
103 {
104         return (__os_close(fd) ? errno : 0);
105 }