Fix bugs and make improvements

- Get clone() working on FreeBSD
- Increase some Python build quotas
- Add more atomic builtins to chibicc
- Fix ASAN poisoning of alloca() memory
- Make MODE= mandatory link path tinier
- Improve the examples folder a little bit
- Start working on some more resource limits
- Make the linenoise auto-complete UI as good as GNU readline
- Update compile.com, avoiding AVX codegen on non-AVX systems
- Make sure empty path to syscalls like opendir raises ENOENT
- Correctly polyfill ENOENT vs. ENOTDIR on the New Technology
- Port bestline's paredit features to //third_party/linenoise
- Remove workarounds for RHEL 5.0 bugs that were fixed in 5.1
This commit is contained in:
Justine Tunney 2022-04-20 09:56:53 -07:00
parent c3fb624647
commit ae638c0850
181 changed files with 2994 additions and 1367 deletions

View file

@ -16,20 +16,65 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/
#include "libc/bits/weaken.h"
#include "libc/calls/calls.h"
#include "libc/calls/internal.h"
#include "libc/calls/strace.internal.h"
#include "libc/calls/struct/metastat.internal.h"
#include "libc/calls/struct/stat.h"
#include "libc/dce.h"
#include "libc/limits.h"
#include "libc/nt/enum/fileinfobyhandleclass.h"
#include "libc/nt/files.h"
#include "libc/nt/struct/filestandardinformation.h"
#include "libc/sysv/errfuns.h"
#include "libc/zipos/zipos.internal.h"
/**
* Determines size of open file.
*
* @return file byte length, or -1ul w/ errno
* This function is equivalent to:
*
* struct stat st;
* !fstat(fd, &st) ? st.st_size : -1
*
* Except faster on BSD/Windows and a much smaller link size.
*
* @return file byte length, or -1 w/ errno
* @asyncsignalsafe
*/
size_t getfiledescriptorsize(int fd) {
struct stat st;
if (fstat(fd, &st) == -1) return SIZE_MAX;
return st.st_size;
ssize_t getfiledescriptorsize(int fd) {
int e;
ssize_t rc;
union metastat st;
struct NtFileStandardInformation info;
e = errno;
if (__isfdkind(fd, kFdZip)) {
if (weaken(__zipos_fstat)(
(struct ZiposHandle *)(intptr_t)g_fds.p[fd].handle, &st.cosmo) !=
-1) {
rc = st.cosmo.st_size;
} else {
rc = -1;
}
} else if (IsMetal()) {
rc = -1;
} else if (!IsWindows()) {
if (!__sys_fstat(fd, &st)) {
rc = METASTAT(st, st_size);
} else {
rc = -1;
}
} else if (__isfdopen(fd)) {
if (GetFileInformationByHandleEx(g_fds.p[fd].handle, kNtFileStandardInfo,
&info, sizeof(info))) {
rc = info.EndOfFile;
} else {
rc = ebadf();
}
} else {
rc = ebadf();
}
STRACE("getfiledescriptorsize(%d) → %'zd% m", fd, rc);
return rc;
}