mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-06 11:18:30 +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
|
@ -173,7 +173,7 @@ char *shortened;
|
|||
char *cachedcmd;
|
||||
char *colorflag;
|
||||
char *originalcmd;
|
||||
char ccpath[PATH_MAX];
|
||||
char ccpath[PATH_MAX + 1];
|
||||
|
||||
struct stat st;
|
||||
struct Strings env;
|
||||
|
@ -811,7 +811,7 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
cmd = argv[optind];
|
||||
if (!strchr(cmd, '/')) {
|
||||
if (!(cmd = commandv(cmd, ccpath))) exit(127);
|
||||
if (!(cmd = commandv(cmd, ccpath, sizeof(ccpath)))) exit(127);
|
||||
}
|
||||
|
||||
s = basename(strdup(cmd));
|
||||
|
|
|
@ -42,9 +42,9 @@ void CloseCxxFilt(void) {
|
|||
void SpawnCxxFilt(void) {
|
||||
int pipefds[2][2];
|
||||
const char *cxxfilt;
|
||||
char path[PATH_MAX];
|
||||
char path[PATH_MAX + 1];
|
||||
cxxfilt = firstnonnull(emptytonull(getenv("CXXFILT")), "c++filt");
|
||||
if (commandv(cxxfilt, path)) {
|
||||
if (commandv(cxxfilt, path, sizeof(path))) {
|
||||
pipe2(pipefds[0], O_CLOEXEC);
|
||||
pipe2(pipefds[1], O_CLOEXEC);
|
||||
if (!(g_cxxfilt.pid = vfork())) {
|
||||
|
|
|
@ -73,7 +73,7 @@ void elfwriter_yoink(struct ElfWriter *, const char *, int);
|
|||
void elfwriter_setsection(struct ElfWriter *, struct ElfWriterSymRef, uint16_t);
|
||||
void elfwriter_zip(struct ElfWriter *, const char *, const char *, size_t,
|
||||
const void *, size_t, uint32_t, struct timespec,
|
||||
struct timespec, struct timespec, bool, uint64_t);
|
||||
struct timespec, struct timespec, bool, uint64_t, size_t);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
|
|
@ -136,7 +136,8 @@ static void EmitZipCdirHdr(unsigned char *p, const void *name, size_t namesize,
|
|||
void elfwriter_zip(struct ElfWriter *elf, const char *symbol, const char *name,
|
||||
size_t namesize, const void *data, size_t size,
|
||||
uint32_t mode, struct timespec mtim, struct timespec atim,
|
||||
struct timespec ctim, bool nocompress, uint64_t imagebase) {
|
||||
struct timespec ctim, bool nocompress, uint64_t imagebase,
|
||||
size_t kZipCdirHdrLinkableSizeBootstrap) {
|
||||
z_stream zs;
|
||||
uint8_t era;
|
||||
uint32_t crc;
|
||||
|
@ -159,7 +160,7 @@ void elfwriter_zip(struct ElfWriter *elf, const char *symbol, const char *name,
|
|||
if (S_ISREG(mode) && _istext(data, size)) {
|
||||
iattrs |= kZipIattrText;
|
||||
}
|
||||
commentsize = kZipCdirHdrLinkableSize - (CFILE_HDR_SIZE + namesize);
|
||||
commentsize = kZipCdirHdrLinkableSizeBootstrap - (CFILE_HDR_SIZE + namesize);
|
||||
dosmode = !(mode & 0200) ? kNtFileAttributeReadonly : 0;
|
||||
method = ShouldCompress(name, namesize, data, size, nocompress)
|
||||
? kZipCompressionDeflate
|
||||
|
@ -209,15 +210,15 @@ void elfwriter_zip(struct ElfWriter *elf, const char *symbol, const char *name,
|
|||
elfwriter_startsection(elf,
|
||||
gc(xasprintf("%s%s", ZIP_DIRECTORY_SECTION, name)),
|
||||
SHT_PROGBITS, SHF_ALLOC);
|
||||
EmitZipCdirHdr((cfile = elfwriter_reserve(elf, kZipCdirHdrLinkableSize)),
|
||||
name, namesize, crc, era, gflags, method, mtime, mdate, iattrs,
|
||||
dosmode, mode, compsize, uncompsize, commentsize, mtim, atim,
|
||||
ctim);
|
||||
EmitZipCdirHdr(
|
||||
(cfile = elfwriter_reserve(elf, kZipCdirHdrLinkableSizeBootstrap)), name,
|
||||
namesize, crc, era, gflags, method, mtime, mdate, iattrs, dosmode, mode,
|
||||
compsize, uncompsize, commentsize, mtim, atim, ctim);
|
||||
elfwriter_appendsym(elf, gc(xasprintf("%s%s", "zip+cdir:", name)),
|
||||
ELF64_ST_INFO(STB_LOCAL, STT_OBJECT), STV_DEFAULT, 0,
|
||||
kZipCdirHdrLinkableSize);
|
||||
kZipCdirHdrLinkableSizeBootstrap);
|
||||
elfwriter_appendrela(elf, kZipCfileOffsetOffset, lfilesym, R_X86_64_32,
|
||||
-imagebase);
|
||||
elfwriter_commit(elf, kZipCdirHdrLinkableSize);
|
||||
elfwriter_commit(elf, kZipCdirHdrLinkableSizeBootstrap);
|
||||
elfwriter_finishsection(elf);
|
||||
}
|
||||
|
|
|
@ -121,11 +121,11 @@ static void MovqQqPq(struct Machine *m, uint32_t rde) {
|
|||
|
||||
static void MovqVdqEqp(struct Machine *m, uint32_t rde) {
|
||||
memcpy(XmmRexrReg(m, rde), GetModrmRegisterWordPointerRead8(m, rde), 8);
|
||||
memset(XmmRexrReg(m, rde) + 8, 0, 8);
|
||||
bzero(XmmRexrReg(m, rde) + 8, 8);
|
||||
}
|
||||
|
||||
static void MovdVdqEd(struct Machine *m, uint32_t rde) {
|
||||
memset(XmmRexrReg(m, rde), 0, 16);
|
||||
bzero(XmmRexrReg(m, rde), 16);
|
||||
memcpy(XmmRexrReg(m, rde), GetModrmRegisterWordPointerRead4(m, rde), 4);
|
||||
}
|
||||
|
||||
|
@ -135,7 +135,7 @@ static void MovqPqEqp(struct Machine *m, uint32_t rde) {
|
|||
|
||||
static void MovdPqEd(struct Machine *m, uint32_t rde) {
|
||||
memcpy(MmReg(m, rde), GetModrmRegisterWordPointerRead4(m, rde), 4);
|
||||
memset(MmReg(m, rde) + 4, 0, 4);
|
||||
bzero(MmReg(m, rde) + 4, 4);
|
||||
}
|
||||
|
||||
static void MovdEdVdq(struct Machine *m, uint32_t rde) {
|
||||
|
@ -168,7 +168,7 @@ static void MovntqMqPq(struct Machine *m, uint32_t rde) {
|
|||
|
||||
static void MovqVqWq(struct Machine *m, uint32_t rde) {
|
||||
memcpy(XmmRexrReg(m, rde), GetModrmRegisterXmmPointerRead8(m, rde), 8);
|
||||
memset(XmmRexrReg(m, rde) + 8, 0, 8);
|
||||
bzero(XmmRexrReg(m, rde) + 8, 8);
|
||||
}
|
||||
|
||||
static void MovssVpsWps(struct Machine *m, uint32_t rde) {
|
||||
|
@ -176,7 +176,7 @@ static void MovssVpsWps(struct Machine *m, uint32_t rde) {
|
|||
memcpy(XmmRexrReg(m, rde), XmmRexbRm(m, rde), 4);
|
||||
} else {
|
||||
memcpy(XmmRexrReg(m, rde), ComputeReserveAddressRead4(m, rde), 4);
|
||||
memset(XmmRexrReg(m, rde) + 4, 0, 12);
|
||||
bzero(XmmRexrReg(m, rde) + 4, 12);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -189,7 +189,7 @@ static void MovsdVpsWps(struct Machine *m, uint32_t rde) {
|
|||
memcpy(XmmRexrReg(m, rde), XmmRexbRm(m, rde), 8);
|
||||
} else {
|
||||
memcpy(XmmRexrReg(m, rde), ComputeReserveAddressRead8(m, rde), 8);
|
||||
memset(XmmRexrReg(m, rde) + 8, 0, 8);
|
||||
bzero(XmmRexrReg(m, rde) + 8, 8);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -267,7 +267,7 @@ static void MovhpdMqVq(struct Machine *m, uint32_t rde) {
|
|||
static void MovqWqVq(struct Machine *m, uint32_t rde) {
|
||||
if (IsModrmRegister(rde)) {
|
||||
memcpy(XmmRexbRm(m, rde), XmmRexrReg(m, rde), 8);
|
||||
memset(XmmRexbRm(m, rde) + 8, 0, 8);
|
||||
bzero(XmmRexbRm(m, rde) + 8, 8);
|
||||
} else {
|
||||
memcpy(ComputeReserveAddressWrite8(m, rde), XmmRexrReg(m, rde), 8);
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ static void MovqWqVq(struct Machine *m, uint32_t rde) {
|
|||
|
||||
static void Movq2dqVdqNq(struct Machine *m, uint32_t rde) {
|
||||
memcpy(XmmRexrReg(m, rde), MmRm(m, rde), 8);
|
||||
memset(XmmRexrReg(m, rde) + 8, 0, 8);
|
||||
bzero(XmmRexrReg(m, rde) + 8, 8);
|
||||
}
|
||||
|
||||
static void Movdq2qPqUq(struct Machine *m, uint32_t rde) {
|
||||
|
|
|
@ -113,10 +113,10 @@ char *g_prog;
|
|||
char *g_runitd;
|
||||
jmp_buf g_jmpbuf;
|
||||
uint16_t g_sshport;
|
||||
char g_ssh[PATH_MAX];
|
||||
char g_hostname[128];
|
||||
uint16_t g_runitdport;
|
||||
volatile bool alarmed;
|
||||
char g_ssh[PATH_MAX + 1];
|
||||
|
||||
int __sys_execve(const char *, char *const[], char *const[]) hidden;
|
||||
|
||||
|
@ -505,7 +505,8 @@ int main(int argc, char *argv[]) {
|
|||
}
|
||||
CheckExists((g_runitd = argv[1]));
|
||||
CheckExists((g_prog = argv[2]));
|
||||
CHECK_NOTNULL(commandv(firstnonnull(getenv("SSH"), "ssh"), g_ssh));
|
||||
CHECK_NOTNULL(
|
||||
commandv(firstnonnull(getenv("SSH"), "ssh"), g_ssh, sizeof(g_ssh)));
|
||||
if (argc == 3) {
|
||||
/* hosts list empty */
|
||||
return 0;
|
||||
|
|
|
@ -660,7 +660,7 @@ static void Flush(void) {
|
|||
static const char *GetErrnoName(int x) {
|
||||
const char *s;
|
||||
static char buf[16];
|
||||
if ((s = strerror_short(x))) return s;
|
||||
if ((s = strerrno(x))) return s;
|
||||
FormatInt64(buf, x);
|
||||
return buf;
|
||||
}
|
||||
|
@ -1195,6 +1195,5 @@ wontreturn void StraceMain(int argc, char *argv[]) {
|
|||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
__nomultics = true;
|
||||
StraceMain(argc, argv);
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "libc/sysv/consts/prot.h"
|
||||
#include "libc/time/time.h"
|
||||
#include "libc/x/x.h"
|
||||
#include "libc/zip.h"
|
||||
#include "third_party/getopt/getopt.h"
|
||||
#include "tool/build/lib/elfwriter.h"
|
||||
#include "tool/build/lib/stripcomponents.h"
|
||||
|
@ -48,6 +49,7 @@ int64_t image_base_;
|
|||
int strip_components_;
|
||||
const char *path_prefix_;
|
||||
struct timespec timestamp;
|
||||
size_t kZipCdirHdrLinkableSizeBootstrap;
|
||||
|
||||
wontreturn void PrintUsage(int rc, FILE *f) {
|
||||
fprintf(f, "%s%s%s\n", "Usage: ", program_invocation_name,
|
||||
|
@ -60,7 +62,8 @@ void GetOpts(int *argc, char ***argv) {
|
|||
int opt;
|
||||
yoink_ = "__zip_start";
|
||||
image_base_ = IMAGE_BASE_VIRTUAL;
|
||||
while ((opt = getopt(*argc, *argv, "?0nhBN:C:P:o:s:y:b:")) != -1) {
|
||||
kZipCdirHdrLinkableSizeBootstrap = kZipCdirHdrLinkableSize;
|
||||
while ((opt = getopt(*argc, *argv, "?0nhBL:N:C:P:o:s:y:b:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
outpath_ = optarg;
|
||||
|
@ -91,6 +94,9 @@ void GetOpts(int *argc, char ***argv) {
|
|||
case '0':
|
||||
nocompress_ = true;
|
||||
break;
|
||||
case 'L':
|
||||
kZipCdirHdrLinkableSizeBootstrap = strtoul(optarg, NULL, 0);
|
||||
break;
|
||||
case '?':
|
||||
case 'h':
|
||||
PrintUsage(EXIT_SUCCESS, stdout);
|
||||
|
@ -135,7 +141,8 @@ void ProcessFile(struct ElfWriter *elf, const char *path) {
|
|||
}
|
||||
}
|
||||
elfwriter_zip(elf, name, name, strlen(name), map, st.st_size, st.st_mode,
|
||||
timestamp, timestamp, timestamp, nocompress_, image_base_);
|
||||
timestamp, timestamp, timestamp, nocompress_, image_base_,
|
||||
kZipCdirHdrLinkableSizeBootstrap);
|
||||
if (st.st_size) CHECK_NE(-1, munmap(map, st.st_size));
|
||||
close(fd);
|
||||
}
|
||||
|
@ -149,7 +156,8 @@ void PullEndOfCentralDirectoryIntoLinkage(struct ElfWriter *elf) {
|
|||
}
|
||||
|
||||
void CheckFilenameKosher(const char *path) {
|
||||
CHECK_LE(strlen(path), PATH_MAX);
|
||||
CHECK_LE(kZipCfileHdrMinSize + strlen(path),
|
||||
kZipCdirHdrLinkableSizeBootstrap);
|
||||
CHECK(!startswith(path, "/"));
|
||||
CHECK(!strstr(path, ".."));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue