43 int r = unlink(filename);
45 int unlink_errno = errno;
46 if (unlink_errno == ECHILD && !
path_exists(filename)) {
56 #elif defined __WIN32__
66 posixy_set_errno_from_getlasterror()
69 unsigned long winerr = GetLastError();
71 case ERROR_FILENAME_EXCED_RANGE:
72 case ERROR_FILE_NOT_FOUND:
73 case ERROR_PATH_NOT_FOUND:
74 case ERROR_INVALID_DRIVE:
75 case ERROR_NO_MORE_FILES:
76 case ERROR_BAD_NETPATH:
77 case ERROR_BAD_NET_NAME:
78 case ERROR_BAD_PATHNAME:
81 case ERROR_ARENA_TRASHED:
82 case ERROR_NOT_ENOUGH_MEMORY:
83 case ERROR_INVALID_BLOCK:
84 case ERROR_NOT_ENOUGH_QUOTA:
87 case ERROR_LOCK_VIOLATION:
88 case ERROR_LOCK_FAILED:
89 case ERROR_SEEK_ON_DEVICE:
90 case ERROR_NETWORK_ACCESS_DENIED:
91 case ERROR_NOT_LOCKED:
92 case ERROR_ACCESS_DENIED:
93 case ERROR_CANNOT_MAKE:
95 case ERROR_DRIVE_LOCKED:
96 case ERROR_CURRENT_DIRECTORY:
99 case ERROR_INVALID_FUNCTION:
100 case ERROR_INVALID_ACCESS:
101 case ERROR_NEGATIVE_SEEK:
102 case ERROR_INVALID_DATA:
103 case ERROR_INVALID_PARAMETER:
106 case ERROR_NO_PROC_SLOTS:
107 case ERROR_NESTING_NOT_ALLOWED:
108 case ERROR_MAX_THRDS_REACHED:
111 case ERROR_INVALID_HANDLE:
112 case ERROR_INVALID_TARGET_HANDLE:
113 case ERROR_DIRECT_ACCESS_HANDLE:
116 case ERROR_ALREADY_EXISTS:
117 case ERROR_FILE_EXISTS:
120 case ERROR_BROKEN_PIPE:
123 case ERROR_DISK_FULL:
126 case ERROR_TOO_MANY_OPEN_FILES:
129 case ERROR_WAIT_NO_CHILDREN:
130 case ERROR_CHILD_NOT_COMPLETE:
133 case ERROR_DIR_NOT_EMPTY:
136 case ERROR_BAD_ENVIRONMENT:
139 case ERROR_BAD_FORMAT:
142 case ERROR_NOT_SAME_DEVICE:
146 if (winerr >= ERROR_WRITE_PROTECT && winerr <= ERROR_SHARING_BUFFER_EXCEEDED)
148 else if (winerr >= ERROR_INVALID_STARTING_CODESEG && winerr <= ERROR_INFLOOP_IN_RELOC_CHAIN)
162 if (DeleteFile(filename) != 0) {
166 return posixy_set_errno_from_getlasterror();
173 DWORD dwDesiredAccess = GENERIC_READ;
174 switch (flags & (O_RDONLY | O_RDWR | O_WRONLY)) {
176 dwDesiredAccess = GENERIC_READ;
179 dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
182 dwDesiredAccess = GENERIC_WRITE;
186 DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
189 DWORD dwCreationDisposition = OPEN_EXISTING;
190 switch (flags & (O_CREAT | O_TRUNC | O_EXCL)) {
192 dwCreationDisposition = OPEN_EXISTING;
196 dwCreationDisposition = OPEN_ALWAYS;
199 case O_CREAT | O_TRUNC:
200 dwCreationDisposition = CREATE_ALWAYS;
203 case O_CREAT | O_EXCL:
204 case O_CREAT | O_TRUNC | O_EXCL:
205 dwCreationDisposition = CREATE_NEW;
209 case O_TRUNC | O_EXCL:
210 dwCreationDisposition = TRUNCATE_EXISTING;
219 dwCreationDisposition,
220 FILE_ATTRIBUTE_NORMAL,
222 if (handleWin == INVALID_HANDLE_VALUE) {
223 return posixy_set_errno_from_getlasterror();
227 return _open_osfhandle(intptr_t(handleWin), flags|
O_BINARY);
233 if (MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) != 0) {
237 return posixy_set_errno_from_getlasterror();
Utility functions for testing files.
bool path_exists(const char *path)
Test if a path exists.
Provides wrappers with POSIXy semantics.
#define posixy_rename(F, T)
include <fcntl.h>, but working around broken platforms.
include <windows.h> without all the bloat and damage.