1 /*-------------------------------------------------------------------------
4 * Win32 open() replacement
7 * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
9 * $PostgreSQL: pgsql/src/port/open.c,v 1.9 2005/03/24 04:36:20 momjian Exp $
11 *-------------------------------------------------------------------------
22 int win32_open(const char *fileName, int fileFlags, ...);
25 openFlagsToCreateFileFlags(int openFlags)
27 switch (openFlags & (O_CREAT | O_TRUNC | O_EXCL))
37 case O_TRUNC | O_EXCL:
38 return TRUNCATE_EXISTING;
40 case O_CREAT | O_TRUNC:
43 case O_CREAT | O_EXCL:
44 case O_CREAT | O_TRUNC | O_EXCL:
48 /* will never get here */
53 * - file attribute setting, based on fileMode?
54 * - handle other flags? (eg FILE_FLAG_NO_BUFFERING/FILE_FLAG_WRITE_THROUGH)
57 win32_open(const char *fileName, int fileFlags,...)
61 SECURITY_ATTRIBUTES sa;
63 /* Check that we can handle the request */
64 assert((fileFlags & ((O_RDONLY | O_WRONLY | O_RDWR) | O_APPEND |
65 (O_RANDOM | O_SEQUENTIAL | O_TEMPORARY) |
66 _O_SHORT_LIVED | O_DSYNC |
67 (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);
69 sa.nLength = sizeof(sa);
70 sa.bInheritHandle = TRUE;
71 sa.lpSecurityDescriptor = NULL;
73 if ((h = CreateFile(fileName,
74 /* cannot use O_RDONLY, as it == 0 */
75 (fileFlags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
76 ((fileFlags & O_WRONLY) ? GENERIC_WRITE : GENERIC_READ),
77 /* These flags allow concurrent rename/unlink */
78 (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
80 openFlagsToCreateFileFlags(fileFlags),
81 FILE_ATTRIBUTE_NORMAL |
82 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
83 ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
84 ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
85 ((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0)|
86 ((fileFlags & O_DSYNC) ? FILE_FLAG_WRITE_THROUGH : 0),
87 NULL)) == INVALID_HANDLE_VALUE)
89 switch (GetLastError())
91 /* EMFILE, ENFILE should not occur from CreateFile. */
92 case ERROR_PATH_NOT_FOUND:
93 case ERROR_FILE_NOT_FOUND:
96 case ERROR_FILE_EXISTS:
99 case ERROR_ACCESS_DENIED:
108 /* _open_osfhandle will, on error, set errno accordingly */
109 if ((fd = _open_osfhandle((long) h, fileFlags & O_APPEND)) < 0 ||
110 (fileFlags & (O_TEXT | O_BINARY) && (_setmode(fd, fileFlags & (O_TEXT | O_BINARY)) < 0)))
111 CloseHandle(h); /* will not affect errno */