libc: Changes for bash on weston-terminal

This commit is contained in:
Alexander van der Grinten 2018-04-29 11:46:16 +02:00
parent baeba0a61c
commit 504295375c
9 changed files with 47 additions and 13 deletions

View file

@ -423,8 +423,8 @@ size_t fread(void *__restrict buffer, size_t size, size_t count,
size_t fwrite(const void *__restrict buffer, size_t size, size_t count,
FILE *__restrict file_base) {
auto file = static_cast<mlibc::abstract_file *>(file_base);
__ensure(size);
__ensure(count);
if(!size || !count)
return 0;
// Distinguish two cases here: If the object size is one, we perform byte-wise writes.
// Otherwise, we try to write each object individually.

View file

@ -210,7 +210,7 @@ int vsnprintf(char *__restrict buffer, size_t max_size,
LimitedPrinter p(buffer, max_size - 1);
// frigg::infoLogger() << "printf(" << format << ")" << frigg::EndLog();
frigg::printf(p, format, args);
p.buffer[frigg::min(max_size, p.count)] = 0;
p.buffer[frigg::min(max_size - 1, p.count)] = 0;
return p.count;
}
int vsprintf(char *__restrict buffer, const char *__restrict format, __gnuc_va_list args) {

View file

@ -308,9 +308,13 @@ int mblen(const char *mb_chr, size_t max_size) {
__ensure(!"Not implemented");
__builtin_unreachable();
}
int mbtowc(wchar_t *__restrict wc, const char *__restrict mb_chr, size_t max_size) {
__ensure(!"Not implemented");
__builtin_unreachable();
int mbtowc(wchar_t *__restrict wc, const char *__restrict mbs, size_t max_size) {
__ensure(wc);
__ensure(mbs);
__ensure(max_size);
__ensure(*mbs);
*wc = *mbs;
return 1;
}
int wctomb(char *mb_chr, wchar_t wc) {
__ensure(!"Not implemented");

View file

@ -5,7 +5,10 @@
#include <frigg/debug.hpp>
int wcwidth(wchar_t) {
frigg::infoLogger() << "\e[35mmlibc: wcwidth() always returns 1\e[39m" << frigg::endLog;
static bool warned = false;
if(!warned)
frigg::infoLogger() << "\e[35mmlibc: wcwidth() always returns 1\e[39m" << frigg::endLog;
warned = true;
return 1;
}

View file

@ -25,8 +25,6 @@ void FD_ZERO(fd_set *set) {
int select(int num_fds, fd_set *__restrict read_set, fd_set *__restrict write_set,
fd_set *__restrict except_set, struct timeval *__restrict timeout) {
__ensure(!timeout);
// TODO: Do not keep errors from epoll (?).
int fd = epoll_create1(0);
if(fd == -1)
@ -52,7 +50,8 @@ int select(int num_fds, fd_set *__restrict read_set, fd_set *__restrict write_se
}
struct epoll_event evnts[16];
int n = epoll_wait(fd, evnts, 16, -1);
int n = epoll_wait(fd, evnts, 16,
timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 10) : -1);
if(n == -1)
return -1;

View file

@ -19,6 +19,13 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line,
abort();
}
void __frigg_assert_fail(const char *assertion, const char *file, unsigned int line,
const char *function) {
frigg::panicLogger() << "In function " << function
<< ", file " << file << ":" << line << "\n"
<< "__ensure(" << assertion << ") failed" << frigg::endLog;
}
void __ensure_fail(const char *assertion, const char *file, unsigned int line,
const char *function) {
frigg::panicLogger() << "In function " << function

View file

@ -22,6 +22,8 @@ extern "C" uintptr_t *__dlapi_entrystack();
// declared in posix-pipe.hpp
thread_local Queue globalQueue;
void *__mlibc_clk_tracker_page;
namespace {
thread_local HelHandle *cachedFileTable;
@ -33,7 +35,8 @@ namespace {
void actuallyCacheInfos() {
HelError error;
asm volatile ("syscall" : "=D"(error), "=S"(cachedFileTable) : "0"(kHelCallSuper + 1));
asm volatile ("syscall" : "=D"(error), "=c"(__mlibc_clk_tracker_page),
"=S"(cachedFileTable) : "0"(kHelCallSuper + 1));
HEL_CHECK(error);
}
}

View file

@ -2159,6 +2159,9 @@ int sys_open(const char *path, int flags, int *fd) {
if(resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) {
errno = ENOENT;
return -1;
}else if(resp.error() == managarm::posix::Errors::ALREADY_EXISTS) {
errno = EEXIST;
return -1;
}else{
__ensure(resp.error() == managarm::posix::Errors::SUCCESS);
*fd = resp.fd();

View file

@ -7,8 +7,20 @@
#include <hel.h>
#include <hel-syscalls.h>
#include <frigg/debug.hpp>
#include <mlibc/allocator.hpp>
#include <mlibc/posix-pipe.hpp>
#include <mlibc/sysdeps.hpp>
struct TrackerPage {
uint64_t seqlock;
int32_t state;
int32_t padding;
int64_t refClock;
int64_t baseRealtime;
};
extern TrackerPage *__mlibc_clk_tracker_page;
namespace mlibc {
int sys_clock_get(int clock, time_t *secs, long *nanos) {
@ -18,10 +30,13 @@ int sys_clock_get(int clock, time_t *secs, long *nanos) {
*secs = tick / 1000000000;
*nanos = tick % 1000000000;
}else if(clock == CLOCK_REALTIME) {
frigg::infoLogger() << "\e[31mmlibc: clock_gettime does not support CLOCK_REALTIME"
"\e[39m" << frigg::endLog;
cacheFileTable();
uint64_t tick;
HEL_CHECK(helGetClock(&tick));
__ensure(tick >= __mlibc_clk_tracker_page->refClock); // TODO: Respect the seqlock!
tick -= __mlibc_clk_tracker_page->refClock;
tick += __mlibc_clk_tracker_page->baseRealtime;
*secs = tick / 1000000000;
*nanos = tick % 1000000000;
}else if(clock == CLOCK_PROCESS_CPUTIME_ID) {