1 /*-------------------------------------------------------------------------
4 * Win32 open() replacement
7 * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
9 * $PostgreSQL: pgsql/src/port/open.c,v 1.2 2004/04/19 17:42:59 momjian Exp $
11 *-------------------------------------------------------------------------
22 openFlagsToCreateFileFlags(int openFlags)
24 switch (openFlags & (O_CREAT|O_TRUNC|O_EXCL))
27 case O_EXCL: return OPEN_EXISTING;
29 case O_CREAT: return OPEN_ALWAYS;
32 case O_TRUNC|O_EXCL: return TRUNCATE_EXISTING;
34 case O_CREAT|O_TRUNC: return CREATE_ALWAYS;
37 case O_CREAT|O_TRUNC|O_EXCL: return CREATE_NEW;
40 /* will never get here */
45 * - file attribute setting, based on fileMode?
46 * - handle other flags? (eg FILE_FLAG_NO_BUFFERING/FILE_FLAG_WRITE_THROUGH)
48 int win32_open(const char* fileName, int fileFlags, ...)
52 SECURITY_ATTRIBUTES sa;
54 /* Check that we can handle the request */
55 assert((fileFlags & ((O_RDONLY|O_WRONLY|O_RDWR) | O_APPEND |
56 (O_RANDOM|O_SEQUENTIAL|O_TEMPORARY) |
58 (O_CREAT|O_TRUNC|O_EXCL) | (O_TEXT|O_BINARY))) == fileFlags);
60 sa.nLength=sizeof(sa);
61 sa.bInheritHandle=TRUE;
62 sa.lpSecurityDescriptor=NULL;
64 if ((h = CreateFile(fileName,
65 /* cannot use O_RDONLY, as it == 0 */
66 (fileFlags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
67 ((fileFlags & O_WRONLY) ? GENERIC_WRITE : GENERIC_READ),
68 (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE),
70 openFlagsToCreateFileFlags(fileFlags),
71 FILE_ATTRIBUTE_NORMAL |
72 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
73 ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
74 ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
75 ((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0),
76 NULL)) == INVALID_HANDLE_VALUE)
78 switch (GetLastError())
80 /* EMFILE, ENFILE should not occur from CreateFile. */
81 case ERROR_PATH_NOT_FOUND:
82 case ERROR_FILE_NOT_FOUND: errno = ENOENT; break;
83 case ERROR_FILE_EXISTS: errno = EEXIST; break;
84 case ERROR_ACCESS_DENIED: errno = EACCES; break;
91 /* _open_osfhandle will, on error, set errno accordingly */
92 if ((fd = _open_osfhandle((long)h,fileFlags&O_APPEND)) < 0 ||
93 (fileFlags&(O_TEXT|O_BINARY) && (_setmode(fd,fileFlags&(O_TEXT|O_BINARY)) < 0)))
94 CloseHandle(h); /* will not affect errno */