Skip to content

Commit 46d2339

Browse files
HydroHTobias Simetsreiter
authored andcommitted
std: fix error.Unexpected on certain Windows file operations
Closes ziglang#23690.
1 parent 0ba7433 commit 46d2339

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

lib/std/os/windows.zig

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ pub const ReadFileError = error{
605605
/// Known to be possible when:
606606
/// - Unable to read from disconnected virtual com port (Windows)
607607
AccessDenied,
608+
NotOpenForReading,
608609
Unexpected,
609610
};
610611

@@ -638,6 +639,7 @@ pub fn ReadFile(in_hFile: HANDLE, buffer: []u8, offset: ?u64) ReadFileError!usiz
638639
.NETNAME_DELETED => return error.ConnectionResetByPeer,
639640
.LOCK_VIOLATION => return error.LockViolation,
640641
.ACCESS_DENIED => return error.AccessDenied,
642+
.INVALID_HANDLE => return error.NotOpenForReading,
641643
else => |err| return unexpectedError(err),
642644
}
643645
}
@@ -1152,7 +1154,10 @@ pub fn GetStdHandle(handle_id: DWORD) GetStdHandleError!HANDLE {
11521154
return handle;
11531155
}
11541156

1155-
pub const SetFilePointerError = error{Unexpected};
1157+
pub const SetFilePointerError = error{
1158+
Unseekable,
1159+
Unexpected,
1160+
};
11561161

11571162
/// The SetFilePointerEx function with the `dwMoveMethod` parameter set to `FILE_BEGIN`.
11581163
pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!void {
@@ -1162,6 +1167,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v
11621167
const ipos = @as(LARGE_INTEGER, @bitCast(offset));
11631168
if (kernel32.SetFilePointerEx(handle, ipos, null, FILE_BEGIN) == 0) {
11641169
switch (GetLastError()) {
1170+
.INVALID_FUNCTION => return error.Unseekable,
1171+
.NEGATIVE_SEEK => return error.Unseekable,
11651172
.INVALID_PARAMETER => unreachable,
11661173
.INVALID_HANDLE => unreachable,
11671174
else => |err| return unexpectedError(err),
@@ -1173,6 +1180,8 @@ pub fn SetFilePointerEx_BEGIN(handle: HANDLE, offset: u64) SetFilePointerError!v
11731180
pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError!void {
11741181
if (kernel32.SetFilePointerEx(handle, offset, null, FILE_CURRENT) == 0) {
11751182
switch (GetLastError()) {
1183+
.INVALID_FUNCTION => return error.Unseekable,
1184+
.NEGATIVE_SEEK => return error.Unseekable,
11761185
.INVALID_PARAMETER => unreachable,
11771186
.INVALID_HANDLE => unreachable,
11781187
else => |err| return unexpectedError(err),
@@ -1184,6 +1193,8 @@ pub fn SetFilePointerEx_CURRENT(handle: HANDLE, offset: i64) SetFilePointerError
11841193
pub fn SetFilePointerEx_END(handle: HANDLE, offset: i64) SetFilePointerError!void {
11851194
if (kernel32.SetFilePointerEx(handle, offset, null, FILE_END) == 0) {
11861195
switch (GetLastError()) {
1196+
.INVALID_FUNCTION => return error.Unseekable,
1197+
.NEGATIVE_SEEK => return error.Unseekable,
11871198
.INVALID_PARAMETER => unreachable,
11881199
.INVALID_HANDLE => unreachable,
11891200
else => |err| return unexpectedError(err),
@@ -1196,6 +1207,8 @@ pub fn SetFilePointerEx_CURRENT_get(handle: HANDLE) SetFilePointerError!u64 {
11961207
var result: LARGE_INTEGER = undefined;
11971208
if (kernel32.SetFilePointerEx(handle, 0, &result, FILE_CURRENT) == 0) {
11981209
switch (GetLastError()) {
1210+
.INVALID_FUNCTION => return error.Unseekable,
1211+
.NEGATIVE_SEEK => return error.Unseekable,
11991212
.INVALID_PARAMETER => unreachable,
12001213
.INVALID_HANDLE => unreachable,
12011214
else => |err| return unexpectedError(err),

0 commit comments

Comments
 (0)