From 8b469389f60a2c43d3ba1222fcca5e3deaf94054 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Thu, 21 Jul 2022 09:16:38 -0700 Subject: [PATCH] Remove plenty of makefile misconfigurations --- Makefile | 15 +- ape/ape.mk | 154 +++++--- build/bootstrap/package.com | Bin 125835 -> 217088 bytes build/rules.mk | 19 +- libc/dce.h | 1 - libc/integral/lp64arg.inc | 13 +- libc/mem/unveil.c | 6 +- libc/runtime/enable_tls.c | 30 +- libc/runtime/valist.c | 10 +- libc/runtime/valist.h | 17 - libc/sock/syslog.c | 1 - libc/testlib/testlib.mk | 1 + test/libc/calls/execve_test.c | 363 ------------------ test/libc/calls/vfork_test.c | 6 +- test/libc/mem/unveil_test.c | 69 +++- test/libc/release/smoke.c | 4 - test/libc/release/smokecxx.cc | 12 +- test/libc/runtime/mmap_test.c | 18 +- test/libc/stdio/popen_test.c | 35 -- test/libc/stdio/test.mk | 1 + test/libc/x/xslurp_test.c | 14 +- third_party/bzip2/bzip2.mk | 2 + third_party/libcxx/__mutex_base | 4 +- third_party/libcxx/string.h | 3 +- third_party/libcxx/wchar.h | 3 +- third_party/libcxx/wctype.h | 3 +- third_party/lz4cli/lz4cli.mk | 3 + third_party/make/dirname.h | 2 +- third_party/make/error.c | 8 +- third_party/make/getopt.c | 2 +- third_party/make/make.mk | 36 ++ third_party/mbedtls/test/lib.c | 1 + .../mbedtls/test/test_suite_ctr_drbg.c | 1 + .../mbedtls/test/test_suite_ctr_drbg.datax | 4 +- .../mbedtls/test/test_suite_entropy.datax | 4 +- .../test/test_suite_hmac_drbg.misc.datax | 12 +- third_party/mbedtls/test/test_suite_mpi.datax | 2 +- .../python/Lib/test/support/__init__.py | 2 +- third_party/python/Lib/test/test_tarfile.py | 5 +- third_party/python/Modules/_elementtree.c | 5 +- third_party/python/Objects/typeobject.c | 10 +- third_party/python/python.mk | 34 +- third_party/sqlite3/alter.shell.c | 1 + third_party/sqlite3/analyze.shell.c | 1 + third_party/sqlite3/appendvfs.shell.c | 1 + third_party/sqlite3/attach.shell.c | 1 + third_party/sqlite3/auth.shell.c | 1 + third_party/sqlite3/backup.shell.c | 1 + third_party/sqlite3/bitvec.shell.c | 1 + third_party/sqlite3/btmutex.shell.c | 1 + third_party/sqlite3/btree.shell.c | 1 + third_party/sqlite3/build.shell.c | 1 + third_party/sqlite3/callback.shell.c | 1 + third_party/sqlite3/complete.shell.c | 1 + third_party/sqlite3/completion.shell.c | 1 + third_party/sqlite3/ctime.shell.c | 1 + third_party/sqlite3/date.shell.c | 1 + third_party/sqlite3/dbdata.shell.c | 1 + third_party/sqlite3/dbpage.shell.c | 1 + third_party/sqlite3/dbstat.shell.c | 1 + third_party/sqlite3/decimal.shell.c | 1 + third_party/sqlite3/delete.shell.c | 1 + third_party/sqlite3/dog.py | 120 ++++++ third_party/sqlite3/expr.shell.c | 1 + third_party/sqlite3/fault.shell.c | 1 + third_party/sqlite3/fileio.c | 30 +- third_party/sqlite3/fileio.shell.c | 1 + third_party/sqlite3/fkey.shell.c | 1 + third_party/sqlite3/fts3.shell.c | 1 + third_party/sqlite3/fts3_aux.shell.c | 1 + third_party/sqlite3/fts3_expr.shell.c | 1 + third_party/sqlite3/fts3_hash.shell.c | 1 + third_party/sqlite3/fts3_icu.shell.c | 1 + third_party/sqlite3/fts3_porter.shell.c | 1 + third_party/sqlite3/fts3_snippet.shell.c | 1 + .../sqlite3/fts3_tokenize_vtab.shell.c | 1 + third_party/sqlite3/fts3_tokenizer.shell.c | 1 + third_party/sqlite3/fts3_tokenizer1.shell.c | 1 + third_party/sqlite3/fts3_unicode.shell.c | 1 + third_party/sqlite3/fts3_unicode2.shell.c | 1 + third_party/sqlite3/fts3_write.shell.c | 1 + third_party/sqlite3/fts5.c | 21 +- third_party/sqlite3/fts5.shell.c | 1 + third_party/sqlite3/func.shell.c | 1 + third_party/sqlite3/global.shell.c | 1 + third_party/sqlite3/hash.shell.c | 1 + third_party/sqlite3/icu.shell.c | 1 + third_party/sqlite3/ieee754.shell.c | 1 + third_party/sqlite3/insert.shell.c | 1 + third_party/sqlite3/json1.shell.c | 1 + third_party/sqlite3/legacy.shell.c | 1 + third_party/sqlite3/loadext.shell.c | 1 + third_party/sqlite3/main.shell.c | 1 + third_party/sqlite3/malloc.shell.c | 1 + third_party/sqlite3/mem0.shell.c | 1 + third_party/sqlite3/mem1.shell.c | 1 + third_party/sqlite3/mem2.shell.c | 1 + third_party/sqlite3/mem3.shell.c | 1 + third_party/sqlite3/mem5.shell.c | 1 + third_party/sqlite3/memdb.shell.c | 1 + third_party/sqlite3/memjournal.shell.c | 1 + third_party/sqlite3/memtrace.shell.c | 1 + third_party/sqlite3/mutex.shell.c | 1 + third_party/sqlite3/mutex_noop.shell.c | 1 + third_party/sqlite3/mutex_unix.shell.c | 1 + third_party/sqlite3/notify.shell.c | 1 + third_party/sqlite3/opcodes.shell.c | 1 + third_party/sqlite3/os.shell.c | 1 + third_party/sqlite3/os_unix.c | 1 - third_party/sqlite3/os_unix.shell.c | 1 + third_party/sqlite3/os_win.shell.c | 1 + third_party/sqlite3/pager.shell.c | 1 + third_party/sqlite3/parse.shell.c | 1 + third_party/sqlite3/pcache.shell.c | 1 + third_party/sqlite3/pcache1.shell.c | 1 + third_party/sqlite3/pragma.shell.c | 1 + third_party/sqlite3/prepare.shell.c | 1 + third_party/sqlite3/printf.shell.c | 1 + third_party/sqlite3/random.shell.c | 1 + third_party/sqlite3/resolve.shell.c | 1 + third_party/sqlite3/rowset.shell.c | 1 + third_party/sqlite3/rtree.shell.c | 1 + third_party/sqlite3/select.shell.c | 1 + third_party/sqlite3/series.shell.c | 1 + third_party/sqlite3/shathree.shell.c | 1 + third_party/sqlite3/shell.c | 79 +--- third_party/sqlite3/shell.c.in | 11 - third_party/sqlite3/sqlar.shell.c | 1 + third_party/sqlite3/sqlite3.mk | 27 +- third_party/sqlite3/sqlite3expert.shell.c | 1 + third_party/sqlite3/sqlite3rbu.shell.c | 1 + third_party/sqlite3/sqlite3session.shell.c | 1 + third_party/sqlite3/sqliteInt.inc | 7 + third_party/sqlite3/status.shell.c | 1 + third_party/sqlite3/stmt.shell.c | 1 + third_party/sqlite3/table.shell.c | 1 + third_party/sqlite3/threads.shell.c | 1 + third_party/sqlite3/tokenize.shell.c | 1 + third_party/sqlite3/treeview.shell.c | 1 + third_party/sqlite3/trigger.shell.c | 1 + third_party/sqlite3/uint.shell.c | 1 + third_party/sqlite3/update.shell.c | 1 + third_party/sqlite3/upsert.shell.c | 1 + third_party/sqlite3/userauth.shell.c | 1 + third_party/sqlite3/utf.shell.c | 1 + third_party/sqlite3/util.shell.c | 1 + third_party/sqlite3/vacuum.shell.c | 1 + third_party/sqlite3/vdbe.shell.c | 1 + third_party/sqlite3/vdbeapi.shell.c | 1 + third_party/sqlite3/vdbeaux.shell.c | 1 + third_party/sqlite3/vdbeblob.shell.c | 1 + third_party/sqlite3/vdbemem.shell.c | 1 + third_party/sqlite3/vdbesort.shell.c | 1 + third_party/sqlite3/vdbetrace.shell.c | 1 + third_party/sqlite3/vdbevtab.shell.c | 1 + third_party/sqlite3/vtab.shell.c | 1 + third_party/sqlite3/wal.shell.c | 1 + third_party/sqlite3/walker.shell.c | 1 + third_party/sqlite3/where.shell.c | 1 + third_party/sqlite3/wherecode.shell.c | 1 + third_party/sqlite3/whereexpr.shell.c | 1 + third_party/sqlite3/window.shell.c | 1 + third_party/sqlite3/zipfile.shell.c | 1 + third_party/zip/crypt.c | 11 +- third_party/zip/crypt_.c | 2 + third_party/zip/fileio_.c | 2 + third_party/zip/unix.c | 19 +- third_party/zip/unix_.c | 2 + third_party/zip/util_.c | 2 + third_party/zip/zip.h | 90 +---- third_party/zip/zip.mk | 15 +- third_party/zip/zipfile_.c | 2 + third_party/zlib/gz/gz.mk | 2 + third_party/zlib/zlib.mk | 6 +- tool/build/assimilate.c | 26 +- tool/build/build.mk | 65 +--- tool/build/chmod.c | 120 ++++++ tool/build/dd.c | 160 ++++++++ tool/build/mv.c | 222 +++++++++++ .../stdio/system_test.c => tool/build/ocat.c | 67 +++- tool/build/pledge.c | 2 +- tool/build/printf.c | 128 ++++++ tool/net/net.mk | 12 - tool/net/redbean-original.c | 4 + tool/net/redbean-static.c | 3 + tool/net/redbean-unsecure.c | 3 + 186 files changed, 1408 insertions(+), 901 deletions(-) delete mode 100644 libc/runtime/valist.h delete mode 100644 test/libc/calls/execve_test.c delete mode 100644 test/libc/stdio/popen_test.c create mode 100644 third_party/sqlite3/alter.shell.c create mode 100644 third_party/sqlite3/analyze.shell.c create mode 100644 third_party/sqlite3/appendvfs.shell.c create mode 100644 third_party/sqlite3/attach.shell.c create mode 100644 third_party/sqlite3/auth.shell.c create mode 100644 third_party/sqlite3/backup.shell.c create mode 100644 third_party/sqlite3/bitvec.shell.c create mode 100644 third_party/sqlite3/btmutex.shell.c create mode 100644 third_party/sqlite3/btree.shell.c create mode 100644 third_party/sqlite3/build.shell.c create mode 100644 third_party/sqlite3/callback.shell.c create mode 100644 third_party/sqlite3/complete.shell.c create mode 100644 third_party/sqlite3/completion.shell.c create mode 100644 third_party/sqlite3/ctime.shell.c create mode 100644 third_party/sqlite3/date.shell.c create mode 100644 third_party/sqlite3/dbdata.shell.c create mode 100644 third_party/sqlite3/dbpage.shell.c create mode 100644 third_party/sqlite3/dbstat.shell.c create mode 100644 third_party/sqlite3/decimal.shell.c create mode 100644 third_party/sqlite3/delete.shell.c create mode 100644 third_party/sqlite3/dog.py create mode 100644 third_party/sqlite3/expr.shell.c create mode 100644 third_party/sqlite3/fault.shell.c create mode 100644 third_party/sqlite3/fileio.shell.c create mode 100644 third_party/sqlite3/fkey.shell.c create mode 100644 third_party/sqlite3/fts3.shell.c create mode 100644 third_party/sqlite3/fts3_aux.shell.c create mode 100644 third_party/sqlite3/fts3_expr.shell.c create mode 100644 third_party/sqlite3/fts3_hash.shell.c create mode 100644 third_party/sqlite3/fts3_icu.shell.c create mode 100644 third_party/sqlite3/fts3_porter.shell.c create mode 100644 third_party/sqlite3/fts3_snippet.shell.c create mode 100644 third_party/sqlite3/fts3_tokenize_vtab.shell.c create mode 100644 third_party/sqlite3/fts3_tokenizer.shell.c create mode 100644 third_party/sqlite3/fts3_tokenizer1.shell.c create mode 100644 third_party/sqlite3/fts3_unicode.shell.c create mode 100644 third_party/sqlite3/fts3_unicode2.shell.c create mode 100644 third_party/sqlite3/fts3_write.shell.c create mode 100644 third_party/sqlite3/fts5.shell.c create mode 100644 third_party/sqlite3/func.shell.c create mode 100644 third_party/sqlite3/global.shell.c create mode 100644 third_party/sqlite3/hash.shell.c create mode 100644 third_party/sqlite3/icu.shell.c create mode 100644 third_party/sqlite3/ieee754.shell.c create mode 100644 third_party/sqlite3/insert.shell.c create mode 100644 third_party/sqlite3/json1.shell.c create mode 100644 third_party/sqlite3/legacy.shell.c create mode 100644 third_party/sqlite3/loadext.shell.c create mode 100644 third_party/sqlite3/main.shell.c create mode 100644 third_party/sqlite3/malloc.shell.c create mode 100644 third_party/sqlite3/mem0.shell.c create mode 100644 third_party/sqlite3/mem1.shell.c create mode 100644 third_party/sqlite3/mem2.shell.c create mode 100644 third_party/sqlite3/mem3.shell.c create mode 100644 third_party/sqlite3/mem5.shell.c create mode 100644 third_party/sqlite3/memdb.shell.c create mode 100644 third_party/sqlite3/memjournal.shell.c create mode 100644 third_party/sqlite3/memtrace.shell.c create mode 100644 third_party/sqlite3/mutex.shell.c create mode 100644 third_party/sqlite3/mutex_noop.shell.c create mode 100644 third_party/sqlite3/mutex_unix.shell.c create mode 100644 third_party/sqlite3/notify.shell.c create mode 100644 third_party/sqlite3/opcodes.shell.c create mode 100644 third_party/sqlite3/os.shell.c create mode 100644 third_party/sqlite3/os_unix.shell.c create mode 100644 third_party/sqlite3/os_win.shell.c create mode 100644 third_party/sqlite3/pager.shell.c create mode 100644 third_party/sqlite3/parse.shell.c create mode 100644 third_party/sqlite3/pcache.shell.c create mode 100644 third_party/sqlite3/pcache1.shell.c create mode 100644 third_party/sqlite3/pragma.shell.c create mode 100644 third_party/sqlite3/prepare.shell.c create mode 100644 third_party/sqlite3/printf.shell.c create mode 100644 third_party/sqlite3/random.shell.c create mode 100644 third_party/sqlite3/resolve.shell.c create mode 100644 third_party/sqlite3/rowset.shell.c create mode 100644 third_party/sqlite3/rtree.shell.c create mode 100644 third_party/sqlite3/select.shell.c create mode 100644 third_party/sqlite3/series.shell.c create mode 100644 third_party/sqlite3/shathree.shell.c create mode 100644 third_party/sqlite3/sqlar.shell.c create mode 100644 third_party/sqlite3/sqlite3expert.shell.c create mode 100644 third_party/sqlite3/sqlite3rbu.shell.c create mode 100644 third_party/sqlite3/sqlite3session.shell.c create mode 100644 third_party/sqlite3/status.shell.c create mode 100644 third_party/sqlite3/stmt.shell.c create mode 100644 third_party/sqlite3/table.shell.c create mode 100644 third_party/sqlite3/threads.shell.c create mode 100644 third_party/sqlite3/tokenize.shell.c create mode 100644 third_party/sqlite3/treeview.shell.c create mode 100644 third_party/sqlite3/trigger.shell.c create mode 100644 third_party/sqlite3/uint.shell.c create mode 100644 third_party/sqlite3/update.shell.c create mode 100644 third_party/sqlite3/upsert.shell.c create mode 100644 third_party/sqlite3/userauth.shell.c create mode 100644 third_party/sqlite3/utf.shell.c create mode 100644 third_party/sqlite3/util.shell.c create mode 100644 third_party/sqlite3/vacuum.shell.c create mode 100644 third_party/sqlite3/vdbe.shell.c create mode 100644 third_party/sqlite3/vdbeapi.shell.c create mode 100644 third_party/sqlite3/vdbeaux.shell.c create mode 100644 third_party/sqlite3/vdbeblob.shell.c create mode 100644 third_party/sqlite3/vdbemem.shell.c create mode 100644 third_party/sqlite3/vdbesort.shell.c create mode 100644 third_party/sqlite3/vdbetrace.shell.c create mode 100644 third_party/sqlite3/vdbevtab.shell.c create mode 100644 third_party/sqlite3/vtab.shell.c create mode 100644 third_party/sqlite3/wal.shell.c create mode 100644 third_party/sqlite3/walker.shell.c create mode 100644 third_party/sqlite3/where.shell.c create mode 100644 third_party/sqlite3/wherecode.shell.c create mode 100644 third_party/sqlite3/whereexpr.shell.c create mode 100644 third_party/sqlite3/window.shell.c create mode 100644 third_party/sqlite3/zipfile.shell.c create mode 100644 third_party/zip/crypt_.c create mode 100644 third_party/zip/fileio_.c create mode 100644 third_party/zip/unix_.c create mode 100644 third_party/zip/util_.c create mode 100644 third_party/zip/zipfile_.c create mode 100644 tool/build/chmod.c create mode 100644 tool/build/dd.c create mode 100644 tool/build/mv.c rename test/libc/stdio/system_test.c => tool/build/ocat.c (52%) create mode 100644 tool/build/printf.c create mode 100644 tool/net/redbean-original.c create mode 100644 tool/net/redbean-static.c create mode 100644 tool/net/redbean-unsecure.c diff --git a/Makefile b/Makefile index 41ab868ed..24b380bc9 100644 --- a/Makefile +++ b/Makefile @@ -59,8 +59,9 @@ # # build/config.mk -SHELL = build/bootstrap/cocmd.com -HOSTS ?= freebsd openbsd netbsd rhel7 rhel5 win7 win10 xnu +SHELL = build/bootstrap/cocmd.com +HOSTS ?= freebsd openbsd netbsd rhel7 rhel5 win7 win10 xnu +MAKEFLAGS += --no-builtin-rules .SUFFIXES: .DELETE_ON_ERROR: @@ -313,6 +314,7 @@ COSMOPOLITAN_OBJECTS = \ LIBC_NEXGEN32E COSMOPOLITAN_HEADERS = \ + APE \ LIBC \ LIBC_ALG \ LIBC_BITS \ @@ -350,10 +352,11 @@ COSMOPOLITAN_HEADERS = \ o/$(MODE)/cosmopolitan.a: \ $(foreach x,$(COSMOPOLITAN_OBJECTS),$($(x)_A_OBJS)) -o/cosmopolitan.h: \ - o/$(MODE)/tool/build/rollup.com \ - libc/integral/normalize.inc \ - $(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_HDRS)) +o/cosmopolitan.h: \ + o/$(MODE)/tool/build/rollup.com \ + libc/integral/normalize.inc \ + $(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_HDRS)) \ + $(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_INCS)) $(file >$@.args,libc/integral/normalize.inc $(foreach x,$(COSMOPOLITAN_HEADERS),$($(x)_HDRS))) @$(COMPILE) -AROLLUP -T$@ o/$(MODE)/tool/build/rollup.com @$@.args >$@ diff --git a/ape/ape.mk b/ape/ape.mk index 14b0880b3..661bd2d0f 100644 --- a/ape/ape.mk +++ b/ape/ape.mk @@ -15,38 +15,38 @@ PKGS += APE -APE = o/$(MODE)/ape/ape.o \ +APE = o/$(MODE)/ape/ape.o \ o/$(MODE)/ape/ape.lds -APE_NO_MODIFY_SELF = \ - o/$(MODE)/ape/ape.lds \ +APE_NO_MODIFY_SELF = \ + o/$(MODE)/ape/ape.lds \ o/$(MODE)/ape/ape-no-modify-self.o -APE_COPY_SELF = \ - o/$(MODE)/ape/ape.lds \ +APE_COPY_SELF = \ + o/$(MODE)/ape/ape.lds \ o/$(MODE)/ape/ape-copy-self.o -APELINK = \ - $(COMPILE) \ - -ALINK.ape \ - $(LINK) \ - $(LINKARGS) \ +APELINK = \ + $(COMPILE) \ + -ALINK.ape \ + $(LINK) \ + $(LINKARGS) \ $(OUTPUT_OPTION) -APE_LOADER_FLAGS = \ - -DNDEBUG \ - -iquote. \ - -Wall \ - -Wextra \ - -fpie \ - -Os \ - -ffreestanding \ - -mgeneral-regs-only \ - -mno-red-zone \ - -fno-ident \ - -fno-gnu-unique \ - -c \ - $(OUTPUT_OPTION) \ +APE_LOADER_FLAGS = \ + -DNDEBUG \ + -iquote. \ + -Wall \ + -Wextra \ + -fpie \ + -Os \ + -ffreestanding \ + -mgeneral-regs-only \ + -mno-red-zone \ + -fno-ident \ + -fno-gnu-unique \ + -c \ + $(OUTPUT_OPTION) \ $< APE_FILES := $(wildcard ape/*.*) @@ -58,32 +58,76 @@ APE_SRCS = $(APE_SRCS_C) $(APE_SRCS_S) APE_OBJS = $(APE_SRCS_S:%.S=o/$(MODE)/%.o) APE_CHECKS = $(APE_HDRS:%=o/%.ok) -o/$(MODE)/ape/ape.lds: \ - ape/ape.lds \ - ape/macros.internal.h \ - libc/dce.h \ +o/$(MODE)/ape/ape.lds: \ + ape/ape.lds \ + ape/macros.internal.h \ + ape/relocations.h \ + libc/bits/bits.h \ + libc/calls/struct/timespec.h \ + libc/dce.h \ + libc/elf/def.h \ + libc/elf/pf2prot.internal.h \ + libc/macros.internal.h \ + libc/nt/pedef.internal.h \ + libc/str/str.h \ libc/zip.h -o/ape/idata.inc: \ - ape/idata.internal.h \ +o/ape/idata.inc: \ + ape/idata.internal.h \ ape/relocations.h -o/$(MODE)/ape/ape-no-modify-self.o: \ - ape/ape.S \ +o/$(MODE)/ape/ape-no-modify-self.o: \ + ape/ape.S \ + ape/macros.internal.h \ + ape/notice.inc \ + ape/relocations.h \ + libc/dce.h \ + libc/elf/def.h \ + libc/intrin/asancodes.h \ + libc/macho.internal.h \ + libc/macros-cpp.internal.inc \ + libc/macros.internal.h \ + libc/macros.internal.inc \ + libc/nexgen32e/uart.internal.h \ + libc/nexgen32e/vidya.internal.h \ + libc/nt/pedef.internal.h \ + libc/runtime/e820.internal.h \ + libc/runtime/mman.internal.h \ + libc/runtime/pc.internal.h \ + libc/runtime/symbolic.h \ + libc/sysv/consts/prot.h \ o/$(MODE)/ape/ape.elf - @$(COMPILE) \ - -AOBJECTIFY.S \ - $(OBJECTIFY.S) \ - $(OUTPUT_OPTION) \ - -DAPE_NO_MODIFY_SELF \ + @$(COMPILE) \ + -AOBJECTIFY.S \ + $(OBJECTIFY.S) \ + $(OUTPUT_OPTION) \ + -DAPE_NO_MODIFY_SELF \ -DAPE_LOADER='"o/$(MODE)/ape/ape.elf"' $< -o/$(MODE)/ape/ape-copy-self.o: \ - ape/ape.S - @$(COMPILE) \ - -AOBJECTIFY.S \ - $(OBJECTIFY.S) \ - $(OUTPUT_OPTION) \ +o/$(MODE)/ape/ape-copy-self.o: \ + ape/ape.S \ + ape/macros.internal.h \ + ape/notice.inc \ + ape/relocations.h \ + libc/dce.h \ + libc/elf/def.h \ + libc/intrin/asancodes.h \ + libc/macho.internal.h \ + libc/macros-cpp.internal.inc \ + libc/macros.internal.h \ + libc/macros.internal.inc \ + libc/nexgen32e/uart.internal.h \ + libc/nexgen32e/vidya.internal.h \ + libc/nt/pedef.internal.h \ + libc/runtime/e820.internal.h \ + libc/runtime/mman.internal.h \ + libc/runtime/pc.internal.h \ + libc/runtime/symbolic.h \ + libc/sysv/consts/prot.h + @$(COMPILE) \ + -AOBJECTIFY.S \ + $(OBJECTIFY.S) \ + $(OUTPUT_OPTION) \ -DAPE_NO_MODIFY_SELF $< o/$(MODE)/ape/loader.o: ape/loader.c @@ -103,23 +147,23 @@ o/$(MODE)/ape/loader-xnu-clang.asm: ape/loader.c o/$(MODE)/ape/ape.elf: o/$(MODE)/ape/ape.elf.dbg o/$(MODE)/ape/ape.macho: o/$(MODE)/ape/ape.macho.dbg -o/$(MODE)/ape/ape.elf.dbg: \ - o/$(MODE)/ape/loader.o \ - o/$(MODE)/ape/loader-elf.o \ +o/$(MODE)/ape/ape.elf.dbg: \ + o/$(MODE)/ape/loader.o \ + o/$(MODE)/ape/loader-elf.o \ ape/loader.lds @$(ELFLINK) -z max-page-size=0x10 -o/$(MODE)/ape/ape.macho.dbg: \ - o/$(MODE)/ape/loader-xnu.o \ - o/$(MODE)/ape/loader-macho.o \ +o/$(MODE)/ape/ape.macho.dbg: \ + o/$(MODE)/ape/loader-xnu.o \ + o/$(MODE)/ape/loader-macho.o \ ape/loader-macho.lds @$(ELFLINK) -z max-page-size=0x10 .PHONY: o/$(MODE)/ape -o/$(MODE)/ape: $(APE_CHECKS) \ - o/$(MODE)/ape/ape.o \ - o/$(MODE)/ape/ape.lds \ - o/$(MODE)/ape/ape.elf \ - o/$(MODE)/ape/ape.macho \ - o/$(MODE)/ape/ape-copy-self.o \ +o/$(MODE)/ape: $(APE_CHECKS) \ + o/$(MODE)/ape/ape.o \ + o/$(MODE)/ape/ape.lds \ + o/$(MODE)/ape/ape.elf \ + o/$(MODE)/ape/ape.macho \ + o/$(MODE)/ape/ape-copy-self.o \ o/$(MODE)/ape/ape-no-modify-self.o diff --git a/build/bootstrap/package.com b/build/bootstrap/package.com index b5b0e8790c8c10eb8f192a58b6b9234efc5b5ded..d07ae145bf2b81d1830f46d374a24e56244d93b2 100755 GIT binary patch literal 217088 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 U5(pDJ2zNPJ!UTf>FzM@m0UQxF*8l(j diff --git a/build/rules.mk b/build/rules.mk index 503136ce7..e1e022e04 100644 --- a/build/rules.mk +++ b/build/rules.mk @@ -29,7 +29,6 @@ o/%.o: %.cc ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx o/%.o: o/%.cc ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx) $(OUTPUT_OPTION) $< o/%.lds: %.lds ; @$(COMPILE) -APREPROCESS $(PREPROCESS.lds) $(OUTPUT_OPTION) $< o/%.inc: %.h ; @$(COMPILE) -APREPROCESS $(PREPROCESS) $(OUTPUT_OPTION) -D__ASSEMBLER__ -P $< -o/%.h.ok: %.h ; @$(COMPILE) -ACHECK.h $(COMPILE.c) -xc -g0 -o $@ $< o/%.okk: % ; @$(COMPILE) -ACHECK.h $(COMPILE.cxx) -xc++ -g0 -o $@ $< o/%.greg.o: %.greg.c ; @$(COMPILE) -AOBJECTIFY.greg $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $< o/%.zip.o: o/% ; @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) $(OUTPUT_OPTION) $< @@ -58,8 +57,6 @@ o/$(MODE)/%.s: o/$(MODE)/%.i ; @$(COMPILE) -ACOMPILE.i $(COMPILE.i) $(OUTP o/$(MODE)/%.o: %.cc ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx) $(OUTPUT_OPTION) $< o/$(MODE)/%.o: o/$(MODE)/%.cc ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx) $(OUTPUT_OPTION) $< o/$(MODE)/%.lds: %.lds ; @$(COMPILE) -APREPROCESS $(PREPROCESS.lds) $(OUTPUT_OPTION) $< -o/$(MODE)/%.h.ok: %.h ; @$(COMPILE) -ACHECK.h $(COMPILE.c) -xc -g0 -o $@ $< -o/$(MODE)/%.hh.ok: %.hh ; @$(COMPILE) -ACHECK.h $(COMPILE.cxx) -xc++ -g0 -o $@ $< o/$(MODE)/%.okk: % ; @$(COMPILE) -ACHECK.h $(COMPILE.cxx) -xc++ -g0 -o $@ $< o/$(MODE)/%.cxx.o: %.c ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx) -xc++ $(OUTPUT_OPTION) $< o/$(MODE)/%.o: %.greg.c ; @$(COMPILE) -AOBJECTIFY.greg $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $< @@ -104,3 +101,19 @@ o/$(MODE)/%.lua: %.lua o/$(MODE)/third_party/lua/luac.com o/$(MODE)/%.lua.runs: %.lua o/$(MODE)/tool/net/redbean.com @$(COMPILE) -ALUA -tT$@ o/$(MODE)/tool/net/redbean.com $(LUAFLAGS) -i $< + +o/$(MODE)/%: o/$(MODE)/%.com o/$(MODE)/tool/build/cp.com o/$(MODE)/tool/build/assimilate.com + @$(COMPILE) -ACP -T$@ o/$(MODE)/tool/build/cp.com $< $@ + @$(COMPILE) -AASSIMILATE -T$@ o/$(MODE)/tool/build/assimilate.com $@ + +# TODO(jart): find a way to generate dependencies +# or alternatively disable sandboxing +o/%.h.ok: %.h + @$(COMPILE) -ACHECK.h -T$@ build/bootstrap/touch.com $@ +# @$(COMPILE) -ACHECK.h $(COMPILE.c) -xc -g0 -o $@ $< +o/$(MODE)/%.h.ok: %.h + @$(COMPILE) -ACHECK.h -T$@ build/bootstrap/touch.com $@ +# @$(COMPILE) -ACHECK.h $(COMPILE.c) -xc -g0 -o $@ $< +o/$(MODE)/%.hh.ok: %.hh + @$(COMPILE) -ACHECK.h -T$@ build/bootstrap/touch.com $@ +# @$(COMPILE) -ACHECK.h $(COMPILE.cxx) -xc++ -g0 -o $@ $< diff --git a/libc/dce.h b/libc/dce.h index 9b80e4d06..04b102d20 100644 --- a/libc/dce.h +++ b/libc/dce.h @@ -1,6 +1,5 @@ #ifndef COSMOPOLITAN_LIBC_DCE_H_ #define COSMOPOLITAN_LIBC_DCE_H_ -#include "libc/nexgen32e/kcpuids.h" /*─────────────────────────────────────────────────────────────────────────────╗ │ cosmopolitan § autotune » dead code elimination │ ╚─────────────────────────────────────────────────────────────────────────────*/ diff --git a/libc/integral/lp64arg.inc b/libc/integral/lp64arg.inc index 669ec7c04..b5c53dd7c 100644 --- a/libc/integral/lp64arg.inc +++ b/libc/integral/lp64arg.inc @@ -1,4 +1,15 @@ -#include "libc/runtime/valist.h" +/* variadic arguments for chibicc */ + +/* */ +struct __va_list { + uint32_t gp_offset; + uint32_t fp_offset; + void *overflow_arg_area; + void *reg_save_area; +}; +/* */ + +void *__va_arg(struct __va_list *, size_t, unsigned, unsigned); #define __GNUC_VA_LIST 1 #define __gnuc_va_list va_list diff --git a/libc/mem/unveil.c b/libc/mem/unveil.c index d774d3df8..bb7a3f02c 100644 --- a/libc/mem/unveil.c +++ b/libc/mem/unveil.c @@ -34,6 +34,7 @@ #include "libc/mem/mem.h" #include "libc/nexgen32e/threaded.h" #include "libc/runtime/internal.h" +#include "libc/runtime/runtime.h" #include "libc/str/path.h" #include "libc/str/str.h" #include "libc/sysv/consts/at.h" @@ -124,7 +125,9 @@ static int unveil_init(void) { if (errno == EOPNOTSUPP) errno = ENOSYS; return -1; } - if (rc < 2) State.fs_mask &= ~LANDLOCK_ACCESS_FS_REFER; + if (rc < 2) { + State.fs_mask &= ~LANDLOCK_ACCESS_FS_REFER; + } const struct landlock_ruleset_attr attr = { .handled_access_fs = State.fs_mask, }; @@ -326,6 +329,7 @@ static int sys_unveil_linux(const char *path, const char *permissions) { * @raise EPERM if unveil() is called after locking * @note on Linux this function requires Linux Kernel 5.13+ * @see [1] https://docs.kernel.org/userspace-api/landlock.html + * @threadsafe */ int unveil(const char *path, const char *permissions) { int rc; diff --git a/libc/runtime/enable_tls.c b/libc/runtime/enable_tls.c index 7bd2d3f24..7f154ba3d 100644 --- a/libc/runtime/enable_tls.c +++ b/libc/runtime/enable_tls.c @@ -59,7 +59,16 @@ extern unsigned char __tls_add_nt_rax[]; _Alignas(long) static char __static_tls[5008]; /** - * Enables thread local storage. + * Enables thread local storage for main process. + * + * %fs Linux/BSDs + * │ + * _Thread_local │ __get_tls() + * ┌───┬──────────┬──────────┼───┐ + * │pad│ .tdata │ .tbss │tib│ + * └───┴──────────┴──────────┼───┘ + * │ + * Windows/Mac %gs * * This function is always called by the core runtime to guarantee TLS * is always available to your program. You must build your code using @@ -85,19 +94,6 @@ _Alignas(long) static char __static_tls[5008]; * and your `errno` variable also won't be thread safe anymore. */ privileged void __enable_tls(void) { - STRACE("__enable_tls()"); - - // allocate tls memory for main process - // - // %fs Linux/BSDs - // │ - // _Thread_local │ __get_tls() - // ┌───┬──────────┬──────────┼───┐ - // │pad│ .tdata │ .tbss │tib│ - // └───┴──────────┴──────────┼───┘ - // │ - // Windows/Mac %gs - // size_t siz; cthread_t tib; char *mem, *tls; @@ -179,11 +175,6 @@ privileged void __enable_tls(void) { // // 65 48 8b 0R4 25 30 00 00 00 mov %gs:0x30,%R // - // Whereas on Windows we'll replace it with this: - // - // 0f 1f 40 00 fatnop4 - // e8 xx xx xx xx call __tls_mov_nt_%R - // // Since we have no idea where the TLS instructions exist in the // binary, we need to disassemble the whole program image. This'll // potentially take a few milliseconds for some larger programs. @@ -264,6 +255,5 @@ privileged void __enable_tls(void) { } // we are now allowed to use tls - // setting this variable __tls_enabled = true; } diff --git a/libc/runtime/valist.c b/libc/runtime/valist.c index ea8e764d2..6be81ce3b 100644 --- a/libc/runtime/valist.c +++ b/libc/runtime/valist.c @@ -17,7 +17,15 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/macros.internal.h" -#include "libc/runtime/valist.h" + +/* */ +struct __va_list { + uint32_t gp_offset; + uint32_t fp_offset; + void *overflow_arg_area; + void *reg_save_area; +}; +/* */ static void *__va_arg_mem(struct __va_list *ap, size_t sz, size_t align) { void *r = (void *)ROUNDUP((intptr_t)ap->overflow_arg_area, align); diff --git a/libc/runtime/valist.h b/libc/runtime/valist.h deleted file mode 100644 index 73ae2cc2c..000000000 --- a/libc/runtime/valist.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_RUNTIME_VALIST_H_ -#define COSMOPOLITAN_LIBC_RUNTIME_VALIST_H_ -#if !(__ASSEMBLER__ + __LINKER__ + 0) -COSMOPOLITAN_C_START_ - -struct __va_list { - uint32_t gp_offset; - uint32_t fp_offset; - void *overflow_arg_area; - void *reg_save_area; -}; - -void *__va_arg(struct __va_list *, size_t, unsigned, unsigned); - -COSMOPOLITAN_C_END_ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ -#endif /* COSMOPOLITAN_LIBC_RUNTIME_VALIST_H_ */ diff --git a/libc/sock/syslog.c b/libc/sock/syslog.c index 5bb1eec61..414c23e04 100644 --- a/libc/sock/syslog.c +++ b/libc/sock/syslog.c @@ -27,7 +27,6 @@ #include "libc/macros.internal.h" #include "libc/nt/events.h" #include "libc/nt/runtime.h" -#include "libc/runtime/valist.h" #include "libc/sock/sock.h" #include "libc/sock/syslog.h" #include "libc/stdio/stdio.h" diff --git a/libc/testlib/testlib.mk b/libc/testlib/testlib.mk index 9f71f865d..52427f57d 100644 --- a/libc/testlib/testlib.mk +++ b/libc/testlib/testlib.mk @@ -24,6 +24,7 @@ LIBC_TESTLIB_A_HDRS = \ libc/testlib/fastrandomstring.h \ libc/testlib/hyperion.h \ libc/testlib/moby.h \ + libc/testlib/ugly.h \ libc/testlib/testlib.h LIBC_TESTLIB_A_SRCS_S = \ diff --git a/test/libc/calls/execve_test.c b/test/libc/calls/execve_test.c deleted file mode 100644 index 5a083707e..000000000 --- a/test/libc/calls/execve_test.c +++ /dev/null @@ -1,363 +0,0 @@ -/*-*- 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 2022 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/assert.h" -#include "libc/calls/calls.h" -#include "libc/dce.h" -#include "libc/intrin/kprintf.h" -#include "libc/mem/io.h" -#include "libc/runtime/runtime.h" -#include "libc/stdio/stdio.h" -#include "libc/sysv/consts/o.h" -#include "libc/testlib/ezbench.h" -#include "libc/testlib/testlib.h" - -STATIC_YOINK("zip_uri_support"); - -int ws, pid; -char testlib_enable_tmp_setup_teardown; - -__attribute__((__constructor__)) static void init(void) { - pledge("stdio rpath wpath cpath fattr proc exec", 0); - errno = 0; -} - -bool UsingBinfmtMisc(void) { - return fileexists("/proc/sys/fs/binfmt_misc/APE"); -} - -// see: #431 -// todo(jart): figure out what is wrong with github actions -// thetanil: same issue reproducible on my debian 5.10 -// bool HasMzHeader(const char *path) { -// char buf[2] = {0}; -// open(path, O_RDONLY); -// read(3, buf, 2); -// close(3); -// return buf[0] == 'M' && buf[1] == 'Z'; -// } - -void Extract(const char *from, const char *to, int mode) { - ASSERT_SYS(0, 3, open(from, O_RDONLY), "%s %s", from, to); - ASSERT_SYS(0, 4, creat(to, mode)); - ASSERT_NE(-1, _copyfd(3, 4, -1)); - EXPECT_SYS(0, 0, close(4)); - EXPECT_SYS(0, 0, close(3)); -} - -void SetUp(void) { - ASSERT_SYS(0, 0, mkdir("tmp", 0755)); - ASSERT_SYS(0, 0, mkdir("bin", 0755)); - Extract("/zip/tiny64.elf", "bin/tiny64.elf", 0755); - // Extract("/zip/pylife.com", "bin/pylife.com", 0755); - Extract("/zip/life-nomod.com", "bin/life-nomod.com", 0755); - Extract("/zip/life-classic.com", "bin/life-classic.com", 0755); - setenv("TMPDIR", "tmp", true); - if (IsOpenbsd()) { - // printf is in /usr/bin/printf on openbsd... - setenv("PATH", "/bin:/usr/bin", true); - } else if (!IsWindows()) { - setenv("PATH", "/bin", true); - } -} - -//////////////////////////////////////////////////////////////////////////////// - -TEST(execve, system_elf) { - if (!IsLinux()) return; - ws = system("bin/tiny64.elf"); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - system("cp bin/tiny64.elf /tmp/tiny64.elf"); -} - -TEST(execve, fork_elf) { - if (!IsLinux()) return; - ASSERT_NE(-1, (pid = fork())); - if (!pid) { - execl("bin/tiny64.elf", "bin/tiny64.elf", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); -} - -TEST(execve, vfork_elf) { - if (!IsLinux()) return; - ASSERT_NE(-1, (pid = vfork())); - if (!pid) { - execl("bin/tiny64.elf", "bin/tiny64.elf", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); -} - -//////////////////////////////////////////////////////////////////////////////// - -TEST(execve, system_apeNoModifySelf) { - if (IsWindows()) return; // todo(jart): wut - for (int i = 0; i < 2; ++i) { - ws = system("bin/life-nomod.com"); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - // see: HasMzHeader() - // EXPECT_TRUE(HasMzHeader("bin/life-nomod.com")); - system("cp bin/life-nomod.com /tmp/life-nomod.com"); - } -} - -TEST(execve, fork_apeNoModifySelf) { - for (int i = 0; i < 2; ++i) { - ASSERT_NE(-1, (pid = fork())); - if (!pid) { - execl("bin/life-nomod.com", "bin/life-nomod.com", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - // see: HasMzHeader() - // EXPECT_TRUE(HasMzHeader("bin/life-nomod.com")); - } -} - -TEST(execve, vfork_apeNoModifySelf) { - for (int i = 0; i < 2; ++i) { - ASSERT_NE(-1, (pid = vfork())); - if (!pid) { - execl("bin/life-nomod.com", "bin/life-nomod.com", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - // see: HasMzHeader() - // EXPECT_TRUE(HasMzHeader("bin/life-nomod.com")); - } -} - -//////////////////////////////////////////////////////////////////////////////// - -TEST(execve, system_apeClassic) { - if (IsWindows()) return; // todo(jart): wut - for (int i = 0; i < 2; ++i) { - system("bin/life-classic.com"); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - // see: HasMzHeader() - // if (UsingBinfmtMisc()) { - // EXPECT_TRUE(HasMzHeader("bin/life-classic.com")); - // } - } -} - -TEST(execve, fork_apeClassic) { - for (int i = 0; i < 2; ++i) { - ASSERT_NE(-1, (pid = fork())); - if (!pid) { - execl("bin/life-classic.com", "bin/life-classic.com", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - // see: HasMzHeader() - // if (UsingBinfmtMisc()) { - // EXPECT_TRUE(HasMzHeader("bin/life-classic.com")); - // } - } -} - -TEST(execve, vfork_apeClassic) { - for (int i = 0; i < 2; ++i) { - ASSERT_NE(-1, (pid = vfork())); - if (!pid) { - execl("bin/life-classic.com", "bin/life-classic.com", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - // see: HasMzHeader() - // if (UsingBinfmtMisc()) { - // EXPECT_TRUE(HasMzHeader("bin/life-classic.com")); - // } - } -} - -//////////////////////////////////////////////////////////////////////////////// -#if 0 // not worth depending on THIRD_PARTY_PYTHON for this test - -TEST(execve, system_apeNoMod3mb) { - if (IsWindows()) return; // todo(jart): wut - for (int i = 0; i < 2; ++i) { - system("bin/pylife.com"); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - EXPECT_TRUE(HasMzHeader("bin/pylife.com")); - } -} - -TEST(execve, fork_apeNoMod3mb) { - for (int i = 0; i < 2; ++i) { - ASSERT_NE(-1, (pid = fork())); - if (!pid) { - execl("bin/pylife.com", "bin/pylife.com", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - EXPECT_TRUE(HasMzHeader("bin/pylife.com")); - } -} - -TEST(execve, vfork_apeNoMod3mb) { - for (int i = 0; i < 2; ++i) { - ASSERT_NE(-1, (pid = vfork())); - if (!pid) { - execl("bin/pylife.com", "bin/pylife.com", 0); - _Exit(127); - } - ASSERT_EQ(pid, wait(&ws)); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(42, WEXITSTATUS(ws)); - EXPECT_TRUE(HasMzHeader("bin/pylife.com")); - } -} - -#endif -//////////////////////////////////////////////////////////////////////////////// - -void SystemElf(void) { - system("bin/tiny64.elf"); -} - -void ForkElf(void) { - if (!(pid = fork())) { - execl("bin/tiny64.elf", "bin/tiny64.elf", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -void VforkElf(void) { - if (!(pid = vfork())) { - execl("bin/tiny64.elf", "bin/tiny64.elf", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -//////////////////////////////////////////////////////////////////////////////// - -void SystemNoMod(void) { - system("bin/life-nomod.com"); -} - -void ForkNoMod(void) { - if (!(pid = fork())) { - execl("bin/life-nomod.com", "bin/life-nomod.com", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -void VforkNoMod(void) { - if (!(pid = vfork())) { - execl("bin/life-nomod.com", "bin/life-nomod.com", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -//////////////////////////////////////////////////////////////////////////////// - -void SystemClassic(void) { - system("bin/life-classic.com"); -} - -void ForkClassic(void) { - if (!(pid = fork())) { - execl("bin/life-classic.com", "bin/life-classic.com", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -void VforkClassic(void) { - if (!(pid = vfork())) { - execl("bin/life-classic.com", "bin/life-classic.com", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -//////////////////////////////////////////////////////////////////////////////// - -void SystemNoMod3mb(void) { - system("bin/life-nomod.com"); -} - -void ForkNoMod3mb(void) { - if (!(pid = fork())) { - execl("bin/life-nomod.com", "bin/life-nomod.com", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -void VforkNoMod3mb(void) { - if (!(pid = vfork())) { - execl("bin/life-nomod.com", "bin/life-nomod.com", 0); - _Exit(127); - } - waitpid(pid, 0, 0); -} - -BENCH(execve, bench1) { - if (IsLinux()) { - EZBENCH2("ForkElf", donothing, ForkElf()); - EZBENCH2("VforkElf", donothing, VforkElf()); - EZBENCH2("SystemElf", donothing, SystemElf()); - kprintf("\n"); - } - - EZBENCH2("ForkApeClassic", donothing, ForkClassic()); - EZBENCH2("VforkApeClassic", donothing, VforkClassic()); - if (!IsWindows()) { - EZBENCH2("SystemApeClassic", donothing, SystemClassic()); - } - kprintf("\n"); - - EZBENCH2("ForkApeNoMod", donothing, ForkNoMod()); - EZBENCH2("VforkApeNoMod", donothing, VforkNoMod()); - if (!IsWindows()) { - EZBENCH2("SystemApeNoMod", donothing, SystemNoMod()); - } - kprintf("\n"); - - EZBENCH2("ForkNoMod3mb", donothing, ForkNoMod3mb()); - EZBENCH2("VforkNoMod3mb", donothing, VforkNoMod3mb()); - if (!IsWindows()) { - EZBENCH2("SystemNoMod3mb", donothing, SystemNoMod3mb()); - } -} diff --git a/test/libc/calls/vfork_test.c b/test/libc/calls/vfork_test.c index e2ecd9d1f..685a4ee1e 100644 --- a/test/libc/calls/vfork_test.c +++ b/test/libc/calls/vfork_test.c @@ -23,13 +23,12 @@ #include "libc/sysv/consts/o.h" #include "libc/testlib/testlib.h" -#define PATH "o/vfork_test" +char testlib_enable_tmp_setup_teardown; TEST(vfork, test) { int fd; char buf[8] = {0}; - mkdir("o", 0755); - ASSERT_NE(-1, (fd = open(PATH, O_RDWR | O_CREAT, 0644))); + ASSERT_NE(-1, (fd = open("vfork_test", O_RDWR | O_CREAT, 0644))); ASSERT_EQ(5, write(fd, "hello", 5)); ASSERT_NE(-1, lseek(fd, 0, SEEK_SET)); if (!vfork()) { @@ -44,5 +43,4 @@ TEST(vfork, test) { EXPECT_EQ(5, read(fd, buf, 5)); EXPECT_STREQ("hello", buf); EXPECT_NE(-1, close(fd)); - unlink(PATH); } diff --git a/test/libc/mem/unveil_test.c b/test/libc/mem/unveil_test.c index ffd8cc849..40029e58a 100644 --- a/test/libc/mem/unveil_test.c +++ b/test/libc/mem/unveil_test.c @@ -44,10 +44,10 @@ STATIC_YOINK("zip_uri_support"); #define EACCES_OR_ENOENT (IsOpenbsd() ? ENOENT : EACCES) -#define SPAWN() \ - { \ - int ws, pid; \ - ASSERT_NE(-1, (pid = fork())); \ +#define SPAWN(METHOD) \ + { \ + int ws, pid; \ + ASSERT_NE(-1, (pid = METHOD())); \ if (!pid) { #define EXITS(rc) \ @@ -94,7 +94,7 @@ int extract(const char *from, const char *to, int mode) { } TEST(unveil, api_differences) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, stat("/", &st)); ASSERT_SYS(0, 0, unveil(".", "rw")); if (IsOpenbsd()) { @@ -117,12 +117,12 @@ TEST(unveil, api_differences) { } TEST(unveil, rx_readOnlyPreexistingExecutable_worksFine) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("folder", 0755)); ASSERT_SYS(0, 0, extract("/zip/life.elf", "folder/life.elf", 0755)); ASSERT_SYS(0, 0, unveil("folder", "rx")); ASSERT_SYS(0, 0, unveil(0, 0)); - SPAWN(); + SPAWN(fork); execl("folder/life.elf", "folder/life.elf", 0); kprintf("execve failed! %s\n", strerror(errno)); _Exit(127); @@ -131,24 +131,41 @@ TEST(unveil, rx_readOnlyPreexistingExecutable_worksFine) { } TEST(unveil, r_noExecutePreexistingExecutable_raisesEacces) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("folder", 0755)); ASSERT_SYS(0, 0, extract("/zip/life.elf", "folder/life.elf", 0755)); ASSERT_SYS(0, 0, unveil("folder", "r")); ASSERT_SYS(0, 0, unveil(0, 0)); - SPAWN(); + SPAWN(fork); ASSERT_SYS(EACCES, -1, execl("folder/life.elf", "folder/life.elf", 0)); EXITS(0); EXITS(0); } +TEST(unveil, canBeUsedAgainAfterVfork) { + ASSERT_SYS(0, 0, touch("bad", 0644)); + ASSERT_SYS(0, 0, touch("good", 0644)); + SPAWN(fork); + SPAWN(vfork); + ASSERT_SYS(0, 0, unveil("bad", "r")); + ASSERT_SYS(0, 0, unveil("good", "r")); + ASSERT_SYS(0, 0, unveil(0, 0)); + ASSERT_SYS(0, 3, open("bad", 0)); + EXITS(0); + ASSERT_SYS(0, 0, unveil("good", "r")); + ASSERT_SYS(0, 0, unveil(0, 0)); + ASSERT_SYS(0, 3, open("good", 0)); + ASSERT_SYS(EACCES_OR_ENOENT, -1, open("bad", 0)); + EXITS(0); +} + TEST(unveil, rwc_createExecutableFile_isAllowedButCantBeRun) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("folder", 0755)); ASSERT_SYS(0, 0, unveil("folder", "rwc")); ASSERT_SYS(0, 0, unveil(0, 0)); ASSERT_SYS(0, 0, extract("/zip/life.elf", "folder/life.elf", 0755)); - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, stat("folder/life.elf", &st)); ASSERT_SYS(EACCES, -1, execl("folder/life.elf", "folder/life.elf", 0)); EXITS(0); @@ -156,12 +173,12 @@ TEST(unveil, rwc_createExecutableFile_isAllowedButCantBeRun) { } TEST(unveil, rwcx_createExecutableFile_canAlsoBeRun) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("folder", 0755)); ASSERT_SYS(0, 0, unveil("folder", "rwcx")); ASSERT_SYS(0, 0, unveil(0, 0)); ASSERT_SYS(0, 0, extract("/zip/life.elf", "folder/life.elf", 0755)); - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, stat("folder/life.elf", &st)); execl("folder/life.elf", "folder/life.elf", 0); kprintf("execve failed! %s\n", strerror(errno)); @@ -171,7 +188,7 @@ TEST(unveil, rwcx_createExecutableFile_canAlsoBeRun) { } TEST(unveil, dirfdHacking_doesntWork) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("jail", 0755)); ASSERT_SYS(0, 0, mkdir("garden", 0755)); ASSERT_SYS(0, 0, touch("garden/secret.txt", 0644)); @@ -184,7 +201,7 @@ TEST(unveil, dirfdHacking_doesntWork) { TEST(unveil, mostRestrictivePolicy) { if (IsOpenbsd()) return; // openbsd behaves oddly; see docs - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("jail", 0755)); ASSERT_SYS(0, 0, mkdir("garden", 0755)); ASSERT_SYS(0, 0, touch("garden/secret.txt", 0644)); @@ -195,7 +212,7 @@ TEST(unveil, mostRestrictivePolicy) { } TEST(unveil, overlappingDirectories_inconsistentBehavior) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, makedirs("f1/f2", 0755)); ASSERT_SYS(0, 0, extract("/zip/life.elf", "f1/f2/life.elf", 0755)); ASSERT_SYS(0, 0, unveil("f1", "x")); @@ -203,7 +220,7 @@ TEST(unveil, overlappingDirectories_inconsistentBehavior) { ASSERT_SYS(0, 0, unveil(0, 0)); if (IsOpenbsd()) { // OpenBSD favors the most restrictive policy - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, stat("f1/f2/life.elf", &st)); ASSERT_SYS(EACCES, -1, execl("f1/f2/life.elf", "f1/f2/life.elf", 0)); EXITS(0); @@ -214,7 +231,7 @@ TEST(unveil, overlappingDirectories_inconsistentBehavior) { // exit code of 0! find out why this is happening... // so far it's happened to MODE=rel and MODE=tiny... // - // SPAWN(); + // SPAWN(fork); // ASSERT_SYS(0, 0, stat("f1/f2/life.elf", &st)); // execl("f1/f2/life.elf", "f1/f2/life.elf", 0); // kprintf("execve failed! %s\n", strerror(errno)); @@ -225,7 +242,7 @@ TEST(unveil, overlappingDirectories_inconsistentBehavior) { } TEST(unveil, usedTwice_forbidden) { - SPAWN(); + SPAWN(fork); ASSERT_SYS(0, 0, mkdir("jail", 0755)); ASSERT_SYS(0, 0, mkdir("garden", 0755)); ASSERT_SYS(0, 0, xbarf("garden/secret.txt", "hello", 5)); @@ -288,7 +305,7 @@ TEST(unveil, usedTwice_forbidden_worksWithPledge) { TEST(unveil, lotsOfPaths) { int i, n; - SPAWN(); + SPAWN(fork); n = 100; for (i = 0; i < n; ++i) { ASSERT_SYS(0, 0, touch(xasprintf("%d", i), 0644)); @@ -305,3 +322,15 @@ TEST(unveil, lotsOfPaths) { } EXITS(0); } + +TEST(unveil, reparent) { + return; // need abi 2 :'( + SPAWN(fork); + ASSERT_SYS(0, 0, mkdir("x", 0755)); + ASSERT_SYS(0, 0, unveil("x", "rwc")); + ASSERT_SYS(0, 0, unveil(0, 0)); + ASSERT_SYS(0, 0, mkdir("x/y", 0755)); + ASSERT_SYS(0, 0, touch("x/y/z", 0644)); + ASSERT_SYS(0, 0, rename("x/y/z", "x/z")); + EXITS(0); +} diff --git a/test/libc/release/smoke.c b/test/libc/release/smoke.c index 2c7d3b4e9..71d8f1952 100644 --- a/test/libc/release/smoke.c +++ b/test/libc/release/smoke.c @@ -9,10 +9,6 @@ int main(int argc, char *argv[]) { fputs(_gc(xiso8601ts(NULL)), f); fputs(_gc(xasprintf("hello world %d %s\n", argc, s)), f); fclose(f); - rc = system("exit 42"); - CHECK_NE(-1, rc); - CHECK(WIFEXITED(rc)); - CHECK_EQ(42, WEXITSTATUS(rc)); free(s); return 0; } diff --git a/test/libc/release/smokecxx.cc b/test/libc/release/smokecxx.cc index 793bd4bc9..a31736b12 100644 --- a/test/libc/release/smokecxx.cc +++ b/test/libc/release/smokecxx.cc @@ -1,11 +1,9 @@ int main() { int rc; FILE *f; - f = fopen("/dev/null", "w"); - fprintf(f, "hello world\n"); - fclose(f); - rc = system("exit 42"); - CHECK_NE(-1, rc); - CHECK_EQ(42, WEXITSTATUS(rc)); - return 0; + int *x = new int[32]; + x[0] = 2; + x[1] = 2; + x[2] = x[0] + x[1]; + return x[2] - 4; } diff --git a/test/libc/runtime/mmap_test.c b/test/libc/runtime/mmap_test.c index 0416578c4..a081ba098 100644 --- a/test/libc/runtime/mmap_test.c +++ b/test/libc/runtime/mmap_test.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/bits/atomic.h" #include "libc/bits/bits.h" +#include "libc/bits/safemacros.internal.h" #include "libc/bits/xchg.internal.h" #include "libc/calls/calls.h" #include "libc/calls/ucontext.h" @@ -46,6 +47,8 @@ #include "libc/x/x.h" #include "third_party/xed/x86.h" +#define TMP firstnonnull(getenv("TMPDIR"), kTmpPath) + char testlib_enable_tmp_setup_teardown; __attribute__((__constructor__)) static void init(void) { @@ -93,7 +96,7 @@ TEST(mmap, testMapFile) { int fd; char *p; char path[PATH_MAX]; - sprintf(path, "%s%s.%ld", kTmpPath, program_invocation_short_name, lemur64()); + sprintf(path, "%s.%ld", program_invocation_short_name, lemur64()); ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644))); EXPECT_EQ(5, write(fd, "hello", 5)); EXPECT_NE(-1, fdatasync(fd)); @@ -107,7 +110,7 @@ TEST(mmap, testMapFile) { TEST(mmap, testMapFile_fdGetsClosed_makesNoDifference) { int fd; char *p, buf[16], path[PATH_MAX]; - sprintf(path, "%s%s.%ld", kTmpPath, program_invocation_short_name, lemur64()); + sprintf(path, "%s.%ld", program_invocation_short_name, lemur64()); ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644))); EXPECT_EQ(5, write(fd, "hello", 5)); EXPECT_NE(-1, fdatasync(fd)); @@ -227,8 +230,9 @@ TEST(mmap, cow) { int fd; char *p; char path[PATH_MAX]; - sprintf(path, "%s%s.%ld", kTmpPath, program_invocation_short_name, lemur64()); - ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644))); + sprintf(path, "%s.%ld", program_invocation_short_name, lemur64()); + ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644)), "%s", + path); EXPECT_EQ(5, write(fd, "hello", 5)); EXPECT_NE(-1, fdatasync(fd)); EXPECT_NE(MAP_FAILED, @@ -246,7 +250,7 @@ TEST(mmap, cowFileMapReadonlyFork) { char *p; int fd, pid, ws; char path[PATH_MAX], lol[6]; - sprintf(path, "%s%s.%ld", kTmpPath, program_invocation_short_name, lemur64()); + sprintf(path, "%s.%ld", program_invocation_short_name, lemur64()); ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644))); EXPECT_EQ(6, write(fd, "hello", 6)); EXPECT_NE(-1, close(fd)); @@ -271,7 +275,7 @@ TEST(mmap, cowFileMapFork) { char *p; int fd, pid, ws; char path[PATH_MAX], lol[6]; - sprintf(path, "%s%s.%ld", kTmpPath, program_invocation_short_name, lemur64()); + sprintf(path, "%s.%ld", program_invocation_short_name, lemur64()); ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644))); EXPECT_EQ(6, write(fd, "parnt", 6)); EXPECT_NE(-1, fdatasync(fd)); @@ -321,7 +325,7 @@ TEST(mmap, sharedFileMapFork) { char *p; int fd, pid, ws; char path[PATH_MAX], lol[6]; - sprintf(path, "%s%s.%ld", kTmpPath, program_invocation_short_name, lemur64()); + sprintf(path, "%s.%ld", program_invocation_short_name, lemur64()); ASSERT_NE(-1, (fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644))); EXPECT_EQ(6, write(fd, "parnt", 6)); EXPECT_NE(-1, fdatasync(fd)); diff --git a/test/libc/stdio/popen_test.c b/test/libc/stdio/popen_test.c deleted file mode 100644 index a14216a26..000000000 --- a/test/libc/stdio/popen_test.c +++ /dev/null @@ -1,35 +0,0 @@ -/*-*- 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/calls/calls.h" -#include "libc/log/check.h" -#include "libc/stdio/stdio.h" -#include "libc/testlib/testlib.h" - -TEST(popen, test) { - int ws; - FILE *f; - f = popen("echo hi", "r"); - ASSERT_NE(NULL, f); - EXPECT_EQ('h', fgetc(f)); - EXPECT_EQ('i', fgetc(f)); - ws = pclose(f); - EXPECT_NE(-1, ws); - EXPECT_TRUE(WIFEXITED(ws)); - EXPECT_EQ(0, WEXITSTATUS(ws)); -} diff --git a/test/libc/stdio/test.mk b/test/libc/stdio/test.mk index 04c1627ef..c6bd57baf 100644 --- a/test/libc/stdio/test.mk +++ b/test/libc/stdio/test.mk @@ -58,6 +58,7 @@ o/$(MODE)/test/libc/stdio/%.com.dbg: \ $(TEST_LIBC_STDIO_DEPS) \ o/$(MODE)/test/libc/stdio/%.o \ o/$(MODE)/test/libc/stdio/stdio.pkg \ + o/$(MODE)/tool/build/echo.zip.o \ $(LIBC_TESTMAIN) \ $(CRT) \ $(APE_NO_MODIFY_SELF) diff --git a/test/libc/x/xslurp_test.c b/test/libc/x/xslurp_test.c index f8708f214..96982ab6c 100644 --- a/test/libc/x/xslurp_test.c +++ b/test/libc/x/xslurp_test.c @@ -22,24 +22,22 @@ #include "libc/testlib/testlib.h" #include "libc/x/x.h" +char testlib_enable_tmp_setup_teardown; + TEST(xslurp, testEmptyWithNulTerminatedStringBehavior) { size_t got; const char *data; - const char *path = gc(xjoinpaths(kTmpPath, "xslurp.txt")); - ASSERT_NE(-1, xbarf(path, "", -1)); - ASSERT_NE(NULL, (data = gc(xslurp(path, &got)))); + ASSERT_NE(-1, xbarf("xslurp.txt", "", -1)); + ASSERT_NE(NULL, (data = gc(xslurp("xslurp.txt", &got)))); ASSERT_EQ(0, got); ASSERT_STREQ("", data); - ASSERT_NE(-1, unlink(path)); } TEST(xslurp, testHyperion) { size_t got; const char *data; - const char *path = gc(xjoinpaths(kTmpPath, "xslurp.txt")); - ASSERT_NE(-1, xbarf(path, kHyperion, kHyperionSize)); - ASSERT_NE(NULL, (data = gc(xslurp(path, &got)))); + ASSERT_NE(-1, xbarf("xslurp.txt", kHyperion, kHyperionSize)); + ASSERT_NE(NULL, (data = gc(xslurp("xslurp.txt", &got)))); ASSERT_EQ(kHyperionSize, got); ASSERT_EQ(0, memcmp(data, kHyperion, kHyperionSize)); - ASSERT_NE(-1, unlink(path)); } diff --git a/third_party/bzip2/bzip2.mk b/third_party/bzip2/bzip2.mk index cc5e8a3ba..8c8e2fcde 100644 --- a/third_party/bzip2/bzip2.mk +++ b/third_party/bzip2/bzip2.mk @@ -8,6 +8,7 @@ THIRD_PARTY_BZIP2 = $(THIRD_PARTY_BZIP2_A_DEPS) $(THIRD_PARTY_BZIP2_A) THIRD_PARTY_BZIP2_A = o/$(MODE)/third_party/bzip2/bzip2.a THIRD_PARTY_BZIP2_A_FILES := $(wildcard third_party/bzip2/*) THIRD_PARTY_BZIP2_A_HDRS = $(filter %.h,$(THIRD_PARTY_BZIP2_A_FILES)) +THIRD_PARTY_BZIP2_A_INCS = $(filter %.inc,$(THIRD_PARTY_BZIP2_A_FILES)) THIRD_PARTY_BZIP2_A_SRCS = $(filter %.c,$(THIRD_PARTY_BZIP2_A_FILES)) THIRD_PARTY_BZIP2_A_OBJS = $(THIRD_PARTY_BZIP2_A_SRCS:%.c=o/$(MODE)/%.o) THIRD_PARTY_BZIP2_BINS = $(THIRD_PARTY_BZIP2_COMS) $(THIRD_PARTY_BZIP2_COMS:%=%.dbg) @@ -70,6 +71,7 @@ $(THIRD_PARTY_BZIP2_A_OBJS): \ THIRD_PARTY_BZIP2_LIBS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x))) THIRD_PARTY_BZIP2_SRCS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_SRCS)) THIRD_PARTY_BZIP2_HDRS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_HDRS)) +THIRD_PARTY_BZIP2_INCS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_INCS)) THIRD_PARTY_BZIP2_BINS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_BINS)) THIRD_PARTY_BZIP2_CHECKS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_CHECKS)) THIRD_PARTY_BZIP2_OBJS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_OBJS)) diff --git a/third_party/libcxx/__mutex_base b/third_party/libcxx/__mutex_base index 62ff1e4c2..a86d710c2 100644 --- a/third_party/libcxx/__mutex_base +++ b/third_party/libcxx/__mutex_base @@ -15,7 +15,9 @@ #include "third_party/libcxx/system_error" #include "third_party/libcxx/__threading_support" -#include "libc/isystem/time.h" +#include "libc/sysv/consts/sched.h" +#include "libc/time/struct/tm.h" +#include "libc/time/time.h" #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header diff --git a/third_party/libcxx/string.h b/third_party/libcxx/string.h index 851bcbbd7..f896c2749 100644 --- a/third_party/libcxx/string.h +++ b/third_party/libcxx/string.h @@ -57,7 +57,8 @@ size_t strlen(const char* s); #pragma GCC system_header #endif -#include "libc/isystem/string.h" +#include "libc/alg/alg.h" +#include "libc/str/str.h" // MSVCRT, GNU libc and its derivates may already have the correct prototype in // . This macro can be defined by users if their C library provides diff --git a/third_party/libcxx/wchar.h b/third_party/libcxx/wchar.h index d0f81b8c5..259b310f6 100644 --- a/third_party/libcxx/wchar.h +++ b/third_party/libcxx/wchar.h @@ -9,7 +9,8 @@ #ifndef _LIBCPP_WCHAR_H #define _LIBCPP_WCHAR_H -#include "libc/isystem/wchar.h" +#include "libc/str/str.h" +#include "libc/time/time.h" /* wchar.h synopsis diff --git a/third_party/libcxx/wctype.h b/third_party/libcxx/wctype.h index b256d58dd..1ea8f5652 100644 --- a/third_party/libcxx/wctype.h +++ b/third_party/libcxx/wctype.h @@ -50,7 +50,8 @@ wctrans_t wctrans(const char* property); #pragma GCC system_header #endif -#include "libc/isystem/wctype.h" +#include "libc/str/str.h" +#include "libc/time/time.h" #ifdef __cplusplus diff --git a/third_party/lz4cli/lz4cli.mk b/third_party/lz4cli/lz4cli.mk index 2c1b93d19..15d9600c4 100644 --- a/third_party/lz4cli/lz4cli.mk +++ b/third_party/lz4cli/lz4cli.mk @@ -59,6 +59,9 @@ o/$(MODE)/third_party/lz4cli/lz4cli.com.dbg: \ $(APE_NO_MODIFY_SELF) @$(APELINK) +o/$(MODE)/third_party/lz4cli/lz4cli.o: \ + third_party/lz4cli/COPYING + $(THIRD_PARTY_LZ4CLI_OBJS): \ $(BUILD_FILES) \ third_party/lz4cli/lz4cli.mk diff --git a/third_party/make/dirname.h b/third_party/make/dirname.h index 52ee3a92c..dc238bdce 100644 --- a/third_party/make/dirname.h +++ b/third_party/make/dirname.h @@ -20,7 +20,7 @@ #ifndef DIRNAME_H_ # define DIRNAME_H_ 1 -# include "third_party/make/dosname.h" +#include "third_party/make/dosname.h" # ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' diff --git a/third_party/make/error.c b/third_party/make/error.c index 5fe39d0cc..064f1b1a2 100644 --- a/third_party/make/error.c +++ b/third_party/make/error.c @@ -28,7 +28,7 @@ #include "third_party/make/stdio.h" #if !_LIBC && ENABLE_NLS -# include "third_party/make/gettext.h" +#include "third_party/make/gettext.h" # define _(msgid) gettext (msgid) #endif @@ -38,11 +38,7 @@ # define _GL_ATTRIBUTE_FORMAT_PRINTF(a, b) # define _GL_ARG_NONNULL(a) #else -# include "getprogname.h" -#endif - -#if USE_UNLOCKED_IO -# include "unlocked-io.h" +#include "third_party/make/getprogname.h" #endif #ifndef _ diff --git a/third_party/make/getopt.c b/third_party/make/getopt.c index 170c82f83..62d390b08 100644 --- a/third_party/make/getopt.c +++ b/third_party/make/getopt.c @@ -31,7 +31,7 @@ this program. If not, see . */ #endif #ifdef HAVE_CONFIG_H -# include "third_party/make/config.h" +#include "third_party/make/config.h" #endif #pragma GCC diagnostic ignored "-Wredundant-decls" diff --git a/third_party/make/make.mk b/third_party/make/make.mk index 9570f1cf5..162f20a31 100644 --- a/third_party/make/make.mk +++ b/third_party/make/make.mk @@ -13,6 +13,42 @@ THIRD_PARTY_MAKE_BINS = \ THIRD_PARTY_MAKE_A = \ o/$(MODE)/third_party/make/make.a +THIRD_PARTY_MAKE_HDRS = \ + third_party/make/filename.h \ + third_party/make/dirname.h \ + third_party/make/stddef.h \ + third_party/make/error.h \ + third_party/make/gnumake.h \ + third_party/make/gettext.h \ + third_party/make/stdlib.h \ + third_party/make/xalloc.h \ + third_party/make/xalloc-oversized.h \ + third_party/make/os.h \ + third_party/make/stdint.h \ + third_party/make/fd-hook.h \ + third_party/make/job.h \ + third_party/make/unistd.h \ + third_party/make/getprogname.h \ + third_party/make/dosname.h \ + third_party/make/config.h \ + third_party/make/concat-filename.h \ + third_party/make/findprog.h \ + third_party/make/intprops.h \ + third_party/make/exitfail.h \ + third_party/make/alloca.h \ + third_party/make/hash.h \ + third_party/make/rule.h \ + third_party/make/filedef.h \ + third_party/make/fcntl.h \ + third_party/make/stdio.h \ + third_party/make/variable.h \ + third_party/make/debug.h \ + third_party/make/output.h \ + third_party/make/getopt.h \ + third_party/make/dep.h \ + third_party/make/commands.h + + THIRD_PARTY_MAKE_INCS = \ third_party/make/makeint.inc diff --git a/third_party/mbedtls/test/lib.c b/third_party/mbedtls/test/lib.c index d1dbae207..aa05669d6 100644 --- a/third_party/mbedtls/test/lib.c +++ b/third_party/mbedtls/test/lib.c @@ -90,6 +90,7 @@ int mbedtls_test_platform_setup(void) { int ret = 0; static char mybuf[2][BUFSIZ]; ShowCrashReports(); + makedirs("o/tmp", 0755); setvbuf(stdout, mybuf[0], _IOLBF, BUFSIZ); setvbuf(stderr, mybuf[1], _IOLBF, BUFSIZ); #if defined(MBEDTLS_PLATFORM_C) diff --git a/third_party/mbedtls/test/test_suite_ctr_drbg.c b/third_party/mbedtls/test/test_suite_ctr_drbg.c index 781c2093f..75537963c 100644 --- a/third_party/mbedtls/test/test_suite_ctr_drbg.c +++ b/third_party/mbedtls/test/test_suite_ctr_drbg.c @@ -15,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "libc/intrin/kprintf.h" #include "third_party/mbedtls/test/test.inc" /* * *** THIS FILE WAS MACHINE GENERATED *** diff --git a/third_party/mbedtls/test/test_suite_ctr_drbg.datax b/third_party/mbedtls/test/test_suite_ctr_drbg.datax index 6f11d720b..fdc475414 100644 --- a/third_party/mbedtls/test/test_suite_ctr_drbg.datax +++ b/third_party/mbedtls/test/test_suite_ctr_drbg.datax @@ -1088,10 +1088,10 @@ depends_on:0 5:int:256 CTR_DRBG write/update seed file [#1] -7:char*:"/tmp/test_suite_ctr_drbg_seed":int:0 +7:char*:"o/tmp/test_suite_ctr_drbg_seed":int:0 CTR_DRBG write/update seed file [#2] -7:char*:"/tmp/test_suite_ctr_dbg_no_such_dir/file":exp:1 +7:char*:"o/tmp/test_suite_ctr_dbg_no_such_dir/file":exp:1 CTR_DRBG Special Behaviours 0 diff --git a/third_party/mbedtls/test/test_suite_entropy.datax b/third_party/mbedtls/test/test_suite_entropy.datax index 3742c6286..e79c01d24 100644 --- a/third_party/mbedtls/test/test_suite_entropy.datax +++ b/third_party/mbedtls/test/test_suite_entropy.datax @@ -8,10 +8,10 @@ Create NV seed_file 8 Entropy write/update seed file: good -1:char*:"/tmp/mbedtls_test_suite_entropy_seed":int:0 +1:char*:"o/tmp/mbedtls_test_suite_entropy_seed":int:0 Entropy write/update seed file: nonexistent -1:char*:"/tmp/no_such_dir/file":exp:0 +1:char*:"o/tmp/no_such_dir/file":exp:0 Entropy no sources 2 diff --git a/third_party/mbedtls/test/test_suite_hmac_drbg.misc.datax b/third_party/mbedtls/test/test_suite_hmac_drbg.misc.datax index 952f5f461..0f548f381 100644 --- a/third_party/mbedtls/test/test_suite_hmac_drbg.misc.datax +++ b/third_party/mbedtls/test/test_suite_hmac_drbg.misc.datax @@ -20,7 +20,7 @@ depends_on:2 HMAC_DRBG write/update seed file SHA-1 [#1] depends_on:0 -1:exp:0:char*:"/tmp/test_suite_hmac_drbg_seed":int:0 +1:exp:0:char*:"o/tmp/test_suite_hmac_drbg_seed":int:0 HMAC_DRBG write/update seed file SHA-1 [#2] depends_on:0 @@ -28,7 +28,7 @@ depends_on:0 HMAC_DRBG write/update seed file SHA-224 [#1] depends_on:1 -1:exp:1:char*:"/tmp/test_suite_hmac_drbg_seed":int:0 +1:exp:1:char*:"o/tmp/test_suite_hmac_drbg_seed":int:0 HMAC_DRBG write/update seed file SHA-224 [#2] depends_on:1 @@ -36,7 +36,7 @@ depends_on:1 HMAC_DRBG write/update seed file SHA-256 [#1] depends_on:1 -1:exp:2:char*:"/tmp/test_suite_hmac_drbg_seed":int:0 +1:exp:2:char*:"o/tmp/test_suite_hmac_drbg_seed":int:0 HMAC_DRBG write/update seed file SHA-256 [#2] depends_on:1 @@ -44,7 +44,7 @@ depends_on:1 HMAC_DRBG write/update seed file SHA-384 [#1] depends_on:2:3 -1:exp:3:char*:"/tmp/test_suite_hmac_drbg_seed":int:0 +1:exp:3:char*:"o/tmp/test_suite_hmac_drbg_seed":int:0 HMAC_DRBG write/update seed file SHA-384 [#2] depends_on:2:3 @@ -52,11 +52,11 @@ depends_on:2:3 HMAC_DRBG write/update seed file SHA-512 [#1] depends_on:2 -1:exp:4:char*:"/tmp/test_suite_hmac_drbg_seed":int:0 +1:exp:4:char*:"o/tmp/test_suite_hmac_drbg_seed":int:0 HMAC_DRBG write/update seed file SHA-512 [#2] depends_on:2 -1:exp:4:char*:"/tmp/test_suite_hmac_drbg_no_such_dir/file":exp:5 +1:exp:4:char*:"o/tmp/test_suite_hmac_drbg_no_such_dir/file":exp:5 HMAC_DRBG from buffer SHA-1 depends_on:0 diff --git a/third_party/mbedtls/test/test_suite_mpi.datax b/third_party/mbedtls/test/test_suite_mpi.datax index 8ff9cf855..dfca3724d 100644 --- a/third_party/mbedtls/test/test_suite_mpi.datax +++ b/third_party/mbedtls/test/test_suite_mpi.datax @@ -95,7 +95,7 @@ Test mbedtls_mpi_read_file #3 (Input too big) 8:int:10:char*:"/zip/third_party/mbedtls/test/data/mpi_too_big":hex:"":exp:2 Base test mbedtls_mpi_write_file #1 -9:int:10:char*:"56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924":int:16:char*:"/tmp/test_suite_mpi_write" +9:int:10:char*:"56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924":int:16:char*:"o/tmp/test_suite_mpi_write" Base test mbedtls_mpi_lsb #1 12:int:10:char*:"56125680981752282334141896320372489490613963693556392520816017892111350604111697682705498319512049040516698827829292076808006940873974979584527073481012636016353913462376755556720019831187364993587901952757307830896531678727717924":int:2 diff --git a/third_party/python/Lib/test/support/__init__.py b/third_party/python/Lib/test/support/__init__.py index 4a2c857f3..701def0e7 100644 --- a/third_party/python/Lib/test/support/__init__.py +++ b/third_party/python/Lib/test/support/__init__.py @@ -1049,7 +1049,7 @@ def temp_cwd(name='tempcwd', quiet=False): only a warning is raised and the original CWD is used. """ - with temp_dir(path=name, quiet=quiet) as temp_path: + with temp_dir(quiet=quiet) as temp_path: with change_cwd(temp_path, quiet=quiet) as cwd_dir: yield cwd_dir diff --git a/third_party/python/Lib/test/test_tarfile.py b/third_party/python/Lib/test/test_tarfile.py index d7fede0fb..b5c8ddb28 100644 --- a/third_party/python/Lib/test/test_tarfile.py +++ b/third_party/python/Lib/test/test_tarfile.py @@ -2607,8 +2607,9 @@ class NumericOwnerTest(unittest.TestCase): # because the uname and gname in the test file are 'root', and extract() # will look them up using pwd and grp to find their uid and gid, which we # test here to be 0. - @unittest.skipUnless(root_is_uid_gid_0(), - 'uid=0,gid=0 must be named "root"') + # [jart] tests shouldn't read /etc/passwd lool + # @unittest.skipUnless(root_is_uid_gid_0(), + # 'uid=0,gid=0 must be named "root"') @unittest.mock.patch('os.chown') @unittest.mock.patch('os.chmod') @unittest.mock.patch('os.geteuid') diff --git a/third_party/python/Modules/_elementtree.c b/third_party/python/Modules/_elementtree.c index d5ce7ff0b..facf6be28 100644 --- a/third_party/python/Modules/_elementtree.c +++ b/third_party/python/Modules/_elementtree.c @@ -17,12 +17,14 @@ #include "third_party/python/Include/object.h" #include "third_party/python/Include/objimpl.h" #include "third_party/python/Include/pycapsule.h" +#include "third_party/python/Include/pyexpat.h" #include "third_party/python/Include/pyhash.h" #include "third_party/python/Include/pystate.h" #include "third_party/python/Include/sliceobject.h" #include "third_party/python/Include/structmember.h" #include "third_party/python/Include/warnings.h" #include "third_party/python/Include/yoink.h" +#include "third_party/python/Modules/expat/expat.h" /* clang-format off */ PYTHON_PROVIDE("_elementtree"); @@ -2772,9 +2774,6 @@ _elementtree_TreeBuilder_start_impl(TreeBuilderObject *self, PyObject *tag, /* ==================================================================== */ /* the expat interface */ -#include "third_party/python/Modules/expat/expat.h" -#include "third_party/python/Include/pyexpat.h" - /* The PyExpat_CAPI structure is an immutable dispatch table, so it can be * cached globally without being in per-module state. */ diff --git a/third_party/python/Objects/typeobject.c b/third_party/python/Objects/typeobject.c index 8b664b7bf..c23c1ea1f 100644 --- a/third_party/python/Objects/typeobject.c +++ b/third_party/python/Objects/typeobject.c @@ -33,6 +33,11 @@ #include "third_party/python/Include/weakrefobject.h" /* clang-format off */ +static const short slotoffsets[] = { + -1, /* invalid slot */ +#include "third_party/python/Objects/typeslots.inc" +}; + /* Type object implementation */ /* Support type attribute cache */ @@ -2791,11 +2796,6 @@ error: return NULL; } -static const short slotoffsets[] = { - -1, /* invalid slot */ -#include "typeslots.inc" -}; - PyObject * PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) { diff --git a/third_party/python/python.mk b/third_party/python/python.mk index 8aeac821e..2e28cc282 100644 --- a/third_party/python/python.mk +++ b/third_party/python/python.mk @@ -4194,6 +4194,39 @@ $(THIRD_PARTY_PYTHON_PYTEST_A_DATA_OBJS): ZIPOBJ_FLAGS += -P.python -C3 o/$(MODE)/third_party/python/Python/ceval.o: QUOTA = -C64 -M1024m -L300 o/$(MODE)/third_party/python/Objects/unicodeobject.o: QUOTA += -C64 -M1024m -L300 +o/$(MODE)/third_party/python/Objects/unicodeobject.o: \ + third_party/python/Objects/unicodeobject.c \ + third_party/python/Objects/stringlib/localeutil.inc \ + third_party/python/Objects/stringlib/unicode_format.inc \ + third_party/python/Objects/stringlib/asciilib.inc \ + third_party/python/Objects/stringlib/codecs.inc \ + third_party/python/Objects/stringlib/undef.inc \ + third_party/python/Objects/stringlib/ucs1lib.inc \ + third_party/python/Objects/stringlib/codecs.inc \ + third_party/python/Objects/stringlib/undef.inc \ + third_party/python/Objects/stringlib/ucs2lib.inc \ + third_party/python/Objects/stringlib/codecs.inc \ + third_party/python/Objects/stringlib/undef.inc \ + third_party/python/Objects/stringlib/ucs4lib.inc \ + third_party/python/Objects/stringlib/codecs.inc \ + third_party/python/Objects/stringlib/undef.inc + +o/$(MODE)/third_party/python/Modules/_elementtree.o: \ + third_party/python/Modules/_elementtree.c \ + third_party/python/Modules/clinic/_elementtree.inc + +o/$(MODE)/third_party/python/Modules/_io/bufferedio.o: \ + third_party/python/Modules/_io/bufferedio.c \ + third_party/python/Modules/_io/clinic/bufferedio.inc + +o/$(MODE)/third_party/python/Modules/_io/textio.o: \ + third_party/python/Modules/_io/textio.c \ + third_party/python/Modules/_io/clinic/textio.inc + +o/$(MODE)/third_party/python/Modules/_sre.o: \ + third_party/python/Modules/_sre.c \ + third_party/python/Modules/clinic/_sre.inc + o/$(MODE)/third_party/python/Parser/asdl_c.o: PYFLAGS += -m $(THIRD_PARTY_PYTHON_PYTEST_PYMAINS_OBJS): PYFLAGS += -t -P.python -C3 $(THIRD_PARTY_PYTHON_PYTEST_TODOS:%.py=o/$(MODE)/%.o): PYFLAGS += -t -P.python -C3 @@ -4348,7 +4381,6 @@ o/$(MODE)/third_party/python/chibicc.inc: \ libc/nexgen32e/kcpuids.h \ libc/runtime/runtime.h \ libc/runtime/symbolic.h \ - libc/runtime/valist.h \ libc/stdio/stdio.h \ libc/str/str.h \ libc/unicode/unicode.h \ diff --git a/third_party/sqlite3/alter.shell.c b/third_party/sqlite3/alter.shell.c new file mode 100644 index 000000000..ed1d873b3 --- /dev/null +++ b/third_party/sqlite3/alter.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/alter.c" diff --git a/third_party/sqlite3/analyze.shell.c b/third_party/sqlite3/analyze.shell.c new file mode 100644 index 000000000..9ea40006c --- /dev/null +++ b/third_party/sqlite3/analyze.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/analyze.c" diff --git a/third_party/sqlite3/appendvfs.shell.c b/third_party/sqlite3/appendvfs.shell.c new file mode 100644 index 000000000..2b18660d5 --- /dev/null +++ b/third_party/sqlite3/appendvfs.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/appendvfs.c" diff --git a/third_party/sqlite3/attach.shell.c b/third_party/sqlite3/attach.shell.c new file mode 100644 index 000000000..dfe7d6d71 --- /dev/null +++ b/third_party/sqlite3/attach.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/attach.c" diff --git a/third_party/sqlite3/auth.shell.c b/third_party/sqlite3/auth.shell.c new file mode 100644 index 000000000..bbe9c2806 --- /dev/null +++ b/third_party/sqlite3/auth.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/auth.c" diff --git a/third_party/sqlite3/backup.shell.c b/third_party/sqlite3/backup.shell.c new file mode 100644 index 000000000..107773467 --- /dev/null +++ b/third_party/sqlite3/backup.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/backup.c" diff --git a/third_party/sqlite3/bitvec.shell.c b/third_party/sqlite3/bitvec.shell.c new file mode 100644 index 000000000..8cb4930a5 --- /dev/null +++ b/third_party/sqlite3/bitvec.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/bitvec.c" diff --git a/third_party/sqlite3/btmutex.shell.c b/third_party/sqlite3/btmutex.shell.c new file mode 100644 index 000000000..caa2b7eac --- /dev/null +++ b/third_party/sqlite3/btmutex.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/btmutex.c" diff --git a/third_party/sqlite3/btree.shell.c b/third_party/sqlite3/btree.shell.c new file mode 100644 index 000000000..2d435907d --- /dev/null +++ b/third_party/sqlite3/btree.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/btree.c" diff --git a/third_party/sqlite3/build.shell.c b/third_party/sqlite3/build.shell.c new file mode 100644 index 000000000..72dfebe73 --- /dev/null +++ b/third_party/sqlite3/build.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/build.c" diff --git a/third_party/sqlite3/callback.shell.c b/third_party/sqlite3/callback.shell.c new file mode 100644 index 000000000..de758a552 --- /dev/null +++ b/third_party/sqlite3/callback.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/callback.c" diff --git a/third_party/sqlite3/complete.shell.c b/third_party/sqlite3/complete.shell.c new file mode 100644 index 000000000..f27e9d9e7 --- /dev/null +++ b/third_party/sqlite3/complete.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/complete.c" diff --git a/third_party/sqlite3/completion.shell.c b/third_party/sqlite3/completion.shell.c new file mode 100644 index 000000000..7e168358a --- /dev/null +++ b/third_party/sqlite3/completion.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/completion.c" diff --git a/third_party/sqlite3/ctime.shell.c b/third_party/sqlite3/ctime.shell.c new file mode 100644 index 000000000..f7336a562 --- /dev/null +++ b/third_party/sqlite3/ctime.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/ctime.c" diff --git a/third_party/sqlite3/date.shell.c b/third_party/sqlite3/date.shell.c new file mode 100644 index 000000000..fc7f656ec --- /dev/null +++ b/third_party/sqlite3/date.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/date.c" diff --git a/third_party/sqlite3/dbdata.shell.c b/third_party/sqlite3/dbdata.shell.c new file mode 100644 index 000000000..49a5461e5 --- /dev/null +++ b/third_party/sqlite3/dbdata.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/dbdata.c" diff --git a/third_party/sqlite3/dbpage.shell.c b/third_party/sqlite3/dbpage.shell.c new file mode 100644 index 000000000..e0d6fb570 --- /dev/null +++ b/third_party/sqlite3/dbpage.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/dbpage.c" diff --git a/third_party/sqlite3/dbstat.shell.c b/third_party/sqlite3/dbstat.shell.c new file mode 100644 index 000000000..71c1471bc --- /dev/null +++ b/third_party/sqlite3/dbstat.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/dbstat.c" diff --git a/third_party/sqlite3/decimal.shell.c b/third_party/sqlite3/decimal.shell.c new file mode 100644 index 000000000..96118f74e --- /dev/null +++ b/third_party/sqlite3/decimal.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/decimal.c" diff --git a/third_party/sqlite3/delete.shell.c b/third_party/sqlite3/delete.shell.c new file mode 100644 index 000000000..20e73c4ae --- /dev/null +++ b/third_party/sqlite3/delete.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/delete.c" diff --git a/third_party/sqlite3/dog.py b/third_party/sqlite3/dog.py new file mode 100644 index 000000000..a1c5df0fa --- /dev/null +++ b/third_party/sqlite3/dog.py @@ -0,0 +1,120 @@ +sauce = ''' +alter +analyze +appendvfs +attach +auth +backup +bitvec +btmutex +btree +build +callback +complete +completion +ctime +date +dbdata +dbpage +dbstat +decimal +delete +expr +fault +fileio +fkey +fts3 +fts3_aux +fts3_expr +fts3_hash +fts3_icu +fts3_porter +fts3_snippet +fts3_tokenize_vtab +fts3_tokenizer +fts3_tokenizer1 +fts3_unicode +fts3_unicode2 +fts3_write +fts5 +func +global +hash +icu +ieee754 +insert +json1 +legacy +loadext +main +malloc +mem0 +mem1 +mem2 +mem3 +mem5 +memdb +memjournal +memtrace +mutex +mutex_noop +mutex_unix +notify +opcodes +os +os_unix +os_win +pager +parse +pcache +pcache1 +pragma +prepare +printf +random +resolve +rowset +rtree +select +series +shathree +shell +sqlar +sqlite3expert +sqlite3rbu +sqlite3session +status +stmt +table +threads +tokenize +treeview +trigger +uint +update +upsert +userauth +utf +util +vacuum +vdbe +vdbeapi +vdbeaux +vdbeblob +vdbemem +vdbesort +vdbetrace +vdbevtab +vtab +wal +walker +where +wherecode +whereexpr +window +zipfile +'''.split() + +for s in sauce: + with open('third_party/sqlite3/%s.shell.c' % (s), 'w') as f: + f.write('#include "third_party/sqlite3/%s.c"\n' % (s)) diff --git a/third_party/sqlite3/expr.shell.c b/third_party/sqlite3/expr.shell.c new file mode 100644 index 000000000..8441b1415 --- /dev/null +++ b/third_party/sqlite3/expr.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/expr.c" diff --git a/third_party/sqlite3/fault.shell.c b/third_party/sqlite3/fault.shell.c new file mode 100644 index 000000000..0f07bab5c --- /dev/null +++ b/third_party/sqlite3/fault.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fault.c" diff --git a/third_party/sqlite3/fileio.c b/third_party/sqlite3/fileio.c index dbe14d3ce..4619ebb05 100644 --- a/third_party/sqlite3/fileio.c +++ b/third_party/sqlite3/fileio.c @@ -1,3 +1,18 @@ +#include "libc/assert.h" +#include "libc/calls/calls.h" +#include "libc/calls/struct/dirent.h" +#include "libc/calls/struct/stat.h" +#include "libc/calls/struct/stat.macros.h" +#include "libc/calls/weirdtypes.h" +#include "libc/errno.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/at.h" +#include "libc/sysv/consts/s.h" +#include "libc/time/time.h" +#include "third_party/sqlite3/sqlite3ext.h" +// clang-format off + /* ** 2014-06-13 ** @@ -73,21 +88,6 @@ ** And the paths returned in the "name" column of the table are also ** relative to directory $dir. */ -#include "libc/assert.h" -#include "libc/calls/calls.h" -#include "libc/calls/struct/dirent.h" -#include "libc/calls/struct/stat.h" -#include "libc/calls/struct/stat.macros.h" -#include "libc/calls/weirdtypes.h" -#include "libc/errno.h" -#include "libc/isystem/unistd.h" -#include "libc/stdio/stdio.h" -#include "libc/str/str.h" -#include "libc/sysv/consts/at.h" -#include "libc/sysv/consts/s.h" -#include "libc/time/time.h" -#include "third_party/sqlite3/sqlite3ext.h" -// clang-format off SQLITE_EXTENSION_INIT1 diff --git a/third_party/sqlite3/fileio.shell.c b/third_party/sqlite3/fileio.shell.c new file mode 100644 index 000000000..784b16498 --- /dev/null +++ b/third_party/sqlite3/fileio.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fileio.c" diff --git a/third_party/sqlite3/fkey.shell.c b/third_party/sqlite3/fkey.shell.c new file mode 100644 index 000000000..acf186d62 --- /dev/null +++ b/third_party/sqlite3/fkey.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fkey.c" diff --git a/third_party/sqlite3/fts3.shell.c b/third_party/sqlite3/fts3.shell.c new file mode 100644 index 000000000..616df65d6 --- /dev/null +++ b/third_party/sqlite3/fts3.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3.c" diff --git a/third_party/sqlite3/fts3_aux.shell.c b/third_party/sqlite3/fts3_aux.shell.c new file mode 100644 index 000000000..1ec3e53b0 --- /dev/null +++ b/third_party/sqlite3/fts3_aux.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_aux.c" diff --git a/third_party/sqlite3/fts3_expr.shell.c b/third_party/sqlite3/fts3_expr.shell.c new file mode 100644 index 000000000..f06d16ade --- /dev/null +++ b/third_party/sqlite3/fts3_expr.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_expr.c" diff --git a/third_party/sqlite3/fts3_hash.shell.c b/third_party/sqlite3/fts3_hash.shell.c new file mode 100644 index 000000000..fe05adf61 --- /dev/null +++ b/third_party/sqlite3/fts3_hash.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_hash.c" diff --git a/third_party/sqlite3/fts3_icu.shell.c b/third_party/sqlite3/fts3_icu.shell.c new file mode 100644 index 000000000..49b5c15ce --- /dev/null +++ b/third_party/sqlite3/fts3_icu.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_icu.c" diff --git a/third_party/sqlite3/fts3_porter.shell.c b/third_party/sqlite3/fts3_porter.shell.c new file mode 100644 index 000000000..1cff45cc1 --- /dev/null +++ b/third_party/sqlite3/fts3_porter.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_porter.c" diff --git a/third_party/sqlite3/fts3_snippet.shell.c b/third_party/sqlite3/fts3_snippet.shell.c new file mode 100644 index 000000000..99e77d1eb --- /dev/null +++ b/third_party/sqlite3/fts3_snippet.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_snippet.c" diff --git a/third_party/sqlite3/fts3_tokenize_vtab.shell.c b/third_party/sqlite3/fts3_tokenize_vtab.shell.c new file mode 100644 index 000000000..53bb0d44b --- /dev/null +++ b/third_party/sqlite3/fts3_tokenize_vtab.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_tokenize_vtab.c" diff --git a/third_party/sqlite3/fts3_tokenizer.shell.c b/third_party/sqlite3/fts3_tokenizer.shell.c new file mode 100644 index 000000000..354ab7e63 --- /dev/null +++ b/third_party/sqlite3/fts3_tokenizer.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_tokenizer.c" diff --git a/third_party/sqlite3/fts3_tokenizer1.shell.c b/third_party/sqlite3/fts3_tokenizer1.shell.c new file mode 100644 index 000000000..c4020ca1e --- /dev/null +++ b/third_party/sqlite3/fts3_tokenizer1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_tokenizer1.c" diff --git a/third_party/sqlite3/fts3_unicode.shell.c b/third_party/sqlite3/fts3_unicode.shell.c new file mode 100644 index 000000000..2f95f2448 --- /dev/null +++ b/third_party/sqlite3/fts3_unicode.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_unicode.c" diff --git a/third_party/sqlite3/fts3_unicode2.shell.c b/third_party/sqlite3/fts3_unicode2.shell.c new file mode 100644 index 000000000..9da1a45fe --- /dev/null +++ b/third_party/sqlite3/fts3_unicode2.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_unicode2.c" diff --git a/third_party/sqlite3/fts3_write.shell.c b/third_party/sqlite3/fts3_write.shell.c new file mode 100644 index 000000000..655a490f6 --- /dev/null +++ b/third_party/sqlite3/fts3_write.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_write.c" diff --git a/third_party/sqlite3/fts5.c b/third_party/sqlite3/fts5.c index 583d4ada0..49a46ea16 100644 --- a/third_party/sqlite3/fts5.c +++ b/third_party/sqlite3/fts5.c @@ -1,3 +1,10 @@ +#include "libc/assert.h" +#include "libc/assert.h" +#include "libc/math.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "third_party/sqlite3/sqlite3.h" +#include "third_party/sqlite3/sqlite3ext.h" /* clang-format off */ @@ -34,8 +41,6 @@ #ifndef _FTS5_H #define _FTS5_H -#include "third_party/sqlite3/sqlite3.h" - #ifdef __cplusplus extern "C" { #endif @@ -604,12 +609,8 @@ struct fts5_api { #ifndef _FTS5INT_H #define _FTS5INT_H -/* #include "third_party/sqlite3/fts5.h" */ -#include "third_party/sqlite3/sqlite3ext.h" SQLITE_EXTENSION_INIT1 -#include "libc/assert.h" -#include "libc/str/str.h" #ifndef SQLITE_AMALGAMATION @@ -1478,9 +1479,6 @@ static void sqlite3Fts5UnicodeAscii(u8*, u8*); /************ Begin %include sections from the grammar ************************/ #line 47 "fts5parse.y" -/* #include "third_party/sqlite3/fts5Int.h" */ -/* #include "third_party/sqlite3/fts5parse.h" */ - /* ** Disable all error recovery processing in the parser push-down ** automaton. @@ -1807,8 +1805,6 @@ struct fts5yyParser { typedef struct fts5yyParser fts5yyParser; #ifndef NDEBUG -#include "libc/assert.h" -#include "libc/stdio/stdio.h" static FILE *fts5yyTraceFILE = 0; static char *fts5yyTracePrompt = 0; #endif /* NDEBUG */ @@ -3013,9 +3009,6 @@ static int sqlite3Fts5ParserFallback(int iToken){ ****************************************************************************** */ -/* #include "third_party/sqlite3/fts5Int.h" */ -#include "libc/math.h" /* amalgamator: keep */ - /* ** Object used to iterate through all "coalesced phrase instances" in ** a single column of the current row. If the phrase instances in the diff --git a/third_party/sqlite3/fts5.shell.c b/third_party/sqlite3/fts5.shell.c new file mode 100644 index 000000000..09366eca9 --- /dev/null +++ b/third_party/sqlite3/fts5.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts5.c" diff --git a/third_party/sqlite3/func.shell.c b/third_party/sqlite3/func.shell.c new file mode 100644 index 000000000..a5fbce298 --- /dev/null +++ b/third_party/sqlite3/func.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/func.c" diff --git a/third_party/sqlite3/global.shell.c b/third_party/sqlite3/global.shell.c new file mode 100644 index 000000000..a1954d323 --- /dev/null +++ b/third_party/sqlite3/global.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/global.c" diff --git a/third_party/sqlite3/hash.shell.c b/third_party/sqlite3/hash.shell.c new file mode 100644 index 000000000..c7a83c94a --- /dev/null +++ b/third_party/sqlite3/hash.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/hash.c" diff --git a/third_party/sqlite3/icu.shell.c b/third_party/sqlite3/icu.shell.c new file mode 100644 index 000000000..31742ff8a --- /dev/null +++ b/third_party/sqlite3/icu.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/icu.c" diff --git a/third_party/sqlite3/ieee754.shell.c b/third_party/sqlite3/ieee754.shell.c new file mode 100644 index 000000000..a107e8fab --- /dev/null +++ b/third_party/sqlite3/ieee754.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/ieee754.c" diff --git a/third_party/sqlite3/insert.shell.c b/third_party/sqlite3/insert.shell.c new file mode 100644 index 000000000..4ede33db1 --- /dev/null +++ b/third_party/sqlite3/insert.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/insert.c" diff --git a/third_party/sqlite3/json1.shell.c b/third_party/sqlite3/json1.shell.c new file mode 100644 index 000000000..360532429 --- /dev/null +++ b/third_party/sqlite3/json1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/json1.c" diff --git a/third_party/sqlite3/legacy.shell.c b/third_party/sqlite3/legacy.shell.c new file mode 100644 index 000000000..dd086fccb --- /dev/null +++ b/third_party/sqlite3/legacy.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/legacy.c" diff --git a/third_party/sqlite3/loadext.shell.c b/third_party/sqlite3/loadext.shell.c new file mode 100644 index 000000000..623c094ed --- /dev/null +++ b/third_party/sqlite3/loadext.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/loadext.c" diff --git a/third_party/sqlite3/main.shell.c b/third_party/sqlite3/main.shell.c new file mode 100644 index 000000000..9c64591ad --- /dev/null +++ b/third_party/sqlite3/main.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/main.c" diff --git a/third_party/sqlite3/malloc.shell.c b/third_party/sqlite3/malloc.shell.c new file mode 100644 index 000000000..1414533da --- /dev/null +++ b/third_party/sqlite3/malloc.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/malloc.c" diff --git a/third_party/sqlite3/mem0.shell.c b/third_party/sqlite3/mem0.shell.c new file mode 100644 index 000000000..e2359bdc9 --- /dev/null +++ b/third_party/sqlite3/mem0.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem0.c" diff --git a/third_party/sqlite3/mem1.shell.c b/third_party/sqlite3/mem1.shell.c new file mode 100644 index 000000000..184de31de --- /dev/null +++ b/third_party/sqlite3/mem1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem1.c" diff --git a/third_party/sqlite3/mem2.shell.c b/third_party/sqlite3/mem2.shell.c new file mode 100644 index 000000000..82c610c14 --- /dev/null +++ b/third_party/sqlite3/mem2.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem2.c" diff --git a/third_party/sqlite3/mem3.shell.c b/third_party/sqlite3/mem3.shell.c new file mode 100644 index 000000000..2f3d9ca53 --- /dev/null +++ b/third_party/sqlite3/mem3.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem3.c" diff --git a/third_party/sqlite3/mem5.shell.c b/third_party/sqlite3/mem5.shell.c new file mode 100644 index 000000000..9ea6e5128 --- /dev/null +++ b/third_party/sqlite3/mem5.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem5.c" diff --git a/third_party/sqlite3/memdb.shell.c b/third_party/sqlite3/memdb.shell.c new file mode 100644 index 000000000..ff2082835 --- /dev/null +++ b/third_party/sqlite3/memdb.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/memdb.c" diff --git a/third_party/sqlite3/memjournal.shell.c b/third_party/sqlite3/memjournal.shell.c new file mode 100644 index 000000000..7c49b3f91 --- /dev/null +++ b/third_party/sqlite3/memjournal.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/memjournal.c" diff --git a/third_party/sqlite3/memtrace.shell.c b/third_party/sqlite3/memtrace.shell.c new file mode 100644 index 000000000..6487dd70d --- /dev/null +++ b/third_party/sqlite3/memtrace.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/memtrace.c" diff --git a/third_party/sqlite3/mutex.shell.c b/third_party/sqlite3/mutex.shell.c new file mode 100644 index 000000000..891776fca --- /dev/null +++ b/third_party/sqlite3/mutex.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mutex.c" diff --git a/third_party/sqlite3/mutex_noop.shell.c b/third_party/sqlite3/mutex_noop.shell.c new file mode 100644 index 000000000..297e7ed14 --- /dev/null +++ b/third_party/sqlite3/mutex_noop.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mutex_noop.c" diff --git a/third_party/sqlite3/mutex_unix.shell.c b/third_party/sqlite3/mutex_unix.shell.c new file mode 100644 index 000000000..25631f19a --- /dev/null +++ b/third_party/sqlite3/mutex_unix.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mutex_unix.c" diff --git a/third_party/sqlite3/notify.shell.c b/third_party/sqlite3/notify.shell.c new file mode 100644 index 000000000..e841089a6 --- /dev/null +++ b/third_party/sqlite3/notify.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/notify.c" diff --git a/third_party/sqlite3/opcodes.shell.c b/third_party/sqlite3/opcodes.shell.c new file mode 100644 index 000000000..d470da195 --- /dev/null +++ b/third_party/sqlite3/opcodes.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/opcodes.c" diff --git a/third_party/sqlite3/os.shell.c b/third_party/sqlite3/os.shell.c new file mode 100644 index 000000000..9d62ab209 --- /dev/null +++ b/third_party/sqlite3/os.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/os.c" diff --git a/third_party/sqlite3/os_unix.c b/third_party/sqlite3/os_unix.c index 83bc2d745..4af85669f 100644 --- a/third_party/sqlite3/os_unix.c +++ b/third_party/sqlite3/os_unix.c @@ -96,7 +96,6 @@ #include "libc/calls/struct/flock.h" #include "libc/calls/weirdtypes.h" #include "libc/errno.h" -#include "libc/isystem/unistd.h" #include "libc/runtime/sysconf.h" #include "libc/sysv/consts/f.h" #include "libc/sysv/consts/map.h" diff --git a/third_party/sqlite3/os_unix.shell.c b/third_party/sqlite3/os_unix.shell.c new file mode 100644 index 000000000..f17c84ef9 --- /dev/null +++ b/third_party/sqlite3/os_unix.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/os_unix.c" diff --git a/third_party/sqlite3/os_win.shell.c b/third_party/sqlite3/os_win.shell.c new file mode 100644 index 000000000..7ae5fd5d4 --- /dev/null +++ b/third_party/sqlite3/os_win.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/os_win.c" diff --git a/third_party/sqlite3/pager.shell.c b/third_party/sqlite3/pager.shell.c new file mode 100644 index 000000000..94b752256 --- /dev/null +++ b/third_party/sqlite3/pager.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pager.c" diff --git a/third_party/sqlite3/parse.shell.c b/third_party/sqlite3/parse.shell.c new file mode 100644 index 000000000..93b0c0e22 --- /dev/null +++ b/third_party/sqlite3/parse.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/parse.c" diff --git a/third_party/sqlite3/pcache.shell.c b/third_party/sqlite3/pcache.shell.c new file mode 100644 index 000000000..fb7b604a0 --- /dev/null +++ b/third_party/sqlite3/pcache.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pcache.c" diff --git a/third_party/sqlite3/pcache1.shell.c b/third_party/sqlite3/pcache1.shell.c new file mode 100644 index 000000000..1fa0503d3 --- /dev/null +++ b/third_party/sqlite3/pcache1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pcache1.c" diff --git a/third_party/sqlite3/pragma.shell.c b/third_party/sqlite3/pragma.shell.c new file mode 100644 index 000000000..bde2f2ceb --- /dev/null +++ b/third_party/sqlite3/pragma.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pragma.c" diff --git a/third_party/sqlite3/prepare.shell.c b/third_party/sqlite3/prepare.shell.c new file mode 100644 index 000000000..dcb5f5110 --- /dev/null +++ b/third_party/sqlite3/prepare.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/prepare.c" diff --git a/third_party/sqlite3/printf.shell.c b/third_party/sqlite3/printf.shell.c new file mode 100644 index 000000000..bc4baee2d --- /dev/null +++ b/third_party/sqlite3/printf.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/printf.c" diff --git a/third_party/sqlite3/random.shell.c b/third_party/sqlite3/random.shell.c new file mode 100644 index 000000000..eb0b3ba3b --- /dev/null +++ b/third_party/sqlite3/random.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/random.c" diff --git a/third_party/sqlite3/resolve.shell.c b/third_party/sqlite3/resolve.shell.c new file mode 100644 index 000000000..a77164292 --- /dev/null +++ b/third_party/sqlite3/resolve.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/resolve.c" diff --git a/third_party/sqlite3/rowset.shell.c b/third_party/sqlite3/rowset.shell.c new file mode 100644 index 000000000..3c1a53986 --- /dev/null +++ b/third_party/sqlite3/rowset.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/rowset.c" diff --git a/third_party/sqlite3/rtree.shell.c b/third_party/sqlite3/rtree.shell.c new file mode 100644 index 000000000..396f59d20 --- /dev/null +++ b/third_party/sqlite3/rtree.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/rtree.c" diff --git a/third_party/sqlite3/select.shell.c b/third_party/sqlite3/select.shell.c new file mode 100644 index 000000000..be276a733 --- /dev/null +++ b/third_party/sqlite3/select.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/select.c" diff --git a/third_party/sqlite3/series.shell.c b/third_party/sqlite3/series.shell.c new file mode 100644 index 000000000..c2e84dcd7 --- /dev/null +++ b/third_party/sqlite3/series.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/series.c" diff --git a/third_party/sqlite3/shathree.shell.c b/third_party/sqlite3/shathree.shell.c new file mode 100644 index 000000000..88e565d30 --- /dev/null +++ b/third_party/sqlite3/shathree.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/shathree.c" diff --git a/third_party/sqlite3/shell.c b/third_party/sqlite3/shell.c index 165cafbfe..388e4a149 100644 --- a/third_party/sqlite3/shell.c +++ b/third_party/sqlite3/shell.c @@ -31,58 +31,6 @@ ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. */ -#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS) -/* This needs to come before any includes for MSVC compiler */ -#define _CRT_SECURE_NO_WARNINGS -#endif - -/* -** Determine if we are dealing with WinRT, which provides only a subset of -** the full Win32 API. -*/ -#if !defined(SQLITE_OS_WINRT) -# define SQLITE_OS_WINRT 0 -#endif - -/* -** Warning pragmas copied from msvc.h in the core. -*/ -#if defined(_MSC_VER) -#pragma warning(disable : 4054) -#pragma warning(disable : 4055) -#pragma warning(disable : 4100) -#pragma warning(disable : 4127) -#pragma warning(disable : 4130) -#pragma warning(disable : 4152) -#pragma warning(disable : 4189) -#pragma warning(disable : 4206) -#pragma warning(disable : 4210) -#pragma warning(disable : 4232) -#pragma warning(disable : 4244) -#pragma warning(disable : 4305) -#pragma warning(disable : 4306) -#pragma warning(disable : 4702) -#pragma warning(disable : 4706) -#endif /* defined(_MSC_VER) */ - -/* -** No support for loadable extensions in VxWorks. -*/ -#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION -# define SQLITE_OMIT_LOAD_EXTENSION 1 -#endif - -/* -** Enable large-file support for fopen() and friends on unix. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - #include "libc/assert.h" #include "libc/fmt/conv.h" #include "libc/fmt/fmt.h" @@ -102,23 +50,23 @@ #include "third_party/sqlite3/sqlite3expert.h" #include "third_party/zlib/zlib.h" #include "third_party/sqlite3/sqlite3.h" +#include "libc/str/str.h" +#include "third_party/musl/passwd.h" +#include "libc/calls/calls.h" +#include "libc/calls/weirdtypes.h" +#include "libc/calls/calls.h" +#include "third_party/linenoise/linenoise.h" +#include "libc/sysv/consts/rusage.h" +#include "libc/time/time.h" +#if SQLITE_USER_AUTHENTICATION +#include "third_party/sqlite3/sqlite3userauth.inc" +#endif typedef sqlite3_int64 i64; typedef sqlite3_uint64 u64; typedef unsigned char u8; -#if SQLITE_USER_AUTHENTICATION -#include "third_party/sqlite3/sqlite3userauth.inc" -#endif -#include "libc/str/str.h" -#if !defined(_WIN32) && !defined(WIN32) -#if !defined(__RTP__) && !defined(_WRS_KERNEL) -#include "third_party/musl/passwd.h" -#endif -#endif #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) -#include "libc/calls/calls.h" -#include "libc/isystem/unistd.h" #define GETPID getpid #if defined(__MINGW32__) #define DIRENT dirent @@ -129,8 +77,6 @@ typedef unsigned char u8; #else # define GETPID (int)GetCurrentProcessId #endif -#include "libc/calls/weirdtypes.h" -#include "libc/calls/calls.h" #if HAVE_READLINE # include @@ -150,7 +96,6 @@ typedef unsigned char u8; # define shell_readline(X) readline(X) #elif HAVE_LINENOISE -#include "third_party/linenoise/linenoise.h" #define shell_add_history(X) linenoiseHistoryAdd(X) #define shell_read_history(X) linenoiseHistoryLoad(X) @@ -225,8 +170,6 @@ static sqlite3_int64 timeOfDay(void){ } #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) -#include "libc/sysv/consts/rusage.h" -#include "libc/time/time.h" /* Saved resource information for the beginning of an operation */ static struct rusage sBegin; /* CPU time at start */ diff --git a/third_party/sqlite3/shell.c.in b/third_party/sqlite3/shell.c.in index 92b660cd6..bca9bba10 100644 --- a/third_party/sqlite3/shell.c.in +++ b/third_party/sqlite3/shell.c.in @@ -65,29 +65,18 @@ # define _LARGEFILE_SOURCE 1 #endif -#include -#include -#include -#include -#include "sqlite3.h" typedef sqlite3_int64 i64; typedef sqlite3_uint64 u64; typedef unsigned char u8; #if SQLITE_USER_AUTHENTICATION # include "sqlite3userauth.inc" #endif -#include -#include #if !defined(_WIN32) && !defined(WIN32) -# include # if !defined(__RTP__) && !defined(_WRS_KERNEL) -# include # endif #endif #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) -# include -# include # define GETPID getpid # if defined(__MINGW32__) # define DIRENT dirent diff --git a/third_party/sqlite3/sqlar.shell.c b/third_party/sqlite3/sqlar.shell.c new file mode 100644 index 000000000..cac08a8e9 --- /dev/null +++ b/third_party/sqlite3/sqlar.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/sqlar.c" diff --git a/third_party/sqlite3/sqlite3.mk b/third_party/sqlite3/sqlite3.mk index e2d6b4925..340bc76df 100644 --- a/third_party/sqlite3/sqlite3.mk +++ b/third_party/sqlite3/sqlite3.mk @@ -20,6 +20,7 @@ THIRD_PARTY_SQLITE3 = $(THIRD_PARTY_SQLITE3_A_DEPS) $(THIRD_PARTY_SQLITE3_A) THIRD_PARTY_SQLITE3_A = o/$(MODE)/third_party/sqlite3/libsqlite3.a THIRD_PARTY_SQLITE3_A_FILES := $(wildcard third_party/sqlite3/*) THIRD_PARTY_SQLITE3_A_HDRS = $(filter %.h,$(THIRD_PARTY_SQLITE3_A_FILES)) +THIRD_PARTY_SQLITE3_A_INCS = $(filter %.inc,$(THIRD_PARTY_SQLITE3_A_FILES)) THIRD_PARTY_SQLITE3_A_SRCS_C = $(filter %.c,$(THIRD_PARTY_SQLITE3_A_FILES)) THIRD_PARTY_SQLITE3_A_SRCS_T = $(filter %.inc,$(THIRD_PARTY_SQLITE3_A_FILES)) THIRD_PARTY_SQLITE3_BINS = $(THIRD_PARTY_SQLITE3_COMS) $(THIRD_PARTY_SQLITE3_COMS:%=%.dbg) @@ -29,10 +30,10 @@ THIRD_PARTY_SQLITE3_A_SRCS = \ $(THIRD_PARTY_SQLITE3_A_SRCS_T) THIRD_PARTY_SQLITE3_A_OBJS = \ - $(filter-out %/shell.o,$(THIRD_PARTY_SQLITE3_A_SRCS_C:%.c=o/$(MODE)/%.o)) + $(filter-out %shell.o,$(THIRD_PARTY_SQLITE3_A_SRCS_C:%.c=o/$(MODE)/%.o)) THIRD_PARTY_SQLITE3_SHELL_OBJS = \ - $(THIRD_PARTY_SQLITE3_A_SRCS_C:%.c=o/$(MODE)/%.shell.o) + $(filter %shell.o,$(THIRD_PARTY_SQLITE3_A_SRCS_C:%.c=o/$(MODE)/%.o)) THIRD_PARTY_SQLITE3_COMS = \ o/$(MODE)/third_party/sqlite3/sqlite3.com @@ -71,11 +72,11 @@ THIRD_PARTY_SQLITE3_A_DEPS := \ o/$(MODE)/third_party/sqlite3/sqlite3.com.dbg: \ $(THIRD_PARTY_SQLITE3_A_DEPS) \ $(THIRD_PARTY_SQLITE3_SHELL_OBJS) \ - o/$(MODE)/third_party/sqlite3/shell.shell.o \ + o/$(MODE)/third_party/sqlite3/shell.o \ o/$(MODE)/third_party/sqlite3/shell.pkg \ $(CRT) \ $(APE_NO_MODIFY_SELF) - -@$(APELINK) + @$(APELINK) o/$(MODE)/third_party/sqlite3/sqlite3.com: \ o/$(MODE)/third_party/sqlite3/sqlite3.com.dbg \ @@ -167,7 +168,7 @@ o//third_party/sqlite3/vdbe.o: \ OVERRIDE_CFLAGS += \ -Os -o/$(MODE)/third_party/sqlite3/shell.shell.o: \ +o/$(MODE)/third_party/sqlite3/shell.o: \ OVERRIDE_CFLAGS += \ -DSTACK_FRAME_UNLIMITED @@ -184,18 +185,26 @@ o/$(MODE)/third_party/sqlite3/parse.o: \ OVERRIDE_CFLAGS += \ -fpie -o/$(MODE)/%.shell.o: %.c o/$(MODE)/%.o - @$(COMPILE) -AOBJECTIFY.c $(OBJECTIFY.c) $(OUTPUT_OPTION) $< - -o/$(MODE)/third_party/sqlite3/shell.shell.o: QUOTA = -M512m -C16 -L180 +o/$(MODE)/third_party/sqlite3/shell.o: QUOTA = -M512m -C16 -L180 o/$(MODE)/third_party/sqlite3/vdbe.o: QUOTA = -M1024m o/$(MODE)/third_party/sqlite3/vdbe.shell.o: QUOTA = -M1024m o/$(MODE)/third_party/sqlite3/fts5.o: QUOTA = -M512m -C16 o/$(MODE)/third_party/sqlite3/fts5.shell.o: QUOTA = -M512m -C16 -L180 +o/$(MODE)/third_party/sqlite3/rtree.o: \ + third_party/sqlite3/rtree.c \ + third_party/sqlite3/geopoly.inc \ + third_party/gdtoa/gdtoa.h + +o/$(MODE)/third_party/sqlite3/rtree.shell.o: \ + third_party/sqlite3/rtree.shell.c \ + third_party/sqlite3/geopoly.inc \ + third_party/gdtoa/gdtoa.h + THIRD_PARTY_SQLITE3_LIBS = $(foreach x,$(THIRD_PARTY_SQLITE3_ARTIFACTS),$($(x))) THIRD_PARTY_SQLITE3_SRCS = $(foreach x,$(THIRD_PARTY_SQLITE3_ARTIFACTS),$($(x)_SRCS)) THIRD_PARTY_SQLITE3_HDRS = $(foreach x,$(THIRD_PARTY_SQLITE3_ARTIFACTS),$($(x)_HDRS)) +THIRD_PARTY_SQLITE3_INCS = $(foreach x,$(THIRD_PARTY_SQLITE3_ARTIFACTS),$($(x)_INCS)) THIRD_PARTY_SQLITE3_CHECKS = $(foreach x,$(THIRD_PARTY_SQLITE3_ARTIFACTS),$($(x)_CHECKS)) THIRD_PARTY_SQLITE3_OBJS = $(foreach x,$(THIRD_PARTY_SQLITE3_ARTIFACTS),$($(x)_OBJS)) diff --git a/third_party/sqlite3/sqlite3expert.shell.c b/third_party/sqlite3/sqlite3expert.shell.c new file mode 100644 index 000000000..e7a07c8f0 --- /dev/null +++ b/third_party/sqlite3/sqlite3expert.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/sqlite3expert.c" diff --git a/third_party/sqlite3/sqlite3rbu.shell.c b/third_party/sqlite3/sqlite3rbu.shell.c new file mode 100644 index 000000000..e08e0cb3c --- /dev/null +++ b/third_party/sqlite3/sqlite3rbu.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/sqlite3rbu.c" diff --git a/third_party/sqlite3/sqlite3session.shell.c b/third_party/sqlite3/sqlite3session.shell.c new file mode 100644 index 000000000..f317e451c --- /dev/null +++ b/third_party/sqlite3/sqlite3session.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/sqlite3session.c" diff --git a/third_party/sqlite3/sqliteInt.inc b/third_party/sqlite3/sqliteInt.inc index 7ec44642d..48a868c6d 100644 --- a/third_party/sqlite3/sqliteInt.inc +++ b/third_party/sqlite3/sqliteInt.inc @@ -1193,6 +1193,13 @@ typedef struct With With; typedef int VList; typedef u32 Pgno; +/* +** Enable SQLITE_ENABLE_EXPLAIN_COMMENTS if SQLITE_DEBUG is turned on. +*/ +#if !defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) && defined(SQLITE_DEBUG) +# define SQLITE_ENABLE_EXPLAIN_COMMENTS 1 +#endif + /* ** Defer sourcing vdbe.h and btree.h until after the "u8" and ** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque diff --git a/third_party/sqlite3/status.shell.c b/third_party/sqlite3/status.shell.c new file mode 100644 index 000000000..4791a6adf --- /dev/null +++ b/third_party/sqlite3/status.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/status.c" diff --git a/third_party/sqlite3/stmt.shell.c b/third_party/sqlite3/stmt.shell.c new file mode 100644 index 000000000..dc4e9b8d1 --- /dev/null +++ b/third_party/sqlite3/stmt.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/stmt.c" diff --git a/third_party/sqlite3/table.shell.c b/third_party/sqlite3/table.shell.c new file mode 100644 index 000000000..01d8c6a03 --- /dev/null +++ b/third_party/sqlite3/table.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/table.c" diff --git a/third_party/sqlite3/threads.shell.c b/third_party/sqlite3/threads.shell.c new file mode 100644 index 000000000..f0ce99218 --- /dev/null +++ b/third_party/sqlite3/threads.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/threads.c" diff --git a/third_party/sqlite3/tokenize.shell.c b/third_party/sqlite3/tokenize.shell.c new file mode 100644 index 000000000..42f65cb63 --- /dev/null +++ b/third_party/sqlite3/tokenize.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/tokenize.c" diff --git a/third_party/sqlite3/treeview.shell.c b/third_party/sqlite3/treeview.shell.c new file mode 100644 index 000000000..8968376a5 --- /dev/null +++ b/third_party/sqlite3/treeview.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/treeview.c" diff --git a/third_party/sqlite3/trigger.shell.c b/third_party/sqlite3/trigger.shell.c new file mode 100644 index 000000000..6cd1138d4 --- /dev/null +++ b/third_party/sqlite3/trigger.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/trigger.c" diff --git a/third_party/sqlite3/uint.shell.c b/third_party/sqlite3/uint.shell.c new file mode 100644 index 000000000..ad28396bb --- /dev/null +++ b/third_party/sqlite3/uint.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/uint.c" diff --git a/third_party/sqlite3/update.shell.c b/third_party/sqlite3/update.shell.c new file mode 100644 index 000000000..74c7da8d0 --- /dev/null +++ b/third_party/sqlite3/update.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/update.c" diff --git a/third_party/sqlite3/upsert.shell.c b/third_party/sqlite3/upsert.shell.c new file mode 100644 index 000000000..d5c34d903 --- /dev/null +++ b/third_party/sqlite3/upsert.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/upsert.c" diff --git a/third_party/sqlite3/userauth.shell.c b/third_party/sqlite3/userauth.shell.c new file mode 100644 index 000000000..541a0f56d --- /dev/null +++ b/third_party/sqlite3/userauth.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/userauth.c" diff --git a/third_party/sqlite3/utf.shell.c b/third_party/sqlite3/utf.shell.c new file mode 100644 index 000000000..0548bae95 --- /dev/null +++ b/third_party/sqlite3/utf.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/utf.c" diff --git a/third_party/sqlite3/util.shell.c b/third_party/sqlite3/util.shell.c new file mode 100644 index 000000000..57c1df4e6 --- /dev/null +++ b/third_party/sqlite3/util.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/util.c" diff --git a/third_party/sqlite3/vacuum.shell.c b/third_party/sqlite3/vacuum.shell.c new file mode 100644 index 000000000..25781dce4 --- /dev/null +++ b/third_party/sqlite3/vacuum.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vacuum.c" diff --git a/third_party/sqlite3/vdbe.shell.c b/third_party/sqlite3/vdbe.shell.c new file mode 100644 index 000000000..9724dc871 --- /dev/null +++ b/third_party/sqlite3/vdbe.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbe.c" diff --git a/third_party/sqlite3/vdbeapi.shell.c b/third_party/sqlite3/vdbeapi.shell.c new file mode 100644 index 000000000..5ac9ccf3c --- /dev/null +++ b/third_party/sqlite3/vdbeapi.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbeapi.c" diff --git a/third_party/sqlite3/vdbeaux.shell.c b/third_party/sqlite3/vdbeaux.shell.c new file mode 100644 index 000000000..ea0c7b971 --- /dev/null +++ b/third_party/sqlite3/vdbeaux.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbeaux.c" diff --git a/third_party/sqlite3/vdbeblob.shell.c b/third_party/sqlite3/vdbeblob.shell.c new file mode 100644 index 000000000..82297569b --- /dev/null +++ b/third_party/sqlite3/vdbeblob.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbeblob.c" diff --git a/third_party/sqlite3/vdbemem.shell.c b/third_party/sqlite3/vdbemem.shell.c new file mode 100644 index 000000000..9d53115a3 --- /dev/null +++ b/third_party/sqlite3/vdbemem.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbemem.c" diff --git a/third_party/sqlite3/vdbesort.shell.c b/third_party/sqlite3/vdbesort.shell.c new file mode 100644 index 000000000..0c487de1a --- /dev/null +++ b/third_party/sqlite3/vdbesort.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbesort.c" diff --git a/third_party/sqlite3/vdbetrace.shell.c b/third_party/sqlite3/vdbetrace.shell.c new file mode 100644 index 000000000..b4af282ed --- /dev/null +++ b/third_party/sqlite3/vdbetrace.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbetrace.c" diff --git a/third_party/sqlite3/vdbevtab.shell.c b/third_party/sqlite3/vdbevtab.shell.c new file mode 100644 index 000000000..001d48b24 --- /dev/null +++ b/third_party/sqlite3/vdbevtab.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vdbevtab.c" diff --git a/third_party/sqlite3/vtab.shell.c b/third_party/sqlite3/vtab.shell.c new file mode 100644 index 000000000..8415afeda --- /dev/null +++ b/third_party/sqlite3/vtab.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/vtab.c" diff --git a/third_party/sqlite3/wal.shell.c b/third_party/sqlite3/wal.shell.c new file mode 100644 index 000000000..edebe71fd --- /dev/null +++ b/third_party/sqlite3/wal.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/wal.c" diff --git a/third_party/sqlite3/walker.shell.c b/third_party/sqlite3/walker.shell.c new file mode 100644 index 000000000..56ea9cf79 --- /dev/null +++ b/third_party/sqlite3/walker.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/walker.c" diff --git a/third_party/sqlite3/where.shell.c b/third_party/sqlite3/where.shell.c new file mode 100644 index 000000000..3b5511ffc --- /dev/null +++ b/third_party/sqlite3/where.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/where.c" diff --git a/third_party/sqlite3/wherecode.shell.c b/third_party/sqlite3/wherecode.shell.c new file mode 100644 index 000000000..328b2b1ad --- /dev/null +++ b/third_party/sqlite3/wherecode.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/wherecode.c" diff --git a/third_party/sqlite3/whereexpr.shell.c b/third_party/sqlite3/whereexpr.shell.c new file mode 100644 index 000000000..8c01261a2 --- /dev/null +++ b/third_party/sqlite3/whereexpr.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/whereexpr.c" diff --git a/third_party/sqlite3/window.shell.c b/third_party/sqlite3/window.shell.c new file mode 100644 index 000000000..290a325c9 --- /dev/null +++ b/third_party/sqlite3/window.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/window.c" diff --git a/third_party/sqlite3/zipfile.shell.c b/third_party/sqlite3/zipfile.shell.c new file mode 100644 index 000000000..6a6d94529 --- /dev/null +++ b/third_party/sqlite3/zipfile.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/zipfile.c" diff --git a/third_party/zip/crypt.c b/third_party/zip/crypt.c index 8ca9871fe..5e0155f9b 100644 --- a/third_party/zip/crypt.c +++ b/third_party/zip/crypt.c @@ -1,4 +1,9 @@ /* clang-format off */ +#define ZCRYPT_INTERNAL +#include "third_party/zip/zip.h" +#include "third_party/zip/crypt.h" +#include "third_party/zip/ttyio.h" +#include "libc/rand/rand.h" /* Copyright (c) 1990-2008 Info-ZIP. All rights reserved. @@ -30,12 +35,6 @@ version without encryption capabilities). */ -#define ZCRYPT_INTERNAL -#include "third_party/zip/zip.h" -#include "third_party/zip/crypt.h" -#include "third_party/zip/ttyio.h" -#include "libc/rand/rand.h" - #if CRYPT #ifndef FALSE diff --git a/third_party/zip/crypt_.c b/third_party/zip/crypt_.c new file mode 100644 index 000000000..9606c2739 --- /dev/null +++ b/third_party/zip/crypt_.c @@ -0,0 +1,2 @@ +#define UTIL +#include "third_party/zip/crypt.c" diff --git a/third_party/zip/fileio_.c b/third_party/zip/fileio_.c new file mode 100644 index 000000000..45b0f6665 --- /dev/null +++ b/third_party/zip/fileio_.c @@ -0,0 +1,2 @@ +#define UTIL +#include "third_party/zip/fileio.c" diff --git a/third_party/zip/unix.c b/third_party/zip/unix.c index 453c3fad4..dbdc2eaca 100644 --- a/third_party/zip/unix.c +++ b/third_party/zip/unix.c @@ -1,4 +1,14 @@ /* clang-format off */ +#include "libc/calls/struct/dirent.h" +#include "libc/calls/calls.h" +#include "libc/sysv/consts/s.h" +#include "third_party/zip/zip.h" +#include "libc/time/time.h" +#include "libc/calls/struct/stat.macros.h" +#include "libc/calls/calls.h" +#include "third_party/zip/osdep.h" +#include "libc/sysv/consts/dt.h" + /* unix/unix.c - Zip 3 @@ -9,15 +19,6 @@ If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ -#include "libc/calls/struct/dirent.h" -#include "libc/calls/calls.h" -#include "libc/sysv/consts/s.h" -#include "third_party/zip/zip.h" -#include "libc/time/time.h" -#include "libc/calls/struct/stat.macros.h" -#include "libc/calls/calls.h" -#include "third_party/zip/osdep.h" -#include "libc/sysv/consts/dt.h" #ifndef UTIL /* the companion #endif is a bit of ways down ... */ diff --git a/third_party/zip/unix_.c b/third_party/zip/unix_.c new file mode 100644 index 000000000..2a9554609 --- /dev/null +++ b/third_party/zip/unix_.c @@ -0,0 +1,2 @@ +#define UTIL +#include "third_party/zip/unix.c" diff --git a/third_party/zip/util_.c b/third_party/zip/util_.c new file mode 100644 index 000000000..4a30a0f04 --- /dev/null +++ b/third_party/zip/util_.c @@ -0,0 +1,2 @@ +#define UTIL +#include "third_party/zip/util.c" diff --git a/third_party/zip/zip.h b/third_party/zip/zip.h index 9b0e6f926..c493a86c3 100644 --- a/third_party/zip/zip.h +++ b/third_party/zip/zip.h @@ -1,81 +1,6 @@ -/* clang-format off */ -/* - zip.h - Zip 3 - -/---------------------------------------------------------------------/ - -Info-ZIP Licence - -This is version 2007-Mar-4 of the Info-ZIP license. -The definitive version of this document should be available at -ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and -a copy at http://www.info-zip.org/pub/infozip/license.html. - - -Copyright (c) 1990-2008 Info-ZIP. All rights reserved. - -For the purposes of this copyright and license, "Info-ZIP" is defined as -the following set of individuals: - - Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, - Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth, - Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, - David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, - Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, - Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda, - Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren, - Rich Wales, Mike White. - -This software is provided "as is," without warranty of any kind, express -or implied. In no event shall Info-ZIP or its contributors be held liable -for any direct, indirect, incidental, special or consequential damages -arising out of the use of or inability to use this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the above disclaimer and the following restrictions: - - 1. Redistributions of source code (in whole or in part) must retain - the above copyright notice, definition, disclaimer, and this list - of conditions. - - 2. Redistributions in binary form (compiled executables and libraries) - must reproduce the above copyright notice, definition, disclaimer, - and this list of conditions in documentation and/or other materials - provided with the distribution. The sole exception to this condition - is redistribution of a standard UnZipSFX binary (including SFXWiz) as - part of a self-extracting archive; that is permitted without inclusion - of this license, as long as the normal SFX banner has not been removed - from the binary or disabled. - - 3. Altered versions--including, but not limited to, ports to new operating - systems, existing ports with new graphical interfaces, versions with - modified or added functionality, and dynamic, shared, or static library - versions not from Info-ZIP--must be plainly marked as such and must not - be misrepresented as being the original source or, if binaries, - compiled from the original source. Such altered versions also must not - be misrepresented as being Info-ZIP releases--including, but not - limited to, labeling of the altered versions with the names "Info-ZIP" - (or any variation thereof, including, but not limited to, different - capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the - explicit permission of Info-ZIP. Such altered versions are further - prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP - e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP - will provide support for the altered versions. - - 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," - "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its - own source and binary releases. - -/---------------------------------------------------------------------/ - -*/ - -/* - * zip.h by Mark Adler - */ #ifndef __zip_h #define __zip_h 1 +/* clang-format off */ #define ZIP /* for crypt.c: include zip password functions, not unzip */ @@ -88,6 +13,9 @@ typedef unsigned long ulg; /* unsigned 32-bit value */ /* Set up portability */ #include "third_party/zip/tailor.h" +/* Error return codes and PERR macro */ +#include "third_party/zip/ziperr.h" + /* In the utilities, the crc32() function is only used for UNICODE_SUPPORT. */ #if defined(UTIL) && !defined(UNICODE_SUPPORT) # define CRC_TABLE_ONLY @@ -273,9 +201,6 @@ struct plist { #define ZP_PW_ENTER 0 /* request for encryption password */ #define ZP_PW_VERIFY 1 /* request for reentering password */ -/* Error return codes and PERR macro */ -#include "third_party/zip/ziperr.h" - #if 0 /* Optimization: use the (const) result of crc32(0L,NULL,0) */ # define CRCVAL_INITIAL crc32(0L, (uch *)NULL, 0) # if 00 /* not used, should be removed !! */ @@ -870,13 +795,6 @@ void bi_init OF((char *, unsigned int, int)); # endif #endif /* WIN32 */ -#if (defined(WINDLL) || defined(DLL_ZIPAPI)) -/*--------------------------------------------------------------------------- - Prototypes for public Zip API (DLL) functions. - ---------------------------------------------------------------------------*/ -#include "third_party/zip/api.h" -#endif /* WINDLL || DLL_ZIPAPI */ - /* WIN32_OEM */ #ifdef WIN32 diff --git a/third_party/zip/zip.mk b/third_party/zip/zip.mk index 74cfffd5e..98f3d7aa0 100644 --- a/third_party/zip/zip.mk +++ b/third_party/zip/zip.mk @@ -5,7 +5,7 @@ PKGS += THIRD_PARTY_ZIP THIRD_PARTY_ZIP_FILES := $(wildcard third_party/zip/*) THIRD_PARTY_ZIP_SRCS = $(filter %.c,$(THIRD_PARTY_ZIP_FILES)) -#THIRD_PARTY_ZIP_HDRS = $(filter %.h,$(THIRD_PARTY_ZIP_FILES)) +THIRD_PARTY_ZIP_HDRS = $(filter %.h,$(THIRD_PARTY_ZIP_FILES)) THIRD_PARTY_ZIP_INCS = $(filter %.inc,$(THIRD_PARTY_ZIP_FILES)) THIRD_PARTY_ZIP_COMS = \ @@ -163,14 +163,6 @@ o/$(MODE)/third_party/zip/zipup.o: \ -DZIP64_SUPPORT \ -DBZIP2_SUPPORT -o/$(MODE)/third_party/zip/crypt_.o \ -o/$(MODE)/third_party/zip/unix_.o \ -o/$(MODE)/third_party/zip/zipfile_.o \ -o/$(MODE)/third_party/zip/fileio_.o \ -o/$(MODE)/third_party/zip/util_.o: \ - OVERRIDE_CPPFLAGS += \ - -DUTIL - o/$(MODE)/third_party/zip/zip.o \ o/$(MODE)/third_party/zip/zipsplit.o \ o/$(MODE)/third_party/zip/fileio.o \ @@ -178,11 +170,6 @@ o/$(MODE)/third_party/zip/fileio_.o: \ OVERRIDE_CPPFLAGS += \ -DSTACK_FRAME_UNLIMITED -o/$(MODE)/third_party/zip/%_.o: \ - third_party/zip/%.c \ - o/$(MODE)/third_party/zip/%.o - @$(COMPILE) -AOBJECTIFY.c $(OBJECTIFY.c) $(OUTPUT_OPTION) $< - .PHONY: o/$(MODE)/third_party/zip o/$(MODE)/third_party/zip: \ $(THIRD_PARTY_ZIP_BINS) \ diff --git a/third_party/zip/zipfile_.c b/third_party/zip/zipfile_.c new file mode 100644 index 000000000..702f9c2a3 --- /dev/null +++ b/third_party/zip/zipfile_.c @@ -0,0 +1,2 @@ +#define UTIL +#include "third_party/zip/zipfile.c" diff --git a/third_party/zlib/gz/gz.mk b/third_party/zlib/gz/gz.mk index aa83ff83d..306d14d3f 100644 --- a/third_party/zlib/gz/gz.mk +++ b/third_party/zlib/gz/gz.mk @@ -8,6 +8,7 @@ THIRD_PARTY_ZLIB_GZ = $(THIRD_PARTY_ZLIB_GZ_A_DEPS) $(THIRD_PARTY_ZLIB_GZ_A) THIRD_PARTY_ZLIB_GZ_A = o/$(MODE)/third_party/zlib/gz/gz.a THIRD_PARTY_ZLIB_GZ_A_FILES := $(wildcard third_party/zlib/gz/*) THIRD_PARTY_ZLIB_GZ_A_HDRS = $(filter %.h,$(THIRD_PARTY_ZLIB_GZ_A_FILES)) +THIRD_PARTY_ZLIB_GZ_A_INCS = $(filter %.inc,$(THIRD_PARTY_ZLIB_GZ_A_FILES)) THIRD_PARTY_ZLIB_GZ_A_SRCS = $(filter %.c,$(THIRD_PARTY_ZLIB_GZ_A_FILES)) THIRD_PARTY_ZLIB_GZ_A_OBJS = $(THIRD_PARTY_ZLIB_GZ_A_SRCS:%.c=o/$(MODE)/%.o) @@ -47,6 +48,7 @@ $(THIRD_PARTY_ZLIB_GZ_OBJS): \ THIRD_PARTY_ZLIB_GZ_LIBS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x))) THIRD_PARTY_ZLIB_GZ_SRCS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x)_SRCS)) THIRD_PARTY_ZLIB_GZ_HDRS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x)_HDRS)) +THIRD_PARTY_ZLIB_GZ_INCS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x)_INCS)) THIRD_PARTY_ZLIB_GZ_BINS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x)_BINS)) THIRD_PARTY_ZLIB_GZ_CHECKS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x)_CHECKS)) THIRD_PARTY_ZLIB_GZ_OBJS = $(foreach x,$(THIRD_PARTY_ZLIB_GZ_ARTIFACTS),$($(x)_OBJS)) diff --git a/third_party/zlib/zlib.mk b/third_party/zlib/zlib.mk index 1b3b08dd5..fd38e8bba 100644 --- a/third_party/zlib/zlib.mk +++ b/third_party/zlib/zlib.mk @@ -7,8 +7,7 @@ THIRD_PARTY_ZLIB_ARTIFACTS += THIRD_PARTY_ZLIB_A THIRD_PARTY_ZLIB = $(THIRD_PARTY_ZLIB_A_DEPS) $(THIRD_PARTY_ZLIB_A) THIRD_PARTY_ZLIB_A = o/$(MODE)/third_party/zlib/zlib.a THIRD_PARTY_ZLIB_A_FILES := $(wildcard third_party/zlib/*) -THIRD_PARTY_ZLIB_A_HDRS = third_party/zlib/zlib.h third_party/zlib/puff.h -THIRD_PARTY_ZLIB_A_HDRS_ALL = $(filter %.h,$(THIRD_PARTY_ZLIB_A_FILES)) +THIRD_PARTY_ZLIB_A_HDRS = $(filter %.h,$(THIRD_PARTY_ZLIB_A_FILES)) THIRD_PARTY_ZLIB_A_SRCS_S = $(filter %.S,$(THIRD_PARTY_ZLIB_A_FILES)) THIRD_PARTY_ZLIB_A_SRCS_C = $(filter %.c,$(THIRD_PARTY_ZLIB_A_FILES)) @@ -22,7 +21,7 @@ THIRD_PARTY_ZLIB_A_OBJS = \ THIRD_PARTY_ZLIB_A_CHECKS = \ $(THIRD_PARTY_ZLIB_A).pkg \ - $(THIRD_PARTY_ZLIB_A_HDRS_ALL:%=o/$(MODE)/%.ok) + $(THIRD_PARTY_ZLIB_A_HDRS:%=o/$(MODE)/%.ok) THIRD_PARTY_ZLIB_A_DIRECTDEPS = \ LIBC_INTRIN \ @@ -61,7 +60,6 @@ o/$(MODE)/third_party/zlib/adler32.o: \ THIRD_PARTY_ZLIB_LIBS = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x))) THIRD_PARTY_ZLIB_SRCS = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x)_SRCS)) THIRD_PARTY_ZLIB_HDRS = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x)_HDRS)) -THIRD_PARTY_ZLIB_HDRS_ALL = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x)_HDRS_ALL)) THIRD_PARTY_ZLIB_BINS = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x)_BINS)) THIRD_PARTY_ZLIB_CHECKS = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x)_CHECKS)) THIRD_PARTY_ZLIB_OBJS = $(foreach x,$(THIRD_PARTY_ZLIB_ARTIFACTS),$($(x)_OBJS)) diff --git a/tool/build/assimilate.c b/tool/build/assimilate.c index 06ab70324..87209d262 100644 --- a/tool/build/assimilate.c +++ b/tool/build/assimilate.c @@ -63,8 +63,10 @@ APE shell script format. This is useful on UNIX operating systems when\n\ you want to use your APE programs as script interpreter or for setuid.\n\ " -#define MODE_ELF 1 -#define MODE_MACHO 2 +#define MODE_NATIVE 0 +#define MODE_ELF 1 +#define MODE_MACHO 2 +#define MODE_PE 3 int g_mode; bool g_force; @@ -94,11 +96,13 @@ void GetOpts(int argc, char *argv[]) { exit(64); } } - if (!g_mode) { + if (g_mode == MODE_NATIVE) { if (IsXnu()) { g_mode = MODE_MACHO; - } else { + } else if (IsLinux() || IsFreebsd() || IsNetbsd() || IsOpenbsd()) { g_mode = MODE_ELF; + } else { + g_mode = MODE_PE; } } } @@ -233,6 +237,20 @@ void Assimilate(void) { kprintf("%s: mmap failed: %m\n", prog); exit(16); } + if (g_mode == MODE_PE) { + if (READ16LE(p) == READ16LE("MZ")) { + if (!g_force) { + kprintf("%s: program is already an elf binary\n", prog); + if (g_mode != MODE_ELF) { + exitcode = 1; + } + } + goto Finish; + } else { + kprintf("%s: currently cannot back-convert to pe\n", prog); + exit(17); + } + } if (READ32LE(p) == READ32LE("\177ELF")) { if (!g_force) { kprintf("%s: program is already an elf binary\n", prog); diff --git a/tool/build/build.mk b/tool/build/build.mk index db81a22e5..3d7a7cdbf 100644 --- a/tool/build/build.mk +++ b/tool/build/build.mk @@ -85,14 +85,6 @@ o/$(MODE)/tool/build/%.com.dbg: \ $(APE_NO_MODIFY_SELF) @$(APELINK) -o/$(MODE)/tool/build/blinkenlights.com.dbg: \ - $(TOOL_BUILD_DEPS) \ - o/$(MODE)/tool/build/build.pkg \ - o/$(MODE)/tool/build/blinkenlights.o \ - $(CRT) \ - $(APE_NO_MODIFY_SELF) - @$(APELINK) - .PRECIOUS: o/$(MODE)/tool/build/blinkenlights.com o/$(MODE)/tool/build/blinkenlights.com: \ o/$(MODE)/tool/build/blinkenlights.com.dbg \ @@ -104,50 +96,27 @@ o/$(MODE)/tool/build/blinkenlights.com: \ @$(COMPILE) -AZIP -T$@ o/$(MODE)/third_party/zip/zip.com -9qj $@ \ o/$(MODE)/tool/build/.blinkenlights/.symtab -o/$(MODE)/tool/build/ar.com.dbg: \ - $(TOOL_BUILD_DEPS) \ - o/$(MODE)/tool/build/build.pkg \ - o/$(MODE)/tool/build/ar.o \ - $(CRT) \ - $(APE_NO_MODIFY_SELF) - @$(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_NO_MODIFY_SELF) - @$(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_NO_MODIFY_SELF) - @$(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_NO_MODIFY_SELF) - @$(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_NO_MODIFY_SELF) - @$(APELINK) - o/$(MODE)/tool/build/emulator.o: \ OVERRIDE_COPTS += \ -fno-sanitize=pointer-overflow +o/$(MODE)/tool/build/mkdir.zip.o: o/$(MODE)/tool/build/mkdir + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/chmod.zip.o: o/$(MODE)/tool/build/chmod + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/cp.zip.o: o/$(MODE)/tool/build/cp + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/mv.zip.o: o/$(MODE)/tool/build/mv + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/echo.zip.o: o/$(MODE)/tool/build/echo + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/gzip.zip.o: o/$(MODE)/tool/build/gzip + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/printf.zip.o: o/$(MODE)/tool/build/printf + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< +o/$(MODE)/tool/build/dd.zip.o: o/$(MODE)/tool/build/dd + @$(COMPILE) -AZIPOBJ $(ZIPOBJ) $(ZIPOBJ_FLAGS) -0 -B -Pbin $(OUTPUT_OPTION) $< + .PHONY: o/$(MODE)/tool/build o/$(MODE)/tool/build: \ o/$(MODE)/tool/build/emucrt \ diff --git a/tool/build/chmod.c b/tool/build/chmod.c new file mode 100644 index 000000000..04e09343a --- /dev/null +++ b/tool/build/chmod.c @@ -0,0 +1,120 @@ +/*-*- 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 2022 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/calls/calls.h" +#include "libc/calls/struct/dirent.h" +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/ex.h" +#include "libc/sysv/consts/exit.h" +#include "third_party/getopt/getopt.h" + +#define USAGE \ + " OCTAL DST...\n\ +\n\ +SYNOPSIS\n\ +\n\ + Changes File Mode Bits\n\ +\n\ +FLAGS\n\ +\n\ + -?\n\ + -h help\n\ +\n" + +const char *prog; + +wontreturn void PrintUsage(int rc, FILE *f) { + fputs("usage: ", f); + fputs(prog, f); + fputs(USAGE, f); + exit(rc); +} + +void GetOpts(int argc, char *argv[]) { + int opt; + while ((opt = getopt(argc, argv, "?h")) != -1) { + switch (opt) { + case 'h': + case '?': + PrintUsage(EXIT_SUCCESS, stdout); + default: + PrintUsage(EX_USAGE, stderr); + } + } +} + +int main(int argc, char *argv[]) { + int i, mode; + char buf[PATH_MAX]; + + { + printf("curdir %s\n", getcwd(buf, sizeof(buf))); + printf("tmp:"); + struct dirent *e; + DIR *d; + if ((d = opendir("tmp"))) { + while ((e = readdir(d))) { + printf(" %s", e->d_name); + } + closedir(d); + } else { + printf(" dir not found"); + } + printf("\n"); + } + + { + printf("curdir %s\n", getcwd(buf, sizeof(buf))); + printf("bin:"); + struct dirent *e; + DIR *d; + if ((d = opendir("bin"))) { + while ((e = readdir(d))) { + printf(" %s", e->d_name); + } + closedir(d); + } else { + printf(" dir not found"); + } + printf("\n"); + } + + prog = argc > 0 ? argv[0] : "mv.com"; + GetOpts(argc, argv); + if (argc - optind < 2) { + PrintUsage(EX_USAGE, stderr); + } + mode = strtol(argv[optind], 0, 8) & 07777; + for (i = optind + 1; i < argc; ++i) { + if (chmod(argv[i], mode) == -1) { + const char *s = strerdoc(errno); + fputs(prog, stderr); + fputs(": ", stderr); + fputs(argv[i], stderr); + fputs(": ", stderr); + fputs(s, stderr); + fputs("\n", stderr); + exit(1); + } + } + return 0; +} diff --git a/tool/build/dd.c b/tool/build/dd.c new file mode 100644 index 000000000..da1f0a608 --- /dev/null +++ b/tool/build/dd.c @@ -0,0 +1,160 @@ +/*-*- 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 2022 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/safemacros.internal.h" +#include "libc/calls/calls.h" +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/limits.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/o.h" + +char buf[65536]; + +wontreturn void SysFail(const char *func, const char *file) { + int e = errno; + fputs("dd: ", stderr); + fputs(func, stderr); + fputs(" failed: ", stderr); + fputs(file, stderr); + fputs(": ", stderr); + fputs(nulltoempty(strerdoc(e)), stderr); + fputs("\n", stderr); + exit(__COUNTER__ + 1); +} + +int main(int argc, char *argv[]) { + long i; + char *p; + long skip = 0; + long count = LONG_MAX; + long blocksize = 1; + int oflags = O_WRONLY | O_TRUNC | O_CREAT; + const char *infile = "/dev/stdin"; + const char *oufile = "/dev/stdout"; + + for (i = 1; i < argc; ++i) { + + if (argv[i][0] == 'b' && // + argv[i][1] == 's' && // + argv[i][2] == '=') { + blocksize = strtol(argv[i] + 3 + (argv[i][3] == '"'), 0, 10); + if (!(0 < blocksize && blocksize <= sizeof(buf))) { + fputs("dd: bad block size\n", stderr); + return __COUNTER__ + 1; + } + + } else if (argv[i][0] == 'i' && // + argv[i][1] == 'f' && // + argv[i][2] == '=') { + infile = argv[i] + 3 + (argv[i][3] == '"'); + p = strchr(infile, '"'); + if (p) *p = 0; + + } else if (argv[i][0] == 'o' && // + argv[i][1] == 'f' && // + argv[i][2] == '=') { + oufile = argv[i] + 3 + (argv[i][3] == '"'); + p = strchr(infile, '"'); + if (p) *p = 0; + + } else if (argv[i][0] == 's' && // + argv[i][1] == 'k' && // + argv[i][2] == 'i' && // + argv[i][3] == 'p' && // + argv[i][4] == '=') { + count = strtol(argv[i] + 5 + (argv[i][5] == '"'), 0, 10); + if (!(skip < 0)) { + fputs("dd: bad skip\n", stderr); + return __COUNTER__ + 1; + } + + } else if (argv[i][0] == 'c' && // + argv[i][1] == 'o' && // + argv[i][2] == 'u' && // + argv[i][3] == 'n' && // + argv[i][4] == 't' && // + argv[i][5] == '=') { + count = strtol(argv[i] + 6 + (argv[i][6] == '"'), 0, 10); + if (!(count < 0)) { + fputs("dd: bad count\n", stderr); + return __COUNTER__ + 1; + } + + } else if (!strcmp(argv[i], "conv=notrunc")) { + oflags &= ~O_TRUNC; + + } else { + fputs("dd: unrecognized arg: ", stderr); + fputs(argv[i], stderr); + fputs("\n", stderr); + return __COUNTER__ + 1; + } + } + + ssize_t rc; + int fdin, fdout; + + if ((fdin = open(infile, O_RDONLY)) == -1) { + SysFail("open", infile); + } + + if ((fdout = open(oufile, oflags, 0644)) == -1) { + SysFail("open", oufile); + } + + if (skip) { + if (lseek(fdin, skip, SEEK_SET) == -1) { + SysFail("lseek", infile); + } + } + + for (i = 0; i < count; ++i) { + + rc = read(fdin, buf, blocksize); + if (rc == -1) { + SysFail("read", infile); + } + if (rc != blocksize) { + int e = errno; + fputs("dd: failed to read blocksize: ", stderr); + fputs(infile, stderr); + fputs("\n", stderr); + return __COUNTER__ + 1; + } + + rc = write(fdout, buf, blocksize); + if (rc == -1) { + SysFail("write", oufile); + } + if (rc != blocksize) { + int e = errno; + fputs("dd: failed to write blocksize: ", stderr); + fputs(infile, stderr); + fputs("\n", stderr); + return __COUNTER__ + 1; + } + } + + if (close(fdin) == -1) SysFail("close", infile); + if (close(fdout) == -1) SysFail("close", oufile); + + return 0; +} diff --git a/tool/build/mv.c b/tool/build/mv.c new file mode 100644 index 000000000..e7a7e02d6 --- /dev/null +++ b/tool/build/mv.c @@ -0,0 +1,222 @@ +/*-*- 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 2022 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/calls/calls.h" +#include "libc/calls/struct/stat.h" +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/fmt.h" +#include "libc/intrin/kprintf.h" +#include "libc/runtime/gc.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/at.h" +#include "libc/sysv/consts/ex.h" +#include "libc/sysv/consts/exit.h" +#include "libc/sysv/consts/ok.h" +#include "libc/sysv/consts/s.h" +#include "libc/x/x.h" +#include "third_party/getopt/getopt.h" +#include "third_party/musl/ftw.h" + +#define USAGE \ + " SRC... DST\n\ +\n\ +SYNOPSIS\n\ +\n\ + Moves Files\n\ +\n\ +FLAGS\n\ +\n\ + -?\n\ + -h help\n\ + -f force\n\ + -r recursive\n\ +\n" + +bool force; +int striplen; +bool recursive; +const char *prog; +char mkbuf[PATH_MAX]; +char srcdir[PATH_MAX]; +char dstdir[PATH_MAX]; +char srcfile[PATH_MAX]; +char dstfile[PATH_MAX]; +char linkbuf[PATH_MAX]; + +void Mv(char *, char *); + +bool IsDirectory(const char *path) { + int e; + bool res; + struct stat st; + e = errno; + res = stat(path, &st) != -1 && S_ISDIR(st.st_mode); + errno = e; + return res; +} + +bool IsSymlink(const char *path) { + int e; + bool res; + struct stat st; + e = errno; + res = fstatat(AT_FDCWD, path, &st, AT_SYMLINK_NOFOLLOW) != -1 && + S_ISLNK(st.st_mode); + errno = e; + return res; +} + +wontreturn void PrintUsage(int rc, FILE *f) { + fputs("usage: ", f); + fputs(prog, f); + fputs(USAGE, f); + exit(rc); +} + +void GetOpts(int argc, char *argv[]) { + int opt; + while ((opt = getopt(argc, argv, "?hfrR")) != -1) { + switch (opt) { + case 'f': + force = true; + break; + case 'r': + case 'R': + recursive = true; + break; + case 'h': + case '?': + PrintUsage(EXIT_SUCCESS, stdout); + default: + PrintUsage(EX_USAGE, stderr); + } + } +} + +int Visit(const char *fpath, const struct stat *sb, int tflag, + struct FTW *ftwbuf) { + char *src; + strcpy(srcfile, fpath); + src = srcfile + striplen; + strcpy(dstfile, dstdir); + if (!endswith(dstfile, "/")) { + strcat(dstfile, "/"); + } + strcat(dstfile, src); + strcpy(srcfile, fpath); + switch (tflag) { + case FTW_D: + return 0; + case FTW_F: + case FTW_SL: + case FTW_SLN: + Mv(srcfile, dstfile); + return 0; + default: + fputs(fpath, stderr); + fputs(": can't handle file type\n", stderr); + exit(1); + } +} + +char *Join(const char *a, const char *b) { + size_t n, m; + n = strlen(a); + m = strlen(b); + if (n + 1 + m + 1 > sizeof(dstfile)) { + fputs("error: mv: path too long\n", stderr); + exit(1); + } + stpcpy(stpcpy(stpcpy(dstfile, a), "/"), b); + return dstfile; +} + +void Mv(char *src, char *dst) { + ssize_t rc; + const char *s; + if (strlen(src) + 1 > PATH_MAX) _Exit(2); + if (strlen(dst) + 1 > PATH_MAX) _Exit(2); + basename(src); + basename(dst); + if (IsDirectory(src)) { + if (!recursive) { + fputs(prog, stderr); + fputs(": won't move directory without -r flag.\n", stderr); + exit(1); + } + strcpy(dstdir, dst); + if (IsDirectory(dst)) { + strcpy(srcdir, src); + basename(srcdir); + striplen = 0; + strcpy(srcdir, basename(src)); + } else { + strcpy(srcdir, src); + basename(srcdir); + striplen = strlen(srcdir); + strcpy(srcdir, ""); + } + if (nftw(src, Visit, 20, 0) == -1) { + fputs(prog, stderr); + fputs(": nftw failed: ", stderr); + fputs(strerdoc(errno), stderr); + fputs("\n", stderr); + exit(1); + } + return; + } + if (IsDirectory(dst)) { + dst = Join(dst, basename(src)); + } + if (!force && access(dst, W_OK) == -1 && errno != ENOENT) goto OnFail; + strcpy(mkbuf, dst); + if (makedirs(dirname(mkbuf), 0755) == -1) goto OnFail; + if (IsSymlink(src)) { + if ((rc = readlink(src, linkbuf, sizeof(linkbuf) - 1)) == -1) goto OnFail; + linkbuf[rc] = 0; + if (symlink(linkbuf, dst) == -1) goto OnFail; + } else { + if (rename(src, dst) == -1) goto OnFail; + } + return; +OnFail: + s = strerdoc(errno); + fputs(prog, stderr); + fputs(": ", stderr); + fputs(src, stderr); + fputs(" ", stderr); + fputs(dst, stderr); + fputs(": ", stderr); + fputs(s, stderr); + fputs("\n", stderr); + exit(1); +} + +int main(int argc, char *argv[]) { + int i; + prog = argc > 0 ? argv[0] : "mv.com"; + GetOpts(argc, argv); + if (argc - optind < 2) PrintUsage(EX_USAGE, stderr); + for (i = optind; i < argc - 1; ++i) { + Mv(argv[i], argv[argc - 1]); + } + return 0; +} diff --git a/test/libc/stdio/system_test.c b/tool/build/ocat.c similarity index 52% rename from test/libc/stdio/system_test.c rename to tool/build/ocat.c index 93acaeae5..068362c13 100644 --- a/test/libc/stdio/system_test.c +++ b/tool/build/ocat.c @@ -1,7 +1,7 @@ /*-*- 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 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2022 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 │ @@ -17,16 +17,63 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" -#include "libc/stdio/stdio.h" -#include "libc/testlib/testlib.h" +#include "libc/errno.h" +#include "libc/fmt/itoa.h" +#include "libc/mem/io.h" +#include "libc/runtime/runtime.h" +#include "libc/str/str.h" +#include "libc/sysv/consts/ex.h" +#include "libc/sysv/consts/o.h" +#include "third_party/getopt/getopt.h" -TEST(system, nullParam_testsIfSystemHasShell) { - ASSERT_EQ(true, system(NULL)); +char buf[512]; + +static void Write(const char *s, ...) { + va_list va; + va_start(va, s); + do { + write(2, s, strlen(s)); + } while ((s = va_arg(va, const char *))); + va_end(va); } -TEST(system, test) { - int rc; - rc = system("exit 42"); - ASSERT_NE(-1, rc); - ASSERT_EQ(42, WEXITSTATUS(rc)); +wontreturn void SysExit(int rc, const char *call, const char *thing) { + int err; + char ibuf[12]; + const char *estr; + err = errno; + FormatInt32(ibuf, err); + estr = strerdoc(err); + if (!estr) estr = "EUNKNOWN"; + Write(thing, ": ", call, "() failed: ", estr, " (", ibuf, ")\n", 0); + exit(rc); +} + +int main(int argc, char *argv[]) { + int i, opt; + const char *outpath = "/dev/stdout"; + while ((opt = getopt(argc, argv, "o:")) != -1) { + switch (opt) { + case 'o': + outpath = optarg; + break; + default: + return 1; + } + } + int out = open(outpath, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (out == -1) SysExit(2, "open", outpath); + for (i = optind; i < argc; ++i) { + int in = open(argv[i], O_RDONLY); + if (in == -1) SysExit(3, "open", argv[i]); + for (;;) { + ssize_t rc = read(in, buf, 512); + if (rc == -1) SysExit(3, "read", argv[i]); + if (!rc) break; + ssize_t rc2 = write(out, buf, rc); + if (rc2 != rc) SysExit(4, "write", outpath); + } + if (close(in) == -1) SysExit(5, "close", argv[i]); + } + if (close(out) == -1) SysExit(6, "close", outpath); } diff --git a/tool/build/pledge.c b/tool/build/pledge.c index 45287c3e3..af855f904 100644 --- a/tool/build/pledge.c +++ b/tool/build/pledge.c @@ -445,7 +445,7 @@ void ApplyFilesystemPolicy(unsigned long ipromises) { } if (~ipromises & (1ul << PROMISE_TTY)) { - UnveilIfExists(ttyname(0), "rw"); // 1-up apparmor + UnveilIfExists(ttyname(0), "rw"); UnveilIfExists("/etc/tty", "rw"); UnveilIfExists("/etc/console", "rw"); UnveilIfExists("/usr/share/terminfo", "r"); diff --git a/tool/build/printf.c b/tool/build/printf.c new file mode 100644 index 000000000..bc3293b52 --- /dev/null +++ b/tool/build/printf.c @@ -0,0 +1,128 @@ +/*-*- 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 2022 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/intrin/kprintf.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" + +static bool isoctal(char c) { + return '0' <= c && c <= '7'; +} + +char *U(char *p) { + int c, i = 0, j = 0; + for (;;) { + switch ((c = p[i++] & 255)) { + case '\\': + switch ((c = p[i++] & 255)) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + if (isoctal(p[i])) { + if (isoctal(p[i + 1])) { + p[j++] = (c - '0') << 6 | (p[i] - '0') << 3 | (p[i + 1] - '0'); + i += 2; + continue; + } else { + p[j++] = (c - '0') << 3 | (p[i++] - '0'); + continue; + } + } else { + p[j++] = (c - '0'); + continue; + } + case '\\': + p[j++] = '\\'; + continue; + case 'a': + p[j++] = '\a'; + continue; + case 'b': + p[j++] = '\b'; + continue; + case 't': + p[j++] = '\t'; + continue; + case 'f': + p[j++] = '\f'; + continue; + case 'v': + p[j++] = '\v'; + continue; + case 'e': + p[j++] = '\e'; + continue; + case 'r': + p[j++] = '\r'; + continue; + case 'n': + p[j++] = '\n'; + continue; + case '"': + p[j++] = '"'; + continue; + case '\'': + p[j++] = '\''; + continue; + } + // fallthrough + default: + p[j++] = c; + break; + case '\0': + p[j] = 0; + return p; + } + } +} + +int main(int argc, char *argv[]) { + switch (argc) { + case 2: + printf(U(argv[1])); + return 0; + case 3: + printf(U(argv[1]), argv[2]); + return 0; + case 4: + printf(U(argv[1]), argv[2], argv[3]); + return 0; + case 5: + printf(U(argv[1]), argv[2], argv[3], argv[4]); + return 0; + case 6: + printf(U(argv[1]), argv[2], argv[3], argv[4], argv[5]); + return 0; + case 7: + printf(U(argv[1]), argv[2], argv[3], argv[4], argv[5], argv[6]); + return 0; + case 8: + printf(U(argv[1]), argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); + return 0; + default: + if (argc > 0) { + fprintf(stderr, "%s: %s format [arguments]\n", argv[0], argv[0]); + } + return 1; + } +} diff --git a/tool/net/net.mk b/tool/net/net.mk index 3c8af7115..8bf5448bd 100644 --- a/tool/net/net.mk +++ b/tool/net/net.mk @@ -308,9 +308,6 @@ o/$(MODE)/tool/net/redbean-static.com.dbg: \ $(APE_NO_MODIFY_SELF) @$(APELINK) -o/$(MODE)/tool/net/redbean-static.o: tool/net/redbean.c o/$(MODE)/tool/net/redbean.o - @$(COMPILE) -AOBJECTIFY.c $(OBJECTIFY.c) -DSTATIC -DREDBEAN=\"redbean-static\" $(OUTPUT_OPTION) $< - # REDBEAN-UNSECURE.COM # # Passing the -DUNSECURE will cause the TLS security code to be removed. @@ -350,9 +347,6 @@ o/$(MODE)/tool/net/redbean-unsecure.com.dbg: \ $(APE_NO_MODIFY_SELF) @$(APELINK) -o/$(MODE)/tool/net/redbean-unsecure.o: tool/net/redbean.c o/$(MODE)/tool/net/redbean.o - @$(COMPILE) -AOBJECTIFY.c $(OBJECTIFY.c) -DUNSECURE -DREDBEAN=\"redbean-unsecure\" $(OUTPUT_OPTION) $< - # REDBEAN-ORIGINAL.COM # # Passing the -DSTATIC and -DUNSECURE flags together w/ MODE=tiny will @@ -414,12 +408,6 @@ o/$(MODE)/tool/net/redbean-original.com.dbg: \ $(APE_NO_MODIFY_SELF) @$(APELINK) -o/$(MODE)/tool/net/redbean-original.o: tool/net/redbean.c o/$(MODE)/tool/net/redbean.o - @$(COMPILE) -AOBJECTIFY.c $(OBJECTIFY.c) -DSTATIC -DUNSECURE -DREDBEAN=\"redbean-original\" $(OUTPUT_OPTION) $< - -o/$(MODE)/tool/net/redbean-original.s: tool/net/redbean.c o/$(MODE)/tool/net/redbean.o - @$(COMPILE) -AOBJECTIFY.c $(COMPILE.c) -DSTATIC -DUNSECURE -DREDBEAN=\"redbean-original\" $(OUTPUT_OPTION) $< - .PHONY: o/$(MODE)/tool/net o/$(MODE)/tool/net: \ $(TOOL_NET_BINS) \ diff --git a/tool/net/redbean-original.c b/tool/net/redbean-original.c new file mode 100644 index 000000000..d2d3fd2db --- /dev/null +++ b/tool/net/redbean-original.c @@ -0,0 +1,4 @@ +#define STATIC +#define UNSECURE +#define REDBEAN "redbean-original" +#include "tool/net/redbean.c" diff --git a/tool/net/redbean-static.c b/tool/net/redbean-static.c new file mode 100644 index 000000000..7fd491bc2 --- /dev/null +++ b/tool/net/redbean-static.c @@ -0,0 +1,3 @@ +#define STATIC +#define REDBEAN "redbean-static" +#include "tool/net/redbean.c" diff --git a/tool/net/redbean-unsecure.c b/tool/net/redbean-unsecure.c new file mode 100644 index 000000000..e2b2edc9f --- /dev/null +++ b/tool/net/redbean-unsecure.c @@ -0,0 +1,3 @@ +#define UNSECURE +#define REDBEAN "redbean-unsecure" +#include "tool/net/redbean.c"