From 0cccba71d41afee519d0000eb719f8c95f288166 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 2 Apr 2019 15:21:08 -0400 Subject: [PATCH] better error message when os_file_overwrite fails --- src/error.cpp | 5 +++++ src/error.hpp | 5 +++++ src/os.cpp | 18 +++++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/error.cpp b/src/error.cpp index 86f807de2b..84b78aba1b 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -45,6 +45,11 @@ const char *err_str(Error err) { case ErrorUnknownOperatingSystem: return "unrecognized operating system"; case ErrorUnknownABI: return "unrecognized C ABI"; case ErrorInvalidFilename: return "invalid filename"; + case ErrorDiskQuota: return "disk space quota exceeded"; + case ErrorDiskSpace: return "out of disk space"; + case ErrorUnexpectedWriteFailure: return "unexpected write failure"; + case ErrorUnexpectedSeekFailure: return "unexpected seek failure"; + case ErrorUnexpectedFileTruncationFailure: return "unexpected file truncation failure"; } return "(invalid error)"; } diff --git a/src/error.hpp b/src/error.hpp index 8af0d86154..d943703268 100644 --- a/src/error.hpp +++ b/src/error.hpp @@ -47,6 +47,11 @@ enum Error { ErrorUnknownOperatingSystem, ErrorUnknownABI, ErrorInvalidFilename, + ErrorDiskQuota, + ErrorDiskSpace, + ErrorUnexpectedWriteFailure, + ErrorUnexpectedSeekFailure, + ErrorUnexpectedFileTruncationFailure, }; const char *err_str(Error err); diff --git a/src/os.cpp b/src/os.cpp index 1dd22b7183..470d222307 100644 --- a/src/os.cpp +++ b/src/os.cpp @@ -2048,9 +2048,9 @@ Error os_file_overwrite(OsFile file, Buf *contents) { return ErrorNone; #else if (lseek(file, 0, SEEK_SET) == -1) - return ErrorFileSystem; + return ErrorUnexpectedSeekFailure; if (ftruncate(file, 0) == -1) - return ErrorFileSystem; + return ErrorUnexpectedFileTruncationFailure; for (;;) { if (write(file, buf_ptr(contents), buf_len(contents)) == -1) { switch (errno) { @@ -2060,8 +2060,20 @@ Error os_file_overwrite(OsFile file, Buf *contents) { zig_unreachable(); case EBADF: zig_unreachable(); - default: + case EFAULT: + zig_unreachable(); + case EDQUOT: + return ErrorDiskQuota; + case ENOSPC: + return ErrorDiskSpace; + case EFBIG: + return ErrorFileTooBig; + case EIO: return ErrorFileSystem; + case EPERM: + return ErrorAccess; + default: + return ErrorUnexpectedWriteFailure; } } return ErrorNone;