mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Write more redbean unit tests
- Fix DescribeSigset() - Introduce new unix.rmrf() API - Fix redbean sigaction() doc example code - Fix unix.sigaction() w/ more than two args - Improve redbean re module API (non-breaking) - Enhance Lua with Python string multiplication - Make third parameter of unix.socket() default to 0
This commit is contained in:
parent
c5b9902ac9
commit
1c83670229
20 changed files with 738 additions and 204 deletions
|
@ -57,9 +57,9 @@ const char *DescribeRlimitName(char[20], int);
|
|||
const char *DescribeSchedParam(char[32], const struct sched_param *);
|
||||
const char *DescribeSchedPolicy(char[48], int);
|
||||
const char *DescribeSeccompOperation(int);
|
||||
const char *DescribeSigaction(char[128], int, const struct sigaction *);
|
||||
const char *DescribeSigaction(char[256], int, const struct sigaction *);
|
||||
const char *DescribeSigaltstk(char[128], int, const struct sigaltstack *);
|
||||
const char *DescribeSigset(char[64], int, const sigset_t *);
|
||||
const char *DescribeSigset(char[128], int, const sigset_t *);
|
||||
const char *DescribeSockLevel(char[12], int);
|
||||
const char *DescribeSockOptname(char[32], int, int);
|
||||
const char *DescribeSockaddr(char[128], const struct sockaddr *, size_t);
|
||||
|
@ -102,9 +102,9 @@ void DescribeIovNt(const struct NtIovec *, uint32_t, ssize_t);
|
|||
#define DescribeRlimitName(rl) DescribeRlimitName(alloca(20), rl)
|
||||
#define DescribeSchedParam(x) DescribeSchedParam(alloca(32), x)
|
||||
#define DescribeSchedPolicy(x) DescribeSchedPolicy(alloca(48), x)
|
||||
#define DescribeSigaction(rc, sa) DescribeSigaction(alloca(128), rc, sa)
|
||||
#define DescribeSigaction(rc, sa) DescribeSigaction(alloca(256), rc, sa)
|
||||
#define DescribeSigaltstk(rc, ss) DescribeSigaltstk(alloca(128), rc, ss)
|
||||
#define DescribeSigset(rc, ss) DescribeSigset(alloca(64), rc, ss)
|
||||
#define DescribeSigset(rc, ss) DescribeSigset(alloca(128), rc, ss)
|
||||
#define DescribeSockLevel(x) DescribeSockLevel(alloca(12), x)
|
||||
#define DescribeSockOptname(x, y) DescribeSockOptname(alloca(32), x, y)
|
||||
#define DescribeSockaddr(sa, sz) DescribeSockaddr(alloca(128), sa, sz)
|
||||
|
|
|
@ -21,15 +21,15 @@
|
|||
#include "libc/intrin/describeflags.internal.h"
|
||||
#include "libc/intrin/kprintf.h"
|
||||
|
||||
const char *(DescribeSigaction)(char buf[128], int rc,
|
||||
const char *(DescribeSigaction)(char buf[256], int rc,
|
||||
const struct sigaction *sa) {
|
||||
if (rc == -1) return "n/a";
|
||||
if (!sa) return "NULL";
|
||||
if ((!IsAsan() && kisdangerous(sa)) ||
|
||||
(IsAsan() && !__asan_is_valid(sa, sizeof(*sa)))) {
|
||||
ksnprintf(buf, 128, "%p", sa);
|
||||
ksnprintf(buf, 256, "%p", sa);
|
||||
} else {
|
||||
ksnprintf(buf, 128, "{.sa_handler=%p, .sa_flags=%#lx, .sa_mask=%s}",
|
||||
ksnprintf(buf, 256, "{.sa_handler=%t, .sa_flags=%#lx, .sa_mask=%s}",
|
||||
sa->sa_handler, sa->sa_flags, DescribeSigset(rc, &sa->sa_mask));
|
||||
}
|
||||
return buf;
|
||||
|
|
|
@ -23,40 +23,41 @@
|
|||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
const char *(DescribeSigset)(char buf[64], int rc, const sigset_t *ss) {
|
||||
#define N 128
|
||||
|
||||
const char *(DescribeSigset)(char buf[N], int rc, const sigset_t *ss) {
|
||||
bool gotsome;
|
||||
int i, n, sig;
|
||||
int i, sig;
|
||||
sigset_t sigset;
|
||||
|
||||
if (rc == -1) return "n/a";
|
||||
if (!ss) return "NULL";
|
||||
if ((!IsAsan() && kisdangerous(ss)) ||
|
||||
(IsAsan() && !__asan_is_valid(ss, sizeof(*ss)))) {
|
||||
ksnprintf(buf, 64, "%p", ss);
|
||||
ksnprintf(buf, N, "%p", ss);
|
||||
return buf;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
n = 64;
|
||||
sigset = *ss;
|
||||
gotsome = false;
|
||||
if (popcnt(sigset.__bits[0]) + popcnt(sigset.__bits[1]) > 64) {
|
||||
i += ksnprintf(buf + i, n - i, "~");
|
||||
if (popcnt(sigset.__bits[0] & 0xffffffff) > 16) {
|
||||
i += ksnprintf(buf + i, N - i, "~");
|
||||
sigset.__bits[0] = ~sigset.__bits[0];
|
||||
sigset.__bits[1] = ~sigset.__bits[1];
|
||||
}
|
||||
i += ksnprintf(buf + i, n - i, "{");
|
||||
for (sig = 1; sig < 128; ++sig) {
|
||||
i += ksnprintf(buf + i, N - i, "{");
|
||||
for (sig = 1; sig < 32; ++sig) {
|
||||
if (sigismember(&sigset, sig)) {
|
||||
if (gotsome) {
|
||||
sig += ksnprintf(buf + sig, n - sig, ", ");
|
||||
i += ksnprintf(buf + i, N - i, ",");
|
||||
} else {
|
||||
gotsome = true;
|
||||
}
|
||||
sig += ksnprintf(buf + sig, n - sig, "%s", strsignal(sig));
|
||||
i += ksnprintf(buf + i, N - i, "%s", strsignal(sig) + 3);
|
||||
}
|
||||
}
|
||||
i += ksnprintf(buf + i, n - i, "}");
|
||||
i += ksnprintf(buf + i, N - i, "}");
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
|
|
@ -65,6 +65,7 @@ relegated void RestoreDefaultCrashSignalHandlers(void) {
|
|||
int e;
|
||||
size_t i;
|
||||
sigset_t ss;
|
||||
--__strace;
|
||||
sigemptyset(&ss);
|
||||
sigprocmask(SIG_SETMASK, &ss, NULL);
|
||||
for (i = 0; i < ARRAYLEN(kCrashSigs); ++i) {
|
||||
|
@ -74,10 +75,10 @@ relegated void RestoreDefaultCrashSignalHandlers(void) {
|
|||
errno = e;
|
||||
}
|
||||
}
|
||||
++__strace;
|
||||
}
|
||||
|
||||
static void FreeSigAltStack(void *p) {
|
||||
InstallCrashHandlers(0);
|
||||
sigaltstack(&g_oldsigaltstack, 0);
|
||||
munmap(p, GetStackSize());
|
||||
}
|
||||
|
|
|
@ -266,7 +266,8 @@ DIR *opendir(const char *name) {
|
|||
}
|
||||
} else if (!IsWindows()) {
|
||||
res = 0;
|
||||
if ((fd = open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC)) != -1) {
|
||||
if ((fd = open(name, O_RDONLY | O_NOCTTY | O_DIRECTORY | O_CLOEXEC)) !=
|
||||
-1) {
|
||||
if (!(res = fdopendir(fd))) {
|
||||
close(fd);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue