Make improvements

- Expand redbean UNIX module
- Expand redbean documentation
- Ensure Lua copyright is embedded in binary
- Increase the PATH_MAX limit especially on NT
- Use column major sorting for linenoise completions
- Fix some suboptimalities in redbean's new UNIX API
- Figured out right flags for Multics newline in raw mode
This commit is contained in:
Justine Tunney 2022-04-24 09:59:22 -07:00
parent cf3174dc74
commit 2046c0d2ae
305 changed files with 6602 additions and 4221 deletions

View file

@ -50,7 +50,7 @@
#define kBacktraceBufSize ((kBacktraceMaxFrames - 1) * (18 + 1))
static void ShowHint(const char *s) {
kprintf("%snote: %s%s%n", SUBTLE, s, RESET);
kprintf("%snote: %s%s\n", SUBTLE, s, RESET);
}
static int PrintBacktraceUsingAddr2line(int fd, const struct StackFrame *bp) {
@ -63,8 +63,6 @@ static int PrintBacktraceUsingAddr2line(int fd, const struct StackFrame *bp) {
char *debugbin, *p1, *p2, *p3, *addr2line;
char buf[kBacktraceBufSize], *argv[kBacktraceMaxFrames];
return -1;
if (!(debugbin = FindDebugBinary())) {
return -1;
}
@ -176,8 +174,8 @@ void ShowBacktrace(int fd, const struct StackFrame *bp) {
__strace = st;
g_ftrace = ft;
#else
kprintf("ShowBacktrace() needs these flags to show C backtrace:%n"
"\t-D__FNO_OMIT_FRAME_POINTER__%n"
"\t-fno-omit-frame-pointer%n");
kprintf("ShowBacktrace() needs these flags to show C backtrace:\n"
"\t-D__FNO_OMIT_FRAME_POINTER__\n"
"\t-fno-omit-frame-pointer\n");
#endif
}

View file

@ -56,11 +56,11 @@ noinstrument noasan int PrintBacktraceUsingSymbols(int fd,
gi = garbage ? garbage->i : 0;
for (i = 0, frame = bp; frame; frame = frame->next) {
if (!IsValidStackFramePointer(frame)) {
kprintf("%p corrupt frame pointer%n", frame);
kprintf("%p corrupt frame pointer\n", frame);
break;
}
if (++i == LIMIT) {
kprintf("<truncated backtrace>%n");
kprintf("<truncated backtrace>\n");
break;
}
addr = frame->addr;
@ -84,8 +84,8 @@ noinstrument noasan int PrintBacktraceUsingSymbols(int fd,
} else {
addend = 0;
}
kprintf("%012lx %012lx %s%+d\r%n", frame, addr,
__get_symbol_name(st, symbol), addend);
kprintf("%012lx %012lx %s%+d\n", frame, addr, __get_symbol_name(st, symbol),
addend);
}
return 0;
}

View file

@ -51,22 +51,22 @@ relegated void __check_fail(const char *suffix, const char *opstr,
__start_fatal(file, line);
__stpcpy(hostname, "unknown");
gethostname(hostname, sizeof(hostname));
kprintf("check failed on %s pid %d%n", hostname, getpid());
kprintf("\tCHECK_%^s(%s, %s);%n", suffix, wantstr, gotstr);
kprintf("\t\t → %p (%s)%n", want, wantstr);
kprintf("\t\t%s %p (%s)%n", opstr, got, gotstr);
kprintf("check failed on %s pid %d\n", hostname, getpid());
kprintf("\tCHECK_%^s(%s, %s);\n", suffix, wantstr, gotstr);
kprintf("\t\t → %p (%s)\n", want, wantstr);
kprintf("\t\t%s %p (%s)\n", opstr, got, gotstr);
if (!isempty(fmt)) {
kprintf("\t");
va_start(va, fmt);
kvprintf(fmt, va);
va_end(va);
kprintf("%n");
kprintf("\n");
}
kprintf("\t%m%n\t%s%s", SUBTLE, program_invocation_name);
kprintf("\t%m\n\t%s%s", SUBTLE, program_invocation_name);
for (i = 1; i < __argc; ++i) {
kprintf(" %s", __argv[i]);
}
kprintf("%s%n", RESET);
kprintf("%s\n", RESET);
if (!IsTiny() && e == ENOMEM) {
PrintMemoryIntervals(2, &_mmi);
}

View file

@ -36,7 +36,7 @@
relegated void ___check_fail_ndebug(uint64_t want, uint64_t got,
const char *opchar) {
__restore_tty();
kprintf("%n%serror: %s: check failed: 0x%x %s 0x%x (%s)%n",
kprintf("\n%serror: %s: check failed: 0x%x %s 0x%x (%s)\n",
!__nocolor ? "\e[J" : "", program_invocation_name, want, opchar, got,
strerror(errno));
__restorewintty();

View file

@ -47,7 +47,7 @@
*/
const char *commandvenv(const char *var, const char *cmd) {
const char *exepath;
static char pathbuf[PATH_MAX];
static char pathbuf[PATH_MAX + 1];
if (*cmd == '/' || *cmd == '\\') return cmd;
if ((exepath = getenv(var))) {
if (isempty(exepath)) return NULL;
@ -57,5 +57,5 @@ const char *commandvenv(const char *var, const char *cmd) {
return NULL;
}
}
return commandv(cmd, pathbuf);
return commandv(cmd, pathbuf, sizeof(pathbuf));
}

View file

@ -55,7 +55,7 @@ static void PrintHistogram(const long *h, size_t n, long t) {
for (j = 0; j < p / 100; ++j) s[j] = '#';
s[j] = 0;
logos = i ? 1ul << (i - 1) : 0;
kprintf("%'12lu %'16ld %3d.%02d%% %s%n", logos, h[i], p / 100, p % 100,
kprintf("%'12lu %'16ld %3d.%02d%% %s\n", logos, h[i], p / 100, p % 100,
s);
}
}

View file

@ -63,7 +63,7 @@ relegated static void ShowFunctionCalls(ucontext_t *ctx) {
struct StackFrame *bp;
struct StackFrame goodframe;
if (!ctx->uc_mcontext.rip) {
kprintf("%s is NULL can't show backtrace%n", "RIP");
kprintf("%s is NULL can't show backtrace\n", "RIP");
} else {
goodframe.next = (struct StackFrame *)ctx->uc_mcontext.rbp;
goodframe.addr = ctx->uc_mcontext.rip;
@ -114,7 +114,7 @@ relegated static void ShowGeneralRegisters(ucontext_t *ctx) {
long double st;
char *p, buf[128];
p = buf;
kprintf("%n");
kprintf("\n");
for (i = 0, j = 0, k = 0; i < ARRAYLEN(kGregNames); ++i) {
if (j > 0) *p++ = ' ';
if (!(s = kGregNames[(unsigned)kGregOrder[i]])[2]) *p++ = ' ';
@ -135,7 +135,7 @@ relegated static void ShowGeneralRegisters(ucontext_t *ctx) {
p = __uintcpy(p, x / 1000), *p++ = '.';
p = __uintcpy(p, x % 1000);
*p = 0;
kprintf("%s%n", buf);
kprintf("%s\n", buf);
p = buf;
}
}
@ -143,14 +143,14 @@ relegated static void ShowGeneralRegisters(ucontext_t *ctx) {
p, ctx->uc_mcontext.eflags,
ctx->uc_mcontext.fpregs ? ctx->uc_mcontext.fpregs->swd : 0,
ctx->uc_mcontext.fpregs ? ctx->uc_mcontext.fpregs->mxcsr : 0);
kprintf("%s%n", buf);
kprintf("%s\n", buf);
}
relegated static void ShowSseRegisters(ucontext_t *ctx) {
size_t i;
char *p, buf[128];
if (ctx->uc_mcontext.fpregs) {
kprintf("%n");
kprintf("\n");
for (i = 0; i < 8; ++i) {
p = buf;
if (i >= 10) {
@ -175,7 +175,7 @@ relegated static void ShowSseRegisters(ucontext_t *ctx) {
p = __fixcpy(p, ctx->uc_mcontext.fpregs->xmm[i + 8].u64[1], 64);
p = __fixcpy(p, ctx->uc_mcontext.fpregs->xmm[i + 8].u64[0], 64);
*p = 0;
kprintf("XMM%s%n", buf);
kprintf("XMM%s\n", buf);
}
}
}
@ -201,10 +201,10 @@ relegated void ShowCrashReport(int err, int sig, struct siginfo *si,
uname(&names);
p = buf;
errno = err;
kprintf("%n%serror%s: Uncaught %G (%s) on %s pid %d%n"
" %s%n"
" %m%n"
" %s %s %s %s%n",
kprintf("\n%serror%s: Uncaught %G (%s) on %s pid %d\n"
" %s\n"
" %m\n"
" %s %s %s %s\n",
!__nocolor ? "\e[30;101m" : "", !__nocolor ? "\e[0m" : "", sig,
(ctx && (ctx->uc_mcontext.rsp >= GetStaticStackAddr(0) &&
ctx->uc_mcontext.rsp <= GetStaticStackAddr(0) + PAGESIZE))
@ -213,12 +213,12 @@ relegated void ShowCrashReport(int err, int sig, struct siginfo *si,
host, getpid(), program_invocation_name, names.sysname, names.version,
names.nodename, names.release);
if (ctx) {
kprintf("%n");
kprintf("\n");
ShowFunctionCalls(ctx);
ShowGeneralRegisters(ctx);
ShowSseRegisters(ctx);
}
kprintf("%n");
kprintf("\n");
PrintMemoryIntervals(2, &_mmi);
/* PrintSystemMappings(2); */
if (__argv) {
@ -228,7 +228,7 @@ relegated void ShowCrashReport(int err, int sig, struct siginfo *si,
kprintf("%s ", __argv[i]);
}
}
kprintf("%n");
kprintf("\n");
}
relegated static void RestoreDefaultCrashSignalHandlers(void) {
@ -245,14 +245,14 @@ static wontreturn relegated noinstrument void __minicrash(int sig,
struct siginfo *si,
ucontext_t *ctx,
const char *kind) {
kprintf("%n"
"%n"
"CRASHED %s WITH %G%n"
"%s%n"
"RIP %x%n"
"RSP %x%n"
"RBP %x%n"
"%n",
kprintf("\n"
"\n"
"CRASHED %s WITH %G\n"
"%s\n"
"RIP %x\n"
"RSP %x\n"
"RBP %x\n"
"\n",
kind, sig, __argv[0], ctx ? ctx->uc_mcontext.rip : 0,
ctx ? ctx->uc_mcontext.rsp : 0, ctx ? ctx->uc_mcontext.rbp : 0);
__restorewintty();

View file

@ -30,10 +30,10 @@ void PrintGarbage(void) {
size_t i;
char name[19];
const char *symbol;
kprintf("%n");
kprintf(" SHADOW STACK @ %p%n", __builtin_frame_address(0));
kprintf("garbage ent. parent frame original ret callback arg %n");
kprintf("------------ ------------ ------------------ ------------------ ------------------%n");
kprintf("\n");
kprintf(" SHADOW STACK @ %p\n", __builtin_frame_address(0));
kprintf("garbage ent. parent frame original ret callback arg \n");
kprintf("------------ ------------ ------------------ ------------------ ------------------\n");
if (__garbage.i) {
for (i = __garbage.i; i--;) {
symbol = __get_symbol_by_addr(__garbage.p[i].ret);
@ -42,7 +42,7 @@ void PrintGarbage(void) {
} else {
ksnprintf(name, sizeof(name), "%#014lx", __garbage.p[i].ret);
}
kprintf("%12lx %12lx %18s %18s %#18lx%n",
kprintf("%12lx %12lx %18s %18s %#18lx\n",
__garbage.p + i,
__garbage.p[i].frame,
name,
@ -50,7 +50,7 @@ void PrintGarbage(void) {
__garbage.p[i].arg);
}
} else {
kprintf("%12s %12s %18s %18s %18s%n","empty","-","-","-","-");
kprintf("%12s %12s %18s %18s %18s\n","empty","-","-","-","-");
}
kprintf("%n");
kprintf("\n");
}

View file

@ -55,7 +55,7 @@ void vflogf_onfail(FILE *f) {
fseek(f, SEEK_SET, 0);
f->beg = f->end = 0;
clearerr(f);
(fprintf)(f, "performed emergency log truncation: %s%n", strerror(err));
(fprintf)(f, "performed emergency log truncation: %s\n", strerror(err));
}
}
@ -105,7 +105,7 @@ void(vflogf)(unsigned level, const char *file, int line, FILE *f,
vflogf_onfail(f);
}
(vfprintf)(f, fmt, va);
fprintf(f, "%n");
fprintf(f, "\n");
if (bufmode == _IOLBF) {
f->bufmode = _IOLBF;
fflush(f);
@ -114,7 +114,7 @@ void(vflogf)(unsigned level, const char *file, int line, FILE *f,
__start_fatal(file, line);
strcpy(buf32, "unknown");
gethostname(buf32, sizeof(buf32));
(dprintf)(STDERR_FILENO, "fatality %s pid %d%n", buf32, getpid());
(dprintf)(STDERR_FILENO, "fatality %s pid %d\n", buf32, getpid());
__die();
unreachable;
}