fix(libc): return fclose failures to callers
(cherry picked from commit 610d6cdda098e9adfcd3814b52f8eba01caaa4d1)
This commit is contained in:
parent
a11c8f7f70
commit
fdf288f3fc
|
|
@ -122,11 +122,12 @@ public:
|
|||
SyncStatus();
|
||||
}
|
||||
|
||||
void Close() {
|
||||
int Close() {
|
||||
GetHandle();
|
||||
if (std::fclose(std::exchange(_handle, nullptr)) != 0) throw std::runtime_error("FileStream: close failed");
|
||||
const int result = std::fclose(std::exchange(_handle, nullptr));
|
||||
_guest.flags = 0;
|
||||
_guest.descriptor = -1;
|
||||
return result;
|
||||
}
|
||||
};
|
||||
static_assert(std::is_standard_layout_v<FileStream>);
|
||||
|
|
|
|||
|
|
@ -146,8 +146,7 @@ int APS5_VABI fopen_s_nid_postfix(FileStream** result, const char* filename, con
|
|||
int APS5_VABI fclose_nid_postfix(FileStream* stream) {
|
||||
GetNativeStream(stream);
|
||||
std::unique_ptr<FileStream> owner(stream->IsDynamic() ? stream : nullptr);
|
||||
stream->Close();
|
||||
return 0;
|
||||
return stream->Close();
|
||||
}
|
||||
|
||||
int APS5_VABI fseek_nid_postfix(FileStream* stream, std::int64_t offset, int origin);
|
||||
|
|
|
|||
|
|
@ -131,6 +131,14 @@ int main() {
|
|||
Require(stream != nullptr && std::fgetc(stream->GetHandle()) == 'k');
|
||||
fclose_nid_postfix(stream);
|
||||
|
||||
#ifndef _WIN32
|
||||
auto* full = std::fopen("/dev/full", "wb");
|
||||
Require(full != nullptr);
|
||||
auto* fullStream = new FileStream(full, true);
|
||||
Require(std::fwrite("buffered", 1, 8, full) == 8);
|
||||
Require(fclose_nid_postfix(fullStream) == EOF);
|
||||
#endif
|
||||
|
||||
std::filesystem::remove_all(dir);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue