mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-27 13:00:28 +00:00
Undiamond Python headers
This change gets the Python codebase into a state where it conforms to the conventions of this codebase. It's now possible to include headers from Python, without worrying about ordering. Python has traditionally solved that problem by "diamonding" everything in Python.h, but that's problematic since it means any change to any Python header invalidates all the build artifacts. Lastly it makes tooling not work. Since it is hard to explain to Emacs when I press C-c C-h to add an import line it shouldn't add the header that actually defines the symbol, and instead do follow the nonstandard Python convention. Progress has been made on letting Python load source code from the zip executable structure via the standard C library APIs. System calss now recognizes zip!FILENAME alternative URIs as equivalent to zip:FILENAME since Python uses colon as its delimiter. Some progress has been made on embedding the notice license terms into the Python object code. This is easier said than done since Python has an extremely complicated ownership story. - Some termios APIs have been added - Implement rewinddir() dirstream API - GetCpuCount() API added to Cosmopolitan Libc - More bugs in Cosmopolitan Libc have been fixed - zipobj.com now has flags for mangling the path - Fixed bug a priori with sendfile() on certain BSDs - Polyfill F_DUPFD and F_DUPFD_CLOEXEC across platforms - FIOCLEX / FIONCLEX now polyfilled for fast O_CLOEXEC changes - APE now supports a hybrid solution to no-self-modify for builds - Many BSD-only magnums added, e.g. O_SEARCH, O_SHLOCK, SF_NODISKIO
This commit is contained in:
parent
20bb8db9f8
commit
b420ed8248
762 changed files with 18410 additions and 53772 deletions
|
@ -125,6 +125,8 @@ int main(int argc, char *argv[]) {
|
|||
int *offsets, *modes, *sizes, *names;
|
||||
int i, j, fd, err, name, outfd, tablebufsize;
|
||||
|
||||
if (argc == 2 && !strcmp(argv[1], "-n")) exit(0);
|
||||
|
||||
if (!(argc > 2 && strcmp(argv[1], "rcsD") == 0)) {
|
||||
fprintf(stderr, "%s%s%s\n", "Usage: ", argv[0], " rcsD ARCHIVE FILE...");
|
||||
return 1;
|
||||
|
|
|
@ -79,6 +79,46 @@ o/$(MODE)/tool/build/%.com.dbg: \
|
|||
$(APE)
|
||||
-@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/build/ar.com.dbg: \
|
||||
$(TOOL_BUILD_DEPS) \
|
||||
o/$(MODE)/tool/build/build.pkg \
|
||||
o/$(MODE)/tool/build/ar.o \
|
||||
$(CRT) \
|
||||
$(APE_BUILDSAFE)
|
||||
-@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/build/package.com.dbg: \
|
||||
$(TOOL_BUILD_DEPS) \
|
||||
o/$(MODE)/tool/build/build.pkg \
|
||||
o/$(MODE)/tool/build/package.o \
|
||||
$(CRT) \
|
||||
$(APE_BUILDSAFE)
|
||||
-@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/build/mkdeps.com.dbg: \
|
||||
$(TOOL_BUILD_DEPS) \
|
||||
o/$(MODE)/tool/build/build.pkg \
|
||||
o/$(MODE)/tool/build/mkdeps.o \
|
||||
$(CRT) \
|
||||
$(APE_BUILDSAFE)
|
||||
-@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/build/compile.com.dbg: \
|
||||
$(TOOL_BUILD_DEPS) \
|
||||
o/$(MODE)/tool/build/build.pkg \
|
||||
o/$(MODE)/tool/build/compile.o \
|
||||
$(CRT) \
|
||||
$(APE_BUILDSAFE)
|
||||
-@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/build/zipobj.com.dbg: \
|
||||
$(TOOL_BUILD_DEPS) \
|
||||
o/$(MODE)/tool/build/build.pkg \
|
||||
o/$(MODE)/tool/build/zipobj.o \
|
||||
$(CRT) \
|
||||
$(APE_BUILDSAFE)
|
||||
-@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/build/emulator.o: \
|
||||
OVERRIDE_COPTS += \
|
||||
-fno-sanitize=pointer-overflow
|
||||
|
|
71
tool/build/lib/isnocompressext.c
Normal file
71
tool/build/lib/isnocompressext.c
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/bits/bswap.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "tool/build/lib/isnocompressext.h"
|
||||
|
||||
static const char kNoCompressExts[][8] = {
|
||||
"bz2", //
|
||||
"gif", //
|
||||
"gz", //
|
||||
"jpg", //
|
||||
"lz4", //
|
||||
"mp4", //
|
||||
"mpeg", //
|
||||
"mpg", //
|
||||
"png", //
|
||||
"webp", //
|
||||
"xz", //
|
||||
"zip", //
|
||||
};
|
||||
|
||||
static bool BisectNoCompressExts(uint64_t ext) {
|
||||
int c, m, l, r;
|
||||
l = 0;
|
||||
r = ARRAYLEN(kNoCompressExts) - 1;
|
||||
while (l <= r) {
|
||||
m = (l + r) >> 1;
|
||||
if (READ64BE(kNoCompressExts[m]) < ext) {
|
||||
l = m + 1;
|
||||
} else if (READ64BE(kNoCompressExts[m]) > ext) {
|
||||
r = m - 1;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsNoCompressExt(const char *p, size_t n) {
|
||||
int c;
|
||||
uint64_t w;
|
||||
if (n == -1) n = p ? strlen(p) : 0;
|
||||
if (n) {
|
||||
for (w = 0; n--;) {
|
||||
c = p[n] & 255;
|
||||
if (c == '.') break;
|
||||
w <<= 8;
|
||||
w |= kToLower[c];
|
||||
}
|
||||
return BisectNoCompressExts(bswap_64(w));
|
||||
}
|
||||
return false;
|
||||
}
|
10
tool/build/lib/isnocompressext.h
Normal file
10
tool/build/lib/isnocompressext.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef COSMOPOLITAN_TOOL_BUILD_LIB_ISNOCOMPRESSEXT_H_
|
||||
#define COSMOPOLITAN_TOOL_BUILD_LIB_ISNOCOMPRESSEXT_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
bool IsNoCompressExt(const char *, size_t);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_TOOL_BUILD_LIB_ISNOCOMPRESSEXT_H_ */
|
38
tool/build/lib/stripcomponents.c
Normal file
38
tool/build/lib/stripcomponents.c
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "tool/build/lib/stripcomponents.h"
|
||||
|
||||
/**
|
||||
* Strips leading directory components.
|
||||
*
|
||||
* The basename is never stripped.
|
||||
*/
|
||||
char *StripComponents(const char *path, int n) {
|
||||
const char *p;
|
||||
while (n-- > 0) {
|
||||
while (*path == '/') ++path;
|
||||
for (p = path; *p; ++p) {
|
||||
if (*p == '/') {
|
||||
path = p + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (char *)path;
|
||||
}
|
10
tool/build/lib/stripcomponents.h
Normal file
10
tool/build/lib/stripcomponents.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef COSMOPOLITAN_TOOL_BUILD_LIB_STRIPCOMPONENTS_H_
|
||||
#define COSMOPOLITAN_TOOL_BUILD_LIB_STRIPCOMPONENTS_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
char *StripComponents(const char *, int);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_TOOL_BUILD_LIB_STRIPCOMPONENTS_H_ */
|
|
@ -102,7 +102,7 @@ const struct MachineFdCb kMachineFdCbHost = {
|
|||
.close = close,
|
||||
.readv = readv,
|
||||
.writev = writev,
|
||||
.ioctl = ioctl,
|
||||
.ioctl = (void *)ioctl,
|
||||
};
|
||||
|
||||
static int XlatSignal(int sig) {
|
||||
|
|
|
@ -369,6 +369,7 @@ int main(int argc, char *argv[]) {
|
|||
bool needprefix;
|
||||
size_t i, bitmaplen;
|
||||
const char *path, *prefix;
|
||||
if (argc == 2 && !strcmp(argv[1], "-n")) exit(0);
|
||||
showcrashreports();
|
||||
out = "/dev/stdout";
|
||||
GetOpts(argc, argv);
|
||||
|
|
|
@ -679,6 +679,7 @@ void Package(int argc, char *argv[], struct Package *pkg,
|
|||
int main(int argc, char *argv[]) {
|
||||
struct Package pkg;
|
||||
struct Packages deps;
|
||||
if (argc == 2 && !strcmp(argv[1], "-n")) exit(0);
|
||||
showcrashreports();
|
||||
memset(&pkg, 0, sizeof(pkg));
|
||||
memset(&deps, 0, sizeof(deps));
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/arraylist.internal.h"
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/bits/bswap.h"
|
||||
#include "libc/bits/safemacros.internal.h"
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/stat.h"
|
||||
|
@ -33,6 +34,7 @@
|
|||
#include "libc/nexgen32e/crc32.h"
|
||||
#include "libc/nt/enum/fileflagandattributes.h"
|
||||
#include "libc/nt/struct/imageauxsymbolex.internal.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/symbols.internal.h"
|
||||
|
@ -52,23 +54,26 @@
|
|||
#include "third_party/getopt/getopt.h"
|
||||
#include "third_party/zlib/zlib.h"
|
||||
#include "tool/build/lib/elfwriter.h"
|
||||
#include "tool/build/lib/isnocompressext.h"
|
||||
#include "tool/build/lib/stripcomponents.h"
|
||||
|
||||
#define ZIP_LOCALFILE_SECTION ".zip.2."
|
||||
#define ZIP_DIRECTORY_SECTION ".zip.4."
|
||||
|
||||
char *name_;
|
||||
char *yoink_;
|
||||
char *symbol_;
|
||||
char *outpath_;
|
||||
char *yoink_;
|
||||
bool nocompress_;
|
||||
bool basenamify_;
|
||||
int64_t image_base_;
|
||||
|
||||
const size_t kMinCompressSize = 32;
|
||||
const char kNoCompressExts[][8] = {".gz", ".xz", ".jpg", ".png",
|
||||
".gif", ".zip", ".bz2", ".mpg",
|
||||
".mp4", ".lz4", ".webp", ".mpeg"};
|
||||
int strip_components_;
|
||||
const char *path_prefix_;
|
||||
|
||||
wontreturn void PrintUsage(int rc, FILE *f) {
|
||||
fprintf(f, "%s%s%s\n", "Usage: ", program_invocation_name,
|
||||
" [-o FILE] [-s SYMBOL] [-y YOINK] [FILE...]\n");
|
||||
" [-n] [-B] [-C INT] [-P PREFIX] [-o FILE] [-s SYMBOL] [-y YOINK] "
|
||||
"[FILE...]\n");
|
||||
exit(rc);
|
||||
}
|
||||
|
||||
|
@ -76,20 +81,37 @@ void GetOpts(int *argc, char ***argv) {
|
|||
int opt;
|
||||
yoink_ = "__zip_start";
|
||||
image_base_ = IMAGE_BASE_VIRTUAL;
|
||||
while ((opt = getopt(*argc, *argv, "?ho:s:y:b:")) != -1) {
|
||||
while ((opt = getopt(*argc, *argv, "?0nhBN:C:P:o:s:y:b:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'o':
|
||||
outpath_ = optarg;
|
||||
break;
|
||||
case 'n':
|
||||
exit(0);
|
||||
case 's':
|
||||
symbol_ = optarg;
|
||||
break;
|
||||
case 'y':
|
||||
yoink_ = optarg;
|
||||
break;
|
||||
case 'N':
|
||||
name_ = optarg;
|
||||
break;
|
||||
case 'P':
|
||||
path_prefix_ = optarg;
|
||||
break;
|
||||
case 'C':
|
||||
strip_components_ = atoi(optarg);
|
||||
break;
|
||||
case 'B':
|
||||
basenamify_ = true;
|
||||
break;
|
||||
case 'b':
|
||||
image_base_ = strtol(optarg, NULL, 0);
|
||||
break;
|
||||
case '0':
|
||||
nocompress_ = true;
|
||||
break;
|
||||
case '?':
|
||||
case 'h':
|
||||
PrintUsage(EXIT_SUCCESS, stdout);
|
||||
|
@ -105,8 +127,8 @@ void GetOpts(int *argc, char ***argv) {
|
|||
bool IsUtf8(const void *data, size_t size) {
|
||||
const unsigned char *p, *pe;
|
||||
for (p = data, pe = p + size; p + 2 <= pe; ++p) {
|
||||
if (*p >= 0300) {
|
||||
if (*p >= 0200 && *p < 0300) {
|
||||
if (p[0] >= 0300) {
|
||||
if (p[1] >= 0200 && p[1] < 0300) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
@ -126,16 +148,10 @@ bool IsText(const void *data, size_t size) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ShouldCompress(const char *name, size_t size) {
|
||||
size_t i;
|
||||
char key[8];
|
||||
const char *p;
|
||||
if (!(p = memrchr(name, '.', size))) return true;
|
||||
strncpy(key, p, sizeof(key));
|
||||
for (i = 0; i < ARRAYLEN(kNoCompressExts); ++i) {
|
||||
if (memcmp(key, kNoCompressExts[i], sizeof(key)) == 0) return false;
|
||||
}
|
||||
return true;
|
||||
bool ShouldCompress(const char *name, size_t namesize,
|
||||
const unsigned char *data, size_t datasize) {
|
||||
return !nocompress_ && datasize >= 64 && !IsNoCompressExt(name, namesize) &&
|
||||
(datasize < 1000 || MeasureEntropy((void *)data, 1000) < 6);
|
||||
}
|
||||
|
||||
void GetDosLocalTime(int64_t utcunixts, uint16_t *out_time,
|
||||
|
@ -242,10 +258,12 @@ void EmitZip(struct ElfWriter *elf, const char *name, size_t namesize,
|
|||
crc = crc32_z(0, data, uncompsize);
|
||||
GetDosLocalTime(st->st_mtim.tv_sec, &mtime, &mdate);
|
||||
if (IsUtf8(name, namesize)) gflags |= kZipGflagUtf8;
|
||||
if (IsText(data, st->st_size)) iattrs |= kZipIattrText;
|
||||
if (S_ISREG(st->st_mode) && IsText(data, st->st_size)) {
|
||||
iattrs |= kZipIattrText;
|
||||
}
|
||||
commentsize = kZipCdirHdrLinkableSize - (CFILE_HDR_SIZE + namesize);
|
||||
dosmode = !(st->st_mode & 0200) ? kNtFileAttributeReadonly : 0;
|
||||
method = (st->st_size >= kMinCompressSize && ShouldCompress(name, namesize))
|
||||
method = ShouldCompress(name, namesize, data, st->st_size)
|
||||
? kZipCompressionDeflate
|
||||
: kZipCompressionNone;
|
||||
|
||||
|
@ -310,20 +328,34 @@ void ProcessFile(struct ElfWriter *elf, const char *path) {
|
|||
void *map;
|
||||
size_t pathlen;
|
||||
struct stat st;
|
||||
pathlen = strlen(path);
|
||||
const char *name;
|
||||
CHECK_NE(-1, (fd = open(path, O_RDONLY)));
|
||||
CHECK_NE(-1, fstat(fd, &st));
|
||||
if (st.st_size) {
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
map = "";
|
||||
st.st_size = 0;
|
||||
} else if (st.st_size) {
|
||||
CHECK_NE(MAP_FAILED,
|
||||
(map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)));
|
||||
CHECK_NE(-1, close(fd));
|
||||
} else {
|
||||
map = NULL;
|
||||
}
|
||||
EmitZip(elf, path, pathlen, map, &st);
|
||||
if (st.st_size) {
|
||||
CHECK_NE(-1, munmap(map, st.st_size));
|
||||
if (name_) {
|
||||
name = name_;
|
||||
} else {
|
||||
name = path;
|
||||
if (basenamify_) name = basename(name);
|
||||
name = StripComponents(name, strip_components_);
|
||||
if (path_prefix_) name = gc(xjoinpaths(path_prefix_, name));
|
||||
}
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
if (!endswith(name, "/")) {
|
||||
name = gc(xasprintf("%s/", name));
|
||||
}
|
||||
}
|
||||
EmitZip(elf, name, strlen(name), map, &st);
|
||||
if (st.st_size) CHECK_NE(-1, munmap(map, st.st_size));
|
||||
close(fd);
|
||||
}
|
||||
|
||||
void PullEndOfCentralDirectoryIntoLinkage(struct ElfWriter *elf) {
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
|
||||
(cosmo
|
||||
'("__COSMOPOLITAN__"
|
||||
"__ANDROID__"
|
||||
"__LINKER__"))
|
||||
|
||||
)
|
||||
|
|
313
tool/net/net.mk
313
tool/net/net.mk
|
@ -7,73 +7,73 @@ TOOL_NET_FILES := $(wildcard tool/net/*)
|
|||
TOOL_NET_SRCS = $(filter %.c,$(TOOL_NET_FILES))
|
||||
TOOL_NET_HDRS = $(filter %.h,$(TOOL_NET_FILES))
|
||||
|
||||
TOOL_NET_OBJS = \
|
||||
TOOL_NET_OBJS = \
|
||||
$(TOOL_NET_SRCS:%.c=o/$(MODE)/%.o)
|
||||
|
||||
TOOL_NET_BINS = \
|
||||
$(TOOL_NET_COMS) \
|
||||
TOOL_NET_BINS = \
|
||||
$(TOOL_NET_COMS) \
|
||||
$(TOOL_NET_COMS:%=%.dbg)
|
||||
|
||||
TOOL_NET_COMS = \
|
||||
o/$(MODE)/tool/net/dig.com \
|
||||
o/$(MODE)/tool/net/echoserver.com \
|
||||
o/$(MODE)/tool/net/redbean.com \
|
||||
o/$(MODE)/tool/net/redbean-demo.com \
|
||||
o/$(MODE)/tool/net/redbean-static.com \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com \
|
||||
o/$(MODE)/tool/net/redbean-original.com \
|
||||
o/$(MODE)/tool/net/echoserver.com \
|
||||
TOOL_NET_COMS = \
|
||||
o/$(MODE)/tool/net/dig.com \
|
||||
o/$(MODE)/tool/net/echoserver.com \
|
||||
o/$(MODE)/tool/net/redbean.com \
|
||||
o/$(MODE)/tool/net/redbean-demo.com \
|
||||
o/$(MODE)/tool/net/redbean-static.com \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com \
|
||||
o/$(MODE)/tool/net/redbean-original.com \
|
||||
o/$(MODE)/tool/net/echoserver.com \
|
||||
o/$(MODE)/tool/net/wb.com
|
||||
|
||||
TOOL_NET_DIRECTDEPS = \
|
||||
LIBC_ALG \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_DNS \
|
||||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
LIBC_LOG \
|
||||
LIBC_MEM \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_NT_IPHLPAPI \
|
||||
LIBC_NT_KERNEL32 \
|
||||
LIBC_RAND \
|
||||
LIBC_RUNTIME \
|
||||
LIBC_SOCK \
|
||||
LIBC_STDIO \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_SYSV \
|
||||
LIBC_SYSV_CALLS \
|
||||
LIBC_TIME \
|
||||
LIBC_TINYMATH \
|
||||
LIBC_UNICODE \
|
||||
LIBC_X \
|
||||
LIBC_ZIPOS \
|
||||
NET_HTTP \
|
||||
NET_HTTPS \
|
||||
TOOL_BUILD_LIB \
|
||||
THIRD_PARTY_GDTOA \
|
||||
THIRD_PARTY_GETOPT \
|
||||
THIRD_PARTY_LUA \
|
||||
THIRD_PARTY_MBEDTLS \
|
||||
THIRD_PARTY_REGEX \
|
||||
THIRD_PARTY_SQLITE3 \
|
||||
THIRD_PARTY_ZLIB \
|
||||
TOOL_NET_DIRECTDEPS = \
|
||||
LIBC_ALG \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_DNS \
|
||||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
LIBC_LOG \
|
||||
LIBC_MEM \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_NT_IPHLPAPI \
|
||||
LIBC_NT_KERNEL32 \
|
||||
LIBC_RAND \
|
||||
LIBC_RUNTIME \
|
||||
LIBC_SOCK \
|
||||
LIBC_STDIO \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_SYSV \
|
||||
LIBC_SYSV_CALLS \
|
||||
LIBC_TIME \
|
||||
LIBC_TINYMATH \
|
||||
LIBC_UNICODE \
|
||||
LIBC_X \
|
||||
LIBC_ZIPOS \
|
||||
NET_HTTP \
|
||||
NET_HTTPS \
|
||||
TOOL_BUILD_LIB \
|
||||
THIRD_PARTY_GDTOA \
|
||||
THIRD_PARTY_GETOPT \
|
||||
THIRD_PARTY_LUA \
|
||||
THIRD_PARTY_MBEDTLS \
|
||||
THIRD_PARTY_REGEX \
|
||||
THIRD_PARTY_SQLITE3 \
|
||||
THIRD_PARTY_ZLIB \
|
||||
TOOL_DECODE_LIB
|
||||
|
||||
TOOL_NET_DEPS := \
|
||||
TOOL_NET_DEPS := \
|
||||
$(call uniq,$(foreach x,$(TOOL_NET_DIRECTDEPS),$($(x))))
|
||||
|
||||
o/$(MODE)/tool/net/net.pkg: \
|
||||
$(TOOL_NET_OBJS) \
|
||||
o/$(MODE)/tool/net/net.pkg: \
|
||||
$(TOOL_NET_OBJS) \
|
||||
$(foreach x,$(TOOL_NET_DIRECTDEPS),$($(x)_A).pkg)
|
||||
|
||||
o/$(MODE)/tool/net/%.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/%.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
o/$(MODE)/tool/net/%.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/%.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
|
@ -81,22 +81,22 @@ o/$(MODE)/tool/net/%.com.dbg: \
|
|||
#
|
||||
# The little web server that could!
|
||||
|
||||
o/$(MODE)/tool/net/redbean.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
o/$(MODE)/tool/net/redbean.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/net/redbean.com: \
|
||||
o/$(MODE)/tool/net/redbean.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/net.mk \
|
||||
tool/net/help.txt \
|
||||
tool/net/.init.lua \
|
||||
tool/net/favicon.ico \
|
||||
o/$(MODE)/tool/net/redbean.com: \
|
||||
o/$(MODE)/tool/net/redbean.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/net.mk \
|
||||
tool/net/help.txt \
|
||||
tool/net/.init.lua \
|
||||
tool/net/favicon.ico \
|
||||
tool/net/redbean.png
|
||||
@$(COMPILE) -AOBJCOPY -T$@ $(OBJCOPY) -S -O binary $< $@
|
||||
@$(COMPILE) -ADD -T$@ dd if=$@ of=o/$(MODE)/tool/net/.ape bs=64 count=11 conv=notrunc 2>/dev/null
|
||||
|
@ -108,80 +108,93 @@ o/$(MODE)/tool/net/redbean.com: \
|
|||
# bundles a bunch of example code and there's a live of it available
|
||||
# online at http://redbean.justine.lol/
|
||||
|
||||
o/$(MODE)/tool/net/redbean-demo.com.dbg: \
|
||||
o/$(MODE)/tool/net/redbean.com.dbg
|
||||
@$(COMPILE) -ACP -T$@ cp $< $@
|
||||
o/$(MODE)/tool/net/demo/.init.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/.reload.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/sql.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/fetch.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/hello.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/opensource.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/closedsource.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/printpayload.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean-form.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean-xhr.lua.zip.o \
|
||||
o/$(MODE)/tool/net/redbean.png.zip.o \
|
||||
o/$(MODE)/tool/net/favicon.ico.zip.o \
|
||||
o/$(MODE)/tool/net/demo/404.html.zip.o: \
|
||||
ZIPOBJ_FLAGS += \
|
||||
-B
|
||||
|
||||
o/$(MODE)/tool/net/redbean-demo.com: \
|
||||
o/$(MODE)/tool/net/redbean-demo.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/net.mk \
|
||||
tool/net/favicon.ico \
|
||||
tool/net/redbean.png \
|
||||
tool/net/help.txt \
|
||||
tool/net/demo/.init.lua \
|
||||
tool/net/demo/.reload.lua \
|
||||
tool/net/demo/.lua/mymodule.lua \
|
||||
tool/net/demo/sql.lua \
|
||||
tool/net/demo/404.html \
|
||||
tool/net/demo/hello.lua \
|
||||
tool/net/demo/index.html \
|
||||
tool/net/demo/redbean.css \
|
||||
tool/net/demo/redbean.lua \
|
||||
tool/net/demo/redbean-form.lua \
|
||||
tool/net/demo/redbean-xhr.lua \
|
||||
tool/net/demo/seekable.txt \
|
||||
tool/net/demo/virtualbean.html \
|
||||
tool/net/demo/printpayload.lua \
|
||||
tool/net/demo/opensource.lua \
|
||||
o/$(MODE)/tool/net/demo/closedsource.lua \
|
||||
tool/net/demo/fetch.lua \
|
||||
tool/net/redbean.c \
|
||||
net/http/parsehttpmessage.c \
|
||||
net/http/parseurl.c \
|
||||
net/http/encodeurl.c \
|
||||
test/net/http/parsehttpmessage_test.c \
|
||||
test/net/http/parseurl_test.c
|
||||
o/$(MODE)/tool/net/demo/.lua/mymodule.lua.zip.o: \
|
||||
ZIPOBJ_FLAGS += \
|
||||
-C3
|
||||
|
||||
o/$(MODE)/tool/net/demo/seekable.txt.zip.o: \
|
||||
ZIPOBJ_FLAGS += \
|
||||
-B \
|
||||
-0
|
||||
|
||||
o/$(MODE)/tool/net/demo/virtualbean.html.zip.o: \
|
||||
ZIPOBJ_FLAGS += \
|
||||
-Predbean.justine.lol \
|
||||
-B
|
||||
|
||||
o/$(MODE)/tool/net/redbean-demo.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
o/$(MODE)/tool/net/demo/sql.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/fetch.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/hello.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/opensource.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/closedsource.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/printpayload.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean-form.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean-xhr.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/index.html.zip.o \
|
||||
o/$(MODE)/tool/net/demo/redbean.css.zip.o \
|
||||
o/$(MODE)/tool/net/redbean.png.zip.o \
|
||||
o/$(MODE)/tool/net/favicon.ico.zip.o \
|
||||
o/$(MODE)/tool/net/demo/404.html.zip.o \
|
||||
o/$(MODE)/tool/net/demo/seekable.txt.zip.o \
|
||||
o/$(MODE)/tool/net/demo/virtualbean.html.zip.o \
|
||||
o/$(MODE)/tool/net/demo/.lua/mymodule.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/.reload.lua.zip.o \
|
||||
o/$(MODE)/tool/net/demo/.init.lua.zip.o \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
o/$(MODE)/tool/net/redbean-demo.com: \
|
||||
o/$(MODE)/tool/net/redbean-demo.com.dbg
|
||||
@$(COMPILE) -AOBJCOPY -T$@ $(OBJCOPY) -S -O binary $< $@
|
||||
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/.redbean-demo
|
||||
@$(COMPILE) -ADD -T$@ dd if=$@ of=o/$(MODE)/tool/net/.redbean-demo/.ape bs=64 count=11 conv=notrunc 2>/dev/null
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ o/$(MODE)/tool/net/.redbean-demo/.ape tool/net/help.txt tool/net/demo/.init.lua tool/net/demo/.reload.lua
|
||||
@$(COMPILE) -ARM -T$@ rm -rf o/$(MODE)/tool/net/.lua
|
||||
@$(COMPILE) -ACP -T$@ cp -R tool/net/demo/.lua o/$(MODE)/tool/net/
|
||||
@(cd o/$(MODE)/tool/net && ../../host/third_party/infozip/zip.com -qr redbean-demo.com .lua)
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ tool/net/demo/hello.lua tool/net/demo/sql.lua
|
||||
@echo "<-- check out this lua server page" | $(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -cqj $@ tool/net/demo/redbean.lua
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ tool/net/demo/404.html tool/net/favicon.ico tool/net/redbean.png tool/net/demo/redbean-form.lua tool/net/demo/redbean-xhr.lua tool/net/demo/printpayload.lua tool/net/demo/fetch.lua o/$(MODE)/tool/net/demo/closedsource.lua tool/net/demo/opensource.lua
|
||||
@echo Uncompressed for HTTP Range requests | $(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -cqj0 $@ tool/net/demo/seekable.txt
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -q $@ tool/net/ tool/net/demo/ tool/net/demo/index.html tool/net/demo/redbean.css tool/net/redbean.c net/http/parsehttpmessage.c net/http/parseurl.c net/http/encodeurl.c test/net/http/parsehttpmessage_test.c test/net/http/parseurl_test.c
|
||||
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/virtualbean.justine.lol/
|
||||
@$(COMPILE) -ACP -T$@ cp tool/net/redbean.png o/$(MODE)/tool/net/virtualbean.justine.lol/redbean.png
|
||||
@$(COMPILE) -ACP -T$@ cp tool/net/demo/virtualbean.html o/$(MODE)/tool/net/virtualbean.justine.lol/index.html
|
||||
@(cd o/$(MODE)/tool/net && ../../host/third_party/infozip/zip.com -q redbean-demo.com virtualbean.justine.lol/)
|
||||
@(cd o/$(MODE)/tool/net && echo 'Go to <a href=http://virtualbean.justine.lol>http://virtualbean.justine.lol</a>' | ../../host/third_party/infozip/zip.com -cq redbean-demo.com virtualbean.justine.lol/index.html)
|
||||
@(cd o/$(MODE)/tool/net && ../../host/third_party/infozip/zip.com -q redbean-demo.com virtualbean.justine.lol/redbean.png)
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ o/$(MODE)/tool/net/.redbean-demo/.ape
|
||||
|
||||
# REDBEAN-STATIC.COM
|
||||
#
|
||||
# Passing the -DSTATIC causes Lua and SQLite to be removed. This reduces
|
||||
# the binary size from roughly 1500 kb to 500 kb. It still supports SSL.
|
||||
|
||||
o/$(MODE)/tool/net/redbean-static.com: \
|
||||
o/$(MODE)/tool/net/redbean-static.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/help.txt \
|
||||
tool/net/favicon.ico \
|
||||
o/$(MODE)/tool/net/redbean-static.com: \
|
||||
o/$(MODE)/tool/net/redbean-static.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/help.txt \
|
||||
tool/net/favicon.ico \
|
||||
tool/net/redbean.png
|
||||
@$(COMPILE) -AOBJCOPY -T$@ $(OBJCOPY) -S -O binary $< $@
|
||||
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/.redbean-static
|
||||
@$(COMPILE) -ADD -T$@ dd if=$@ of=o/$(MODE)/tool/net/.redbean-static/.ape bs=64 count=11 conv=notrunc 2>/dev/null
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ o/$(MODE)/tool/net/.redbean-static/.ape tool/net/help.txt tool/net/favicon.ico tool/net/redbean.png
|
||||
|
||||
o/$(MODE)/tool/net/redbean-static.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean-static.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
o/$(MODE)/tool/net/redbean-static.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean-static.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
|
@ -194,23 +207,23 @@ o/$(MODE)/tool/net/redbean-static.o: tool/net/redbean.c
|
|||
# That doesn't mean redbean becomes insecure. It just reduces complexity
|
||||
# in situations where you'd rather have SSL be handled in an edge proxy.
|
||||
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com: \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/help.txt \
|
||||
tool/net/favicon.ico \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com: \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/help.txt \
|
||||
tool/net/favicon.ico \
|
||||
tool/net/redbean.png
|
||||
@$(COMPILE) -AOBJCOPY -T$@ $(OBJCOPY) -S -O binary $< $@
|
||||
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/.redbean-unsecure
|
||||
@$(COMPILE) -ADD -T$@ dd if=$@ of=o/$(MODE)/tool/net/.redbean-unsecure/.ape bs=64 count=11 conv=notrunc 2>/dev/null
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ o/$(MODE)/tool/net/.redbean-unsecure/.ape tool/net/help.txt tool/net/favicon.ico tool/net/redbean.png
|
||||
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean-unsecure.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
|
@ -223,23 +236,23 @@ o/$(MODE)/tool/net/redbean-unsecure.o: tool/net/redbean.c
|
|||
# produce 200kb binary that's very similar to redbean as it existed on
|
||||
# Hacker News the day it went viral.
|
||||
|
||||
o/$(MODE)/tool/net/redbean-original.com: \
|
||||
o/$(MODE)/tool/net/redbean-original.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/help.txt \
|
||||
tool/net/favicon.ico \
|
||||
o/$(MODE)/tool/net/redbean-original.com: \
|
||||
o/$(MODE)/tool/net/redbean-original.com.dbg \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com \
|
||||
tool/net/help.txt \
|
||||
tool/net/favicon.ico \
|
||||
tool/net/redbean.png
|
||||
@$(COMPILE) -AOBJCOPY -T$@ $(OBJCOPY) -S -O binary $< $@
|
||||
@$(COMPILE) -AMKDIR -T$@ mkdir -p o/$(MODE)/tool/net/.redbean-original
|
||||
@$(COMPILE) -ADD -T$@ dd if=$@ of=o/$(MODE)/tool/net/.redbean-original/.ape bs=64 count=11 conv=notrunc 2>/dev/null
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ o/$(MODE)/tool/net/.redbean-original/.ape tool/net/help.txt tool/net/favicon.ico tool/net/redbean.png
|
||||
|
||||
o/$(MODE)/tool/net/redbean-original.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean-original.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
o/$(MODE)/tool/net/redbean-original.com.dbg: \
|
||||
$(TOOL_NET_DEPS) \
|
||||
o/$(MODE)/tool/net/redbean-original.o \
|
||||
o/$(MODE)/tool/net/lsqlite3.o \
|
||||
o/$(MODE)/tool/net/net.pkg \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
|
@ -247,6 +260,6 @@ o/$(MODE)/tool/net/redbean-original.o: tool/net/redbean.c
|
|||
@$(COMPILE) -AOBJECTIFY.c $(OBJECTIFY.c) -DSTATIC -DUNSECURE -DREDBEAN=\"redbean-original\" $(OUTPUT_OPTION) $<
|
||||
|
||||
.PHONY: o/$(MODE)/tool/net
|
||||
o/$(MODE)/tool/net: \
|
||||
$(TOOL_NET_BINS) \
|
||||
o/$(MODE)/tool/net: \
|
||||
$(TOOL_NET_BINS) \
|
||||
$(TOOL_NET_CHECKS)
|
||||
|
|
|
@ -114,7 +114,6 @@
|
|||
#include "third_party/mbedtls/sha1.h"
|
||||
#include "third_party/mbedtls/ssl.h"
|
||||
#include "third_party/mbedtls/ssl_ticket.h"
|
||||
#include "third_party/mbedtls/traceme.h"
|
||||
#include "third_party/mbedtls/x509.h"
|
||||
#include "third_party/mbedtls/x509_crt.h"
|
||||
#include "third_party/regex/regex.h"
|
||||
|
@ -1069,7 +1068,7 @@ static int LuaCallWithTrace(lua_State *L, int nargs, int nres) {
|
|||
// pop the coroutine, so that the function is at the top
|
||||
lua_pop(L, 1);
|
||||
// move the function (and arguments) to the top of the coro stack
|
||||
lua_xmove(L, co, nargs+1);
|
||||
lua_xmove(L, co, nargs + 1);
|
||||
// resume the coroutine thus executing the function
|
||||
status = lua_resume(co, L, nargs, &nresults);
|
||||
if (status != LUA_OK && status != LUA_YIELD) {
|
||||
|
@ -1077,16 +1076,15 @@ static int LuaCallWithTrace(lua_State *L, int nargs, int nres) {
|
|||
lua_xmove(co, L, 1);
|
||||
// replace the error with the traceback on failure
|
||||
luaL_traceback(L, co, lua_tostring(L, -1), 0);
|
||||
lua_remove(L, -2); // remove the error message
|
||||
lua_remove(L, -2); // remove the error message
|
||||
} else {
|
||||
// move results to the main stack
|
||||
lua_xmove(co, L, nresults);
|
||||
// grow the stack in case returned fewer results
|
||||
// than the caller expects, as lua_resume
|
||||
// doesn't adjust the stack for needed results
|
||||
for (; nresults < nres; nresults++)
|
||||
lua_pushnil(L);
|
||||
status = LUA_OK; // treat LUA_YIELD the same as LUA_OK
|
||||
for (; nresults < nres; nresults++) lua_pushnil(L);
|
||||
status = LUA_OK; // treat LUA_YIELD the same as LUA_OK
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
@ -2533,7 +2531,8 @@ static char *CommitOutput(char *p) {
|
|||
return p;
|
||||
}
|
||||
|
||||
static char *ServeDefaultErrorPage(char *p, unsigned code, const char *reason, const char *details) {
|
||||
static char *ServeDefaultErrorPage(char *p, unsigned code, const char *reason,
|
||||
const char *details) {
|
||||
p = AppendContentType(p, "text/html; charset=ISO-8859-1");
|
||||
reason = FreeLater(EscapeHtml(reason, -1, 0));
|
||||
appends(&outbuf, "\
|
||||
|
@ -2551,13 +2550,15 @@ img { vertical-align: middle; }\r\n\
|
|||
appendf(&outbuf, "%d %s\r\n", code, reason);
|
||||
appends(&outbuf, "</h1>\r\n");
|
||||
if (details) {
|
||||
appendf(&outbuf, "<pre>%s</pre>\r\n", FreeLater(EscapeHtml(details, -1, 0)));
|
||||
appendf(&outbuf, "<pre>%s</pre>\r\n",
|
||||
FreeLater(EscapeHtml(details, -1, 0)));
|
||||
}
|
||||
UseOutput();
|
||||
return p;
|
||||
}
|
||||
|
||||
static char *ServeErrorImpl(unsigned code, const char *reason, const char *details) {
|
||||
static char *ServeErrorImpl(unsigned code, const char *reason,
|
||||
const char *details) {
|
||||
size_t n;
|
||||
char *p, *s;
|
||||
struct Asset *a;
|
||||
|
@ -2593,7 +2594,8 @@ static char *ServeErrorImpl(unsigned code, const char *reason, const char *detai
|
|||
}
|
||||
}
|
||||
|
||||
static char *ServeErrorWithDetail(unsigned code, const char *reason, const char *details) {
|
||||
static char *ServeErrorWithDetail(unsigned code, const char *reason,
|
||||
const char *details) {
|
||||
LOGF("ERROR %d %s", code, reason);
|
||||
return ServeErrorImpl(code, reason, details);
|
||||
}
|
||||
|
@ -3186,8 +3188,9 @@ static char *LuaOnHttpRequest(void) {
|
|||
} else {
|
||||
char *error;
|
||||
WARNF("%s", lua_tostring(L, -1));
|
||||
error = ServeErrorWithDetail(500, "Internal Server Error",
|
||||
IsLoopbackClient() ? lua_tostring(L, -1) : NULL);
|
||||
error =
|
||||
ServeErrorWithDetail(500, "Internal Server Error",
|
||||
IsLoopbackClient() ? lua_tostring(L, -1) : NULL);
|
||||
lua_pop(L, 1);
|
||||
return error;
|
||||
}
|
||||
|
@ -3200,15 +3203,17 @@ static char *ServeLua(struct Asset *a, const char *s, size_t n) {
|
|||
effectivepath.p = s;
|
||||
effectivepath.n = n;
|
||||
if ((code = FreeLater(LoadAsset(a, &codelen)))) {
|
||||
int status = luaL_loadbuffer(L, code, codelen,
|
||||
FreeLater(xasprintf("@%s", FreeLater(strndup(s, n)))));
|
||||
int status =
|
||||
luaL_loadbuffer(L, code, codelen,
|
||||
FreeLater(xasprintf("@%s", FreeLater(strndup(s, n)))));
|
||||
if (status == LUA_OK && LuaCallWithTrace(L, 0, 0) == LUA_OK) {
|
||||
return CommitOutput(GetLuaResponse());
|
||||
} else {
|
||||
char *error;
|
||||
WARNF("failed to run lua code: %s", lua_tostring(L, -1));
|
||||
error = ServeErrorWithDetail(500, "Internal Server Error",
|
||||
IsLoopbackClient() ? lua_tostring(L, -1) : NULL);
|
||||
error =
|
||||
ServeErrorWithDetail(500, "Internal Server Error",
|
||||
IsLoopbackClient() ? lua_tostring(L, -1) : NULL);
|
||||
lua_pop(L, 1);
|
||||
return error;
|
||||
}
|
||||
|
@ -5454,8 +5459,8 @@ static bool LuaRun(const char *path, bool mandatory) {
|
|||
effectivepath.p = path;
|
||||
effectivepath.n = pathlen;
|
||||
DEBUGF("LuaRun(%`'s)", path);
|
||||
status = luaL_loadbuffer(L, code, codelen,
|
||||
FreeLater(xasprintf("@%s", path)));
|
||||
status =
|
||||
luaL_loadbuffer(L, code, codelen, FreeLater(xasprintf("@%s", path)));
|
||||
if (status != LUA_OK || LuaCallWithTrace(L, 0, 0) != LUA_OK) {
|
||||
WARNF("script failed to run: %s", lua_tostring(L, -1));
|
||||
lua_pop(L, 1);
|
||||
|
@ -6616,7 +6621,6 @@ static void HandleConnection(size_t i) {
|
|||
if (funtrace && !IsTiny()) {
|
||||
ftrace_install();
|
||||
}
|
||||
++traceme;
|
||||
if (hasonworkerstart) {
|
||||
CallSimpleHook("OnWorkerStart");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue