mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-01 08:48:29 +00:00
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:
parent
cf3174dc74
commit
2046c0d2ae
305 changed files with 6602 additions and 4221 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue