Make improvements

- Introduce ualarm() function
- Make rename() report EISEMPTY on Windows
- Always raise EINVAL upon open(O_RDONLY|O_TRUNC)
- Add macro so ./configure will detect SOCK_CLOEXEC
- Fix O_TRUNC without O_CREAT not working on Windows
- Let fcntl(F_SETFL) change O_APPEND status on Windows
- Make sure pwrite() / pread() report ESPIPE on sockets
- Raise ESPIPE on Windows when pwrite() is used on pipe
- Properly compute O_APPEND CreateFile() flags on Windows
- Don't require O_DIRECTORY to open directories on Windows
- Fix more instances of Windows reporting EISDIR and ENOTDIR
- Normalize EFTYPE and EMLINK to ELOOP on NetBSD and FreeBSD
- Make unlink() / rmdir() work on read-only files on Windows
- Validate UTF-8 on Windows paths to fix bug with overlong NUL
- Always print signal name to stderr when crashing due to SIG_DFL
- Fix Windows bug where denormalized paths >260 chars didn't work
- Block signals on BSDs when thread exits before trashing its own stack
This commit is contained in:
Justine Tunney 2023-08-21 02:28:24 -07:00
parent ec957491ea
commit ebf784d4f5
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
76 changed files with 1019 additions and 568 deletions

View file

@ -20,50 +20,59 @@
#include "libc/macros.internal.h"
#include "libc/nt/enum/accessmask.h"
#include "libc/nt/enum/filesharemode.h"
// clang-format off
static const struct DescribeFlags kFileAccessflags[] = {
{kNtFileAllAccess, "FileAllAccess"}, // order matters
{kNtFileGenericRead, "FileGenericRead"}, // order matters
{kNtFileGenericWrite, "FileGenericWrite"}, // order matters
{kNtFileGenericExecute, "FileGenericExecute"}, // order matters
{kNtGenericRead, "GenericRead"}, //
{kNtGenericWrite, "GenericWrite"}, //
{kNtGenericExecute, "GenericExecute"}, //
{kNtGenericAll, "GenericAll"}, //
{kNtDelete, "Delete"}, //
{kNtReadControl, "ReadControl"}, //
{kNtWriteDac, "WriteDac"}, //
{kNtWriteOwner, "WriteOwner"}, //
{kNtSynchronize, "Synchronize"}, //
{kNtStandardRightsRequired, "StandardRightsRequired"}, //
{kNtAccessSystemSecurity, "AccessSystemSecurity"}, //
{kNtMaximumAllowed, "MaximumAllowed"}, //
{kNtFileReadData, "FileReadData"}, //
{kNtFileListDirectory, "FileListDirectory"}, //
{kNtFileWriteData, "FileWriteData"}, //
{kNtFileAddFile, "FileAddFile"}, //
{kNtFileAppendData, "FileAppendData"}, //
{kNtFileAddSubdirectory, "FileAddSubdirectory"}, //
{kNtFileCreatePipeInstance, "FileCreatePipeInstance"}, //
{kNtFileReadEa, "FileReadEa"}, //
{kNtFileWriteEa, "FileWriteEa"}, //
{kNtFileExecute, "FileExecute"}, //
{kNtFileTraverse, "FileTraverse"}, //
{kNtFileDeleteChild, "FileDeleteChild"}, //
{kNtFileReadAttributes, "FileReadAttributes"}, //
{kNtFileWriteAttributes, "FileWriteAttributes"}, //
{kNtTokenAssignPrimary, "TokenAssignPrimary"}, //
{kNtTokenDuplicate, "TokenDuplicate"}, //
{kNtTokenImpersonate, "TokenImpersonate"}, //
{kNtTokenQuery, "TokenQuery"}, //
{kNtTokenQuerySource, "TokenQuerySource"}, //
{kNtTokenAdjustPrivileges, "TokenAdjustPrivileges"}, //
{kNtTokenAdjustGroups, "TokenAdjustGroups"}, //
{kNtTokenAdjustDefault, "TokenAdjustDefault"}, //
{kNtTokenAdjustSessionid, "TokenAdjustSessionid"}, //
{kNtFileAllAccess, "kNtFileAllAccess"},
{kNtFileGenericRead|kNtFileGenericWrite|kNtFileGenericExecute,
"kNtFileGenericRead|kNtFileGenericWrite|kNtFileGenericExecute"},
{kNtFileGenericRead|kNtFileGenericWrite,
"kNtFileGenericRead|kNtFileGenericWrite"},
{kNtFileGenericRead|kNtFileGenericExecute,
"kNtFileGenericRead|kNtFileGenericExecute"},
{kNtFileGenericWrite|kNtFileGenericExecute,
"kNtFileGenericWrite|kNtFileGenericExecute"},
{kNtFileGenericRead, "kNtFileGenericRead"},
{kNtFileGenericWrite, "kNtFileGenericWrite"},
{kNtFileGenericExecute, "kNtFileGenericExecute"},
{kNtGenericRead, "kNtGenericRead"},
{kNtGenericWrite, "kNtGenericWrite"},
{kNtGenericExecute, "kNtGenericExecute"},
{kNtGenericAll, "kNtGenericAll"},
{kNtDelete, "kNtDelete"},
{kNtReadControl, "kNtReadControl"},
{kNtWriteDac, "kNtWriteDac"},
{kNtWriteOwner, "kNtWriteOwner"},
{kNtSynchronize, "kNtSynchronize"},
{kNtStandardRightsRequired, "kNtStandardRightsRequired"},
{kNtAccessSystemSecurity, "kNtAccessSystemSecurity"},
{kNtMaximumAllowed, "kNtMaximumAllowed"},
{kNtFileReadData, "kNtFileReadData"},
{kNtFileListDirectory, "kNtFileListDirectory"},
{kNtFileWriteData, "kNtFileWriteData"},
{kNtFileAddFile, "kNtFileAddFile"},
{kNtFileAppendData, "kNtFileAppendData"},
{kNtFileAddSubdirectory, "kNtFileAddSubdirectory"},
{kNtFileCreatePipeInstance, "kNtFileCreatePipeInstance"},
{kNtFileReadEa, "kNtFileReadEa"},
{kNtFileWriteEa, "kNtFileWriteEa"},
{kNtFileExecute, "kNtFileExecute"},
{kNtFileTraverse, "kNtFileTraverse"},
{kNtFileDeleteChild, "kNtFileDeleteChild"},
{kNtFileReadAttributes, "kNtFileReadAttributes"},
{kNtFileWriteAttributes, "kNtFileWriteAttributes"},
{kNtTokenAssignPrimary, "kNtTokenAssignPrimary"},
{kNtTokenDuplicate, "kNtTokenDuplicate"},
{kNtTokenImpersonate, "kNtTokenImpersonate"},
{kNtTokenQuery, "kNtTokenQuery"},
{kNtTokenQuerySource, "kNtTokenQuerySource"},
{kNtTokenAdjustPrivileges, "kNtTokenAdjustPrivileges"},
{kNtTokenAdjustGroups, "kNtTokenAdjustGroups"},
{kNtTokenAdjustDefault, "kNtTokenAdjustDefault"},
{kNtTokenAdjustSessionid, "kNtTokenAdjustSessionid"},
};
const char *(DescribeNtFileAccessFlags)(char buf[512], uint32_t x) {
return DescribeFlags(buf, 512, kFileAccessflags, ARRAYLEN(kFileAccessflags),
"kNt", x);
"", x);
}