1 /*-------------------------------------------------------------------------
4 * Win32 open() replacement
7 * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
9 * $PostgreSQL: pgsql/src/port/open.c,v 1.20 2007/04/13 10:30:30 mha Exp $
11 *-------------------------------------------------------------------------
24 openFlagsToCreateFileFlags(int openFlags)
26 switch (openFlags & (O_CREAT | O_TRUNC | O_EXCL))
28 /* O_EXCL is meaningless without O_CREAT */
36 /* O_EXCL is meaningless without O_CREAT */
38 case O_TRUNC | O_EXCL:
39 return TRUNCATE_EXISTING;
41 case O_CREAT | O_TRUNC:
44 /* O_TRUNC is meaningless with O_CREAT */
45 case O_CREAT | O_EXCL:
46 case O_CREAT | O_TRUNC | O_EXCL:
50 /* will never get here */
55 * - file attribute setting, based on fileMode?
58 pgwin32_open(const char *fileName, int fileFlags,...)
62 SECURITY_ATTRIBUTES sa;
64 /* Check that we can handle the request */
65 assert((fileFlags & ((O_RDONLY | O_WRONLY | O_RDWR) | O_APPEND |
66 (O_RANDOM | O_SEQUENTIAL | O_TEMPORARY) |
67 _O_SHORT_LIVED | O_DSYNC | O_DIRECT |
68 (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);
70 sa.nLength = sizeof(sa);
71 sa.bInheritHandle = TRUE;
72 sa.lpSecurityDescriptor = NULL;
74 if ((h = CreateFile(fileName,
75 /* cannot use O_RDONLY, as it == 0 */
76 (fileFlags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
77 ((fileFlags & O_WRONLY) ? GENERIC_WRITE : GENERIC_READ),
78 /* These flags allow concurrent rename/unlink */
79 (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
81 openFlagsToCreateFileFlags(fileFlags),
82 FILE_ATTRIBUTE_NORMAL |
83 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
84 ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
85 ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
86 ((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0) |
87 ((fileFlags & O_DIRECT) ? FILE_FLAG_NO_BUFFERING : 0) |
88 ((fileFlags & O_DSYNC) ? FILE_FLAG_WRITE_THROUGH : 0),
89 NULL)) == INVALID_HANDLE_VALUE)
91 switch (GetLastError())
93 /* EMFILE, ENFILE should not occur from CreateFile. */
94 case ERROR_PATH_NOT_FOUND:
95 case ERROR_FILE_NOT_FOUND:
98 case ERROR_FILE_EXISTS:
101 case ERROR_ACCESS_DENIED:
110 /* _open_osfhandle will, on error, set errno accordingly */
111 if ((fd = _open_osfhandle((long) h, fileFlags & O_APPEND)) < 0)
112 CloseHandle(h); /* will not affect errno */
113 else if (fileFlags & (O_TEXT | O_BINARY) &&
114 _setmode(fd, fileFlags & (O_TEXT | O_BINARY)) < 0)
124 pgwin32_fopen(const char *fileName, const char *mode)
129 if (strstr(mode, "r+"))
131 else if (strchr(mode, 'r'))
132 openmode |= O_RDONLY;
133 if (strstr(mode, "w+"))
134 openmode |= O_RDWR | O_CREAT | O_TRUNC;
135 else if (strchr(mode, 'w'))
136 openmode |= O_WRONLY | O_CREAT | O_TRUNC;
137 if (strchr(mode, 'a'))
138 openmode |= O_WRONLY | O_CREAT | O_APPEND;
140 if (strchr(mode, 'b'))
141 openmode |= O_BINARY;
142 if (strchr(mode, 't'))
145 fd = pgwin32_open(fileName, openmode);
148 return _fdopen(fd, mode);