mirror of
https://github.com/urbit/vere.git
synced 2024-09-11 11:55:31 +03:00
Remove lingering artifacts from old build system (#144)
Co-authored-by: Peter McEvoy <git@mcevoypeter.com>
This commit is contained in:
parent
ef4af8d4f6
commit
09e4753883
31
Makefile
31
Makefile
@ -1,31 +0,0 @@
|
|||||||
.PHONY: build build-all install cross release test pills ropsten-pills clean
|
|
||||||
|
|
||||||
build:
|
|
||||||
nix-build -A urbit --no-out-link
|
|
||||||
|
|
||||||
install:
|
|
||||||
nix-env -f . -iA urbit
|
|
||||||
|
|
||||||
release:
|
|
||||||
sh/release
|
|
||||||
|
|
||||||
test:
|
|
||||||
nix-build -A urbit-tests --no-out-link
|
|
||||||
|
|
||||||
pills:
|
|
||||||
sh/update-solid-pill
|
|
||||||
sh/update-brass-pill
|
|
||||||
sh/update-ivory-pill
|
|
||||||
|
|
||||||
ropsten-pills:
|
|
||||||
sh/create-ropsten-pills
|
|
||||||
|
|
||||||
interface:
|
|
||||||
sh/build-interface
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf ./out ./work
|
|
||||||
rm -f result result-*
|
|
||||||
|
|
||||||
fmt:
|
|
||||||
sh/fmt
|
|
1090
doc/spec/flw.txt
1090
doc/spec/flw.txt
File diff suppressed because it is too large
Load Diff
6
pkg/urbit/.gitattributes
vendored
6
pkg/urbit/.gitattributes
vendored
@ -1,6 +0,0 @@
|
|||||||
.gitignore export-ignore
|
|
||||||
.gitattributes export-ignore
|
|
||||||
tests export-ignore
|
|
||||||
hashtable_tests export-ignore
|
|
||||||
shell.nix export-ignore
|
|
||||||
*.patch -text
|
|
10
pkg/urbit/.gitignore
vendored
10
pkg/urbit/.gitignore
vendored
@ -1,10 +0,0 @@
|
|||||||
# Configuration Result
|
|
||||||
/config.mk
|
|
||||||
/include/config.h
|
|
||||||
/include/ca-bundle.h
|
|
||||||
/include/ivory.h
|
|
||||||
|
|
||||||
# indexing
|
|
||||||
/.cache/
|
|
||||||
compile_commands.json
|
|
||||||
tags
|
|
@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Urbit
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
@ -1,95 +0,0 @@
|
|||||||
include config.mk
|
|
||||||
compat_mks := $(foreach dir,$(compat),$(wildcard compat/$(dir)/*.mk))
|
|
||||||
include $(compat_mks)
|
|
||||||
|
|
||||||
jets = jets/tree.c $(wildcard jets/*/*.c)
|
|
||||||
noun = $(wildcard noun/*.c)
|
|
||||||
ur = $(wildcard ur/*.c)
|
|
||||||
vere = $(wildcard vere/*.c) $(wildcard vere/*/*.c)
|
|
||||||
daemon = $(wildcard daemon/*.c)
|
|
||||||
worker = $(wildcard worker/*.c)
|
|
||||||
tests = $(wildcard tests/*.c)
|
|
||||||
bench = $(wildcard bench/*.c)
|
|
||||||
|
|
||||||
compat := $(foreach dir,$(compat),$(wildcard compat/$(dir)/*.c))
|
|
||||||
|
|
||||||
common = $(jets) $(noun) $(ur) $(vere) $(compat)
|
|
||||||
headers = $(shell find include -type f)
|
|
||||||
|
|
||||||
common_objs = $(shell echo $(common) | sed 's/\.c/.o/g')
|
|
||||||
daemon_objs = $(shell echo $(daemon) | sed 's/\.c/.o/g')
|
|
||||||
worker_objs = $(shell echo $(worker) | sed 's/\.c/.o/g')
|
|
||||||
|
|
||||||
all_objs = $(common_objs) $(daemon_objs) $(worker_objs)
|
|
||||||
all_srcs = $(common) $(daemon) $(worker)
|
|
||||||
|
|
||||||
test_exes = $(shell echo $(tests) | sed 's/tests\//.\/build\//g' | sed 's/\.c//g')
|
|
||||||
bench_exes = $(shell echo $(bench) | sed 's/bench\//.\/build\//g' | sed 's/\.c//g')
|
|
||||||
all_exes = $(test_exes) $(bench_exes) ./build/urbit
|
|
||||||
|
|
||||||
# -Werror promotes all warnings that are enabled into errors (this is on)
|
|
||||||
# -Wall issues all types of errors. This is off (for now)
|
|
||||||
CFLAGS := $(CFLAGS)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
.PHONY: all bench test clean mrproper
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
all: $(all_exes)
|
|
||||||
|
|
||||||
test: $(test_exes)
|
|
||||||
@FAIL=0; \
|
|
||||||
for x in $^; \
|
|
||||||
do echo $$'\n'"$$x" && ./$$x; \
|
|
||||||
if [ $$? != 0 ]; then FAIL=1; fi; \
|
|
||||||
done; \
|
|
||||||
if [ $$FAIL != 0 ]; then echo "\n" && exit 1; fi;
|
|
||||||
|
|
||||||
bench: $(bench_exes)
|
|
||||||
build/ur_bench
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f ./tags $(all_objs) $(all_exes)
|
|
||||||
|
|
||||||
mrproper: clean
|
|
||||||
rm -f config.mk include/config.h compile_commands.json
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
build/ur_bench: $(common_objs) bench/ur_bench.o
|
|
||||||
@echo CC -o $@
|
|
||||||
@mkdir -p ./build
|
|
||||||
@$(CC) $^ $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
build/%_tests: $(common_objs) tests/%_tests.o
|
|
||||||
@echo CC -o $@
|
|
||||||
@mkdir -p ./build
|
|
||||||
@$(CC) $^ $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
build/urbit: $(common_objs) $(daemon_objs) $(worker_objs)
|
|
||||||
@echo CC -o $@
|
|
||||||
@mkdir -p ./build
|
|
||||||
@$(CC) $^ $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
# CCDEPS and CCEXTRA are empty except in MingW build,
|
|
||||||
# which uses them to inject a C source transform step
|
|
||||||
%.o: %.c $(headers) $(CCDEPS)
|
|
||||||
@echo CC $<
|
|
||||||
@$(CC) -I./include $(CFLAGS) $< $(CCEXTRA) -c -o $@
|
|
||||||
|
|
||||||
tags: $(all_srcs) $(headers)
|
|
||||||
ctags $^
|
|
||||||
|
|
||||||
compile_commands.json: Makefile config.mk $(compat_mks)
|
|
||||||
@echo "[" > $@ && sep= && \
|
|
||||||
for src in $(all_srcs); do \
|
|
||||||
echo "$$sep{" >> $@; \
|
|
||||||
printf '"directory": "%s",\n' $$(pwd) >> $@; \
|
|
||||||
printf '"command": "%s",\n' "$(CC) -I./include $(CFLAGS) $$src $(CCEXTRA) -c" >> $@; \
|
|
||||||
printf '"file": "%s",\n' $$src >> $@; \
|
|
||||||
echo "}" >> $@; \
|
|
||||||
sep=','; \
|
|
||||||
done && \
|
|
||||||
echo "]" >> $@
|
|
@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# support running off a tarball that doesn't contain binary pills
|
|
||||||
(( $($1 ../../bin/ivory.pill) > 512 )) || curl -L https://github.com/urbit/urbit/raw/urbit-v$URBIT_VERSION/bin/ivory.pill > ../../bin/ivory.pill
|
|
||||||
|
|
||||||
poor_mans_xxd () {
|
|
||||||
cch=0
|
|
||||||
echo "unsigned char $2[] = {"
|
|
||||||
while IFS='' read line
|
|
||||||
do
|
|
||||||
for i in $line
|
|
||||||
do
|
|
||||||
echo -n " 0x$i,"
|
|
||||||
cch=$((cch+1))
|
|
||||||
done
|
|
||||||
echo
|
|
||||||
done < <(od -An -v -tx1 $1)
|
|
||||||
echo "};"
|
|
||||||
echo "unsigned int $2_len = $cch;"
|
|
||||||
}
|
|
||||||
|
|
||||||
[ -e include/ca-bundle.h ] || poor_mans_xxd $2 include_ca_bundle_crt >include/ca-bundle.h
|
|
||||||
[ -e include/ivory_impl.h ] || poor_mans_xxd ../../bin/ivory.pill u3_Ivory_pill >include/ivory_impl.h
|
|
@ -1,14 +0,0 @@
|
|||||||
# paths to brew packages
|
|
||||||
CFLAGS := $(CFLAGS) -I/opt/homebrew/include
|
|
||||||
LDFLAGS := $(LDFLAGS) -L/opt/homebrew/lib
|
|
||||||
# force linker to use static libraries
|
|
||||||
LDFLAGS := $(shell compat/m1brew/use-static-libs.sh $(LDFLAGS))
|
|
||||||
# add extra osx libraries
|
|
||||||
LDFLAGS := $(LDFLAGS) -framework SystemConfiguration
|
|
||||||
|
|
||||||
ifdef debug
|
|
||||||
CFLAGS := $(CFLAGS) -O0 -g
|
|
||||||
else
|
|
||||||
# clang hangs on noun/allocate.c if -g is specified with -O3
|
|
||||||
CFLAGS := $(CFLAGS) -O3
|
|
||||||
endif
|
|
@ -1,12 +0,0 @@
|
|||||||
diff --git a/configure b/configure
|
|
||||||
--- a/configure
|
|
||||||
+++ b/configure
|
|
||||||
@@ -15,7 +15,7 @@ do
|
|
||||||
log "Trying IMPL=$IMPL"
|
|
||||||
|
|
||||||
if IMPL=$impl make >/dev/null 2>/dev/null
|
|
||||||
- then sed -i 's|$(error IMPL must be set)|IMPL='"$impl"'|' Makefile
|
|
||||||
+ then sed -i "" 's|$(error IMPL must be set)|IMPL='"$impl"'|' Makefile
|
|
||||||
log "IMPL=$IMPL works"
|
|
||||||
exit 0
|
|
||||||
else log "IMPL=$IMPL failed"
|
|
@ -1,13 +0,0 @@
|
|||||||
diff --git a/makefile b/makefile
|
|
||||||
--- a/makefile
|
|
||||||
+++ b/makefile
|
|
||||||
@@ -12,5 +12,9 @@ shared: murmur3.c murmur3.h
|
|
||||||
$(CC) -fPIC -O3 -c murmur3.c
|
|
||||||
$(CC) -shared -Wl,--export-dynamic murmur3.o -o libmurmur3.so
|
|
||||||
|
|
||||||
+static: murmur3.c murmur3.h
|
|
||||||
+ $(CC) -fPIC -O3 -c murmur3.c
|
|
||||||
+ $(AR) rcs libmurmur3.a murmur3.o
|
|
||||||
+
|
|
||||||
clean:
|
|
||||||
rm -rf example *.o *.so
|
|
@ -1,85 +0,0 @@
|
|||||||
diff --git a/build/template-FAST_INT64/Makefile b/build/template-FAST_INT64/Makefile
|
|
||||||
--- a/build/template-FAST_INT64/Makefile
|
|
||||||
+++ b/build/template-FAST_INT64/Makefile
|
|
||||||
@@ -34,28 +34,27 @@
|
|
||||||
#
|
|
||||||
#=============================================================================
|
|
||||||
|
|
||||||
-# Edit lines marked with `==>'. See "SoftFloat-source.html".
|
|
||||||
+SOURCE_DIR ?= ../../source
|
|
||||||
+SPECIALIZE_TYPE ?= 8086-SSE
|
|
||||||
|
|
||||||
-==> SOURCE_DIR ?= ../../source
|
|
||||||
-==> SPECIALIZE_TYPE ?= 8086
|
|
||||||
+SOFTFLOAT_OPTS ?= \
|
|
||||||
+ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
|
|
||||||
+ -DSOFTFLOAT_FAST_DIV64TO32
|
|
||||||
|
|
||||||
-==> SOFTFLOAT_OPTS ?= \
|
|
||||||
-==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
|
|
||||||
-==> -DSOFTFLOAT_FAST_DIV64TO32
|
|
||||||
+DELETE = rm -f
|
|
||||||
+C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
|
||||||
+COMPILE_C = \
|
|
||||||
+ cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
|
||||||
+MAKELIB = ar crs $@
|
|
||||||
+LIBNAME = libsoftfloat3
|
|
||||||
|
|
||||||
-==> DELETE = rm -f
|
|
||||||
-==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
|
||||||
-==> COMPILE_C = \
|
|
||||||
-==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
|
||||||
-==> MAKELIB = ar crs $@
|
|
||||||
+OBJ = .o
|
|
||||||
+LIB = .a
|
|
||||||
|
|
||||||
-==> OBJ = .o
|
|
||||||
-==> LIB = .a
|
|
||||||
-
|
|
||||||
-==> OTHER_HEADERS =
|
|
||||||
+OTHER_HEADERS =
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
-all: softfloat$(LIB)
|
|
||||||
+all: $(LIBNAME)$(LIB)
|
|
||||||
|
|
||||||
OBJS_PRIMITIVES = \
|
|
||||||
s_eq128$(OBJ) \
|
|
||||||
@@ -381,11 +380,11 @@ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
|
|
||||||
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
|
|
||||||
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
|
|
||||||
|
|
||||||
-softfloat$(LIB): $(OBJS_ALL)
|
|
||||||
+$(LIBNAME)$(LIB): $(OBJS_ALL)
|
|
||||||
$(DELETE) $@
|
|
||||||
$(MAKELIB) $^
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
- $(DELETE) $(OBJS_ALL) softfloat$(LIB)
|
|
||||||
+ $(DELETE) $(OBJS_ALL) $(LIBNAME)$(LIB)
|
|
||||||
|
|
||||||
diff --git a/build/template-FAST_INT64/platform.h b/build/template-FAST_INT64/platform.h
|
|
||||||
--- a/build/template-FAST_INT64/platform.h
|
|
||||||
+++ b/build/template-FAST_INT64/platform.h
|
|
||||||
@@ -34,17 +34,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
=============================================================================*/
|
|
||||||
|
|
||||||
-// Edit lines marked with `==>'. See "SoftFloat-source.html".
|
|
||||||
-
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
-==> #define LITTLEENDIAN 1
|
|
||||||
+#define LITTLEENDIAN 1
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
-==> #define INLINE inline
|
|
||||||
+#define INLINE inline
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
-==> #define THREAD_LOCAL _Thread_local
|
|
||||||
+#define THREAD_LOCAL _Thread_local
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
declare -a ldirs
|
|
||||||
for i in $@
|
|
||||||
do
|
|
||||||
case $i in
|
|
||||||
-L*) ldirs+=(${i:2});;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
for i in $@
|
|
||||||
do
|
|
||||||
case $i in
|
|
||||||
-l*)
|
|
||||||
lib=$(find ${ldirs[@]} -name lib${i:2}.a)
|
|
||||||
if [ "$lib" != "" ]
|
|
||||||
then
|
|
||||||
echo $lib
|
|
||||||
else
|
|
||||||
echo $i
|
|
||||||
fi;;
|
|
||||||
*) echo $i;;
|
|
||||||
esac
|
|
||||||
done
|
|
@ -1,377 +0,0 @@
|
|||||||
#include "c/portable.h"
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/utime.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
// set default CRT file mode to binary
|
|
||||||
// note that mingw binmode.o does nothing
|
|
||||||
#undef _fmode
|
|
||||||
int _fmode = _O_BINARY;
|
|
||||||
|
|
||||||
// set standard I/O fds to binary too, because
|
|
||||||
// MSVCRT creates them before MingW sets _fmode
|
|
||||||
static void __attribute__ ((constructor)) _set_stdio_to_binary()
|
|
||||||
{
|
|
||||||
_setmode(0, _O_BINARY);
|
|
||||||
_setmode(1, _O_BINARY);
|
|
||||||
_setmode(2, _O_BINARY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// from https://github.com/git/git/blob/master/compat/mingw.c
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
int err_win_to_posix(DWORD winerr)
|
|
||||||
{
|
|
||||||
int error = ENOSYS;
|
|
||||||
switch(winerr) {
|
|
||||||
case ERROR_ACCESS_DENIED: error = EACCES; break;
|
|
||||||
case ERROR_ACCOUNT_DISABLED: error = EACCES; break;
|
|
||||||
case ERROR_ACCOUNT_RESTRICTION: error = EACCES; break;
|
|
||||||
case ERROR_ALREADY_ASSIGNED: error = EBUSY; break;
|
|
||||||
case ERROR_ALREADY_EXISTS: error = EEXIST; break;
|
|
||||||
case ERROR_ARITHMETIC_OVERFLOW: error = ERANGE; break;
|
|
||||||
case ERROR_BAD_COMMAND: error = EIO; break;
|
|
||||||
case ERROR_BAD_DEVICE: error = ENODEV; break;
|
|
||||||
case ERROR_BAD_DRIVER_LEVEL: error = ENXIO; break;
|
|
||||||
case ERROR_BAD_EXE_FORMAT: error = ENOEXEC; break;
|
|
||||||
case ERROR_BAD_FORMAT: error = ENOEXEC; break;
|
|
||||||
case ERROR_BAD_LENGTH: error = EINVAL; break;
|
|
||||||
case ERROR_BAD_PATHNAME: error = ENOENT; break;
|
|
||||||
case ERROR_BAD_PIPE: error = EPIPE; break;
|
|
||||||
case ERROR_BAD_UNIT: error = ENODEV; break;
|
|
||||||
case ERROR_BAD_USERNAME: error = EINVAL; break;
|
|
||||||
case ERROR_BROKEN_PIPE: error = EPIPE; break;
|
|
||||||
case ERROR_BUFFER_OVERFLOW: error = ENAMETOOLONG; break;
|
|
||||||
case ERROR_BUSY: error = EBUSY; break;
|
|
||||||
case ERROR_BUSY_DRIVE: error = EBUSY; break;
|
|
||||||
case ERROR_CALL_NOT_IMPLEMENTED: error = ENOSYS; break;
|
|
||||||
case ERROR_CANNOT_MAKE: error = EACCES; break;
|
|
||||||
case ERROR_CANTOPEN: error = EIO; break;
|
|
||||||
case ERROR_CANTREAD: error = EIO; break;
|
|
||||||
case ERROR_CANTWRITE: error = EIO; break;
|
|
||||||
case ERROR_CRC: error = EIO; break;
|
|
||||||
case ERROR_CURRENT_DIRECTORY: error = EACCES; break;
|
|
||||||
case ERROR_DEVICE_IN_USE: error = EBUSY; break;
|
|
||||||
case ERROR_DEV_NOT_EXIST: error = ENODEV; break;
|
|
||||||
case ERROR_DIRECTORY: error = EINVAL; break;
|
|
||||||
case ERROR_DIR_NOT_EMPTY: error = ENOTEMPTY; break;
|
|
||||||
case ERROR_DISK_CHANGE: error = EIO; break;
|
|
||||||
case ERROR_DISK_FULL: error = ENOSPC; break;
|
|
||||||
case ERROR_DRIVE_LOCKED: error = EBUSY; break;
|
|
||||||
case ERROR_ENVVAR_NOT_FOUND: error = EINVAL; break;
|
|
||||||
case ERROR_EXE_MARKED_INVALID: error = ENOEXEC; break;
|
|
||||||
case ERROR_FILENAME_EXCED_RANGE: error = ENAMETOOLONG; break;
|
|
||||||
case ERROR_FILE_EXISTS: error = EEXIST; break;
|
|
||||||
case ERROR_FILE_INVALID: error = ENODEV; break;
|
|
||||||
case ERROR_FILE_NOT_FOUND: error = ENOENT; break;
|
|
||||||
case ERROR_GEN_FAILURE: error = EIO; break;
|
|
||||||
case ERROR_HANDLE_DISK_FULL: error = ENOSPC; break;
|
|
||||||
case ERROR_INSUFFICIENT_BUFFER: error = ENOMEM; break;
|
|
||||||
case ERROR_INVALID_ACCESS: error = EACCES; break;
|
|
||||||
case ERROR_INVALID_ADDRESS: error = EFAULT; break;
|
|
||||||
case ERROR_INVALID_BLOCK: error = EFAULT; break;
|
|
||||||
case ERROR_INVALID_DATA: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_DRIVE: error = ENODEV; break;
|
|
||||||
case ERROR_INVALID_EXE_SIGNATURE: error = ENOEXEC; break;
|
|
||||||
case ERROR_INVALID_FLAGS: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_FUNCTION: error = ENOSYS; break;
|
|
||||||
case ERROR_INVALID_HANDLE: error = EBADF; break;
|
|
||||||
case ERROR_INVALID_LOGON_HOURS: error = EACCES; break;
|
|
||||||
case ERROR_INVALID_NAME: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_OWNER: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_PARAMETER: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_PASSWORD: error = EPERM; break;
|
|
||||||
case ERROR_INVALID_PRIMARY_GROUP: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_SIGNAL_NUMBER: error = EINVAL; break;
|
|
||||||
case ERROR_INVALID_TARGET_HANDLE: error = EIO; break;
|
|
||||||
case ERROR_INVALID_WORKSTATION: error = EACCES; break;
|
|
||||||
case ERROR_IO_DEVICE: error = EIO; break;
|
|
||||||
case ERROR_IO_INCOMPLETE: error = EINTR; break;
|
|
||||||
case ERROR_LOCKED: error = EBUSY; break;
|
|
||||||
case ERROR_LOCK_VIOLATION: error = EACCES; break;
|
|
||||||
case ERROR_LOGON_FAILURE: error = EACCES; break;
|
|
||||||
case ERROR_MAPPED_ALIGNMENT: error = EINVAL; break;
|
|
||||||
case ERROR_META_EXPANSION_TOO_LONG: error = E2BIG; break;
|
|
||||||
case ERROR_MORE_DATA: error = EPIPE; break;
|
|
||||||
case ERROR_NEGATIVE_SEEK: error = ESPIPE; break;
|
|
||||||
case ERROR_NOACCESS: error = EFAULT; break;
|
|
||||||
case ERROR_NONE_MAPPED: error = EINVAL; break;
|
|
||||||
case ERROR_NOT_ENOUGH_MEMORY: error = ENOMEM; break;
|
|
||||||
case ERROR_NOT_READY: error = EAGAIN; break;
|
|
||||||
case ERROR_NOT_SAME_DEVICE: error = EXDEV; break;
|
|
||||||
case ERROR_NO_DATA: error = EPIPE; break;
|
|
||||||
case ERROR_NO_MORE_SEARCH_HANDLES: error = EIO; break;
|
|
||||||
case ERROR_NO_PROC_SLOTS: error = EAGAIN; break;
|
|
||||||
case ERROR_NO_SUCH_PRIVILEGE: error = EACCES; break;
|
|
||||||
case ERROR_OPEN_FAILED: error = EIO; break;
|
|
||||||
case ERROR_OPEN_FILES: error = EBUSY; break;
|
|
||||||
case ERROR_OPERATION_ABORTED: error = EINTR; break;
|
|
||||||
case ERROR_OUTOFMEMORY: error = ENOMEM; break;
|
|
||||||
case ERROR_PASSWORD_EXPIRED: error = EACCES; break;
|
|
||||||
case ERROR_PATH_BUSY: error = EBUSY; break;
|
|
||||||
case ERROR_PATH_NOT_FOUND: error = ENOENT; break;
|
|
||||||
case ERROR_PIPE_BUSY: error = EBUSY; break;
|
|
||||||
case ERROR_PIPE_CONNECTED: error = EPIPE; break;
|
|
||||||
case ERROR_PIPE_LISTENING: error = EPIPE; break;
|
|
||||||
case ERROR_PIPE_NOT_CONNECTED: error = EPIPE; break;
|
|
||||||
case ERROR_PRIVILEGE_NOT_HELD: error = EACCES; break;
|
|
||||||
case ERROR_READ_FAULT: error = EIO; break;
|
|
||||||
case ERROR_SEEK: error = EIO; break;
|
|
||||||
case ERROR_SEEK_ON_DEVICE: error = ESPIPE; break;
|
|
||||||
case ERROR_SHARING_BUFFER_EXCEEDED: error = ENFILE; break;
|
|
||||||
case ERROR_SHARING_VIOLATION: error = EACCES; break;
|
|
||||||
case ERROR_STACK_OVERFLOW: error = ENOMEM; break;
|
|
||||||
case ERROR_SUCCESS: error = 0; break;
|
|
||||||
case ERROR_SWAPERROR: error = ENOENT; break;
|
|
||||||
case ERROR_TOO_MANY_MODULES: error = EMFILE; break;
|
|
||||||
case ERROR_TOO_MANY_OPEN_FILES: error = EMFILE; break;
|
|
||||||
case ERROR_UNRECOGNIZED_MEDIA: error = ENXIO; break;
|
|
||||||
case ERROR_UNRECOGNIZED_VOLUME: error = ENODEV; break;
|
|
||||||
case ERROR_WAIT_NO_CHILDREN: error = ECHILD; break;
|
|
||||||
case ERROR_WRITE_FAULT: error = EIO; break;
|
|
||||||
case ERROR_WRITE_PROTECT: error = EROFS; break;
|
|
||||||
}
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
int link(const char *path1, const char *path2)
|
|
||||||
{
|
|
||||||
if ( CreateHardLinkA(path2, path1, NULL) ) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// from msys2 mingw-packages-dev patches
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
static DWORD __map_mmap_prot_page(const int prot)
|
|
||||||
{
|
|
||||||
DWORD protect = 0;
|
|
||||||
|
|
||||||
if (prot == PROT_NONE)
|
|
||||||
return protect;
|
|
||||||
|
|
||||||
if ((prot & PROT_EXEC) != 0)
|
|
||||||
{
|
|
||||||
protect = ((prot & PROT_WRITE) != 0) ?
|
|
||||||
PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
protect = ((prot & PROT_WRITE) != 0) ?
|
|
||||||
PAGE_READWRITE : PAGE_READONLY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return protect;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DWORD __map_mmap_prot_file(const int prot)
|
|
||||||
{
|
|
||||||
DWORD desiredAccess = 0;
|
|
||||||
|
|
||||||
if (prot == PROT_NONE)
|
|
||||||
return desiredAccess;
|
|
||||||
|
|
||||||
if ((prot & PROT_READ) != 0)
|
|
||||||
desiredAccess |= FILE_MAP_READ;
|
|
||||||
if ((prot & PROT_WRITE) != 0)
|
|
||||||
desiredAccess |= FILE_MAP_WRITE;
|
|
||||||
if ((prot & PROT_EXEC) != 0)
|
|
||||||
desiredAccess |= FILE_MAP_EXECUTE;
|
|
||||||
|
|
||||||
return desiredAccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
|
|
||||||
{
|
|
||||||
HANDLE fm, h;
|
|
||||||
|
|
||||||
void * map = MAP_FAILED;
|
|
||||||
|
|
||||||
const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ?
|
|
||||||
(DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
|
|
||||||
const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
|
|
||||||
(DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
|
|
||||||
const DWORD protect = __map_mmap_prot_page(prot);
|
|
||||||
const DWORD desiredAccess = __map_mmap_prot_file(prot);
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
if (len == 0
|
|
||||||
/* Usupported protection combinations */
|
|
||||||
|| prot == PROT_EXEC)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return MAP_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((flags & MAP_ANON) == 0)
|
|
||||||
{
|
|
||||||
h = (HANDLE)_get_osfhandle(fildes);
|
|
||||||
|
|
||||||
if (h == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
errno = EBADF;
|
|
||||||
return MAP_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else h = INVALID_HANDLE_VALUE;
|
|
||||||
|
|
||||||
fm = CreateFileMapping(h, NULL, protect, 0, len, NULL);
|
|
||||||
|
|
||||||
if (fm == NULL)
|
|
||||||
{
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return MAP_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
map = MapViewOfFileEx(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len, addr);
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
|
|
||||||
CloseHandle(fm);
|
|
||||||
|
|
||||||
if (map == NULL)
|
|
||||||
return MAP_FAILED;
|
|
||||||
|
|
||||||
if ((flags & MAP_FIXED) != 0 && map != addr)
|
|
||||||
{
|
|
||||||
UnmapViewOfFile(map);
|
|
||||||
errno = EEXIST;
|
|
||||||
return MAP_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
int munmap(void *addr, size_t len)
|
|
||||||
{
|
|
||||||
if (UnmapViewOfFile(addr))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int msync(void *addr, size_t len, int flags)
|
|
||||||
{
|
|
||||||
if (FlushViewOfFile(addr, len))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// vere uses kill() only to kill lockfile owner with SIGTERM or SIGKILL
|
|
||||||
// Windows does not have signals, so I handle SIGKILL as TerminateProcess()
|
|
||||||
// and return an error in all other cases
|
|
||||||
int kill(pid_t pid, int sig)
|
|
||||||
{
|
|
||||||
if (pid > 0 && sig == SIGKILL) {
|
|
||||||
HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
|
|
||||||
|
|
||||||
if (TerminateProcess(h, -1)) {
|
|
||||||
CloseHandle(h);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
CloseHandle(h);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// libgcc built for mingw has included an implementation of mprotect
|
|
||||||
// via VirtualProtect since olden days, but it takes int rather than size_t
|
|
||||||
// and therefore fails or does unexpected things for >2GB blocks on 64-bit
|
|
||||||
// https://github.com/gcc-mirror/gcc/blob/master/libgcc/libgcc2.c
|
|
||||||
int mprotect (void *addr, size_t len, int prot)
|
|
||||||
{
|
|
||||||
DWORD np, op;
|
|
||||||
|
|
||||||
if (prot == (PROT_READ | PROT_WRITE | PROT_EXEC))
|
|
||||||
np = PAGE_EXECUTE_READWRITE;
|
|
||||||
else if (prot == (PROT_READ | PROT_EXEC))
|
|
||||||
np = PAGE_EXECUTE_READ;
|
|
||||||
else if (prot == (PROT_EXEC))
|
|
||||||
np = PAGE_EXECUTE;
|
|
||||||
else if (prot == (PROT_READ | PROT_WRITE))
|
|
||||||
np = PAGE_READWRITE;
|
|
||||||
else if (prot == (PROT_READ))
|
|
||||||
np = PAGE_READONLY;
|
|
||||||
else if (prot == 0)
|
|
||||||
np = PAGE_NOACCESS;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VirtualProtect (addr, len, np, &op))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// NB: return code of ntdll!RtlGetLastNtStatus() is useful
|
|
||||||
// for diagnosing obscure VirtualProtect failures
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int utimes(const char *path, const struct timeval times[2])
|
|
||||||
{
|
|
||||||
struct _utimbuf utb = {.actime = times[0].tv_sec, .modtime = times[1].tv_sec};
|
|
||||||
return _utime(path, &utb);
|
|
||||||
}
|
|
||||||
|
|
||||||
int fdatasync(int fildes)
|
|
||||||
{
|
|
||||||
HANDLE h = (HANDLE)_get_osfhandle(fildes);
|
|
||||||
|
|
||||||
if (h == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
errno = EBADF;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FlushFileBuffers(h))
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
intmax_t mdb_get_filesize(HANDLE han_u)
|
|
||||||
{
|
|
||||||
LARGE_INTEGER li;
|
|
||||||
GetFileSizeEx(han_u, &li);
|
|
||||||
return li.QuadPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *realpath(const char *path, char *resolved_path)
|
|
||||||
{
|
|
||||||
// XX MAX_PATH
|
|
||||||
//
|
|
||||||
return _fullpath(resolved_path, path, MAX_PATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
long sysconf(int name)
|
|
||||||
{
|
|
||||||
SYSTEM_INFO si;
|
|
||||||
|
|
||||||
if ( _SC_PAGESIZE != name ) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
GetNativeSystemInfo(&si);
|
|
||||||
return si.dwPageSize;
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
#ifndef _MINGW_IO_H
|
|
||||||
#define _MINGW_IO_H
|
|
||||||
|
|
||||||
#define mkdir(A, B) mkdir(A)
|
|
||||||
|
|
||||||
int link(const char *path1, const char *path2);
|
|
||||||
char *realpath(const char *path, char *resolved_path);
|
|
||||||
int fdatasync(int fd);
|
|
||||||
int utimes(const char *path, const struct timeval times[2]);
|
|
||||||
long sysconf(int name);
|
|
||||||
|
|
||||||
int kill(pid_t pid, int signum);
|
|
||||||
|
|
||||||
#define SIGUSR1 10
|
|
||||||
#define SIGALRM 14
|
|
||||||
#define SIGVTALRM 26
|
|
||||||
#define SIGSTK 31
|
|
||||||
#define SIG_COUNT 32
|
|
||||||
#define _SC_PAGESIZE 29
|
|
||||||
|
|
||||||
#endif//_MINGW_IO_H
|
|
@ -1,17 +0,0 @@
|
|||||||
# increase default thread stack size and link Windows implibs
|
|
||||||
LDFLAGS := $(LDFLAGS) -static -Wl,--stack,67108864 -lbcrypt -lntdll -lws2_32
|
|
||||||
# libcurl
|
|
||||||
CFLAGS := $(CFLAGS) -DCURL_STATICLIB
|
|
||||||
LDFLAGS := $(LDFLAGS) -lzstd -lcrypt32
|
|
||||||
# libh2o
|
|
||||||
CFLAGS := $(CFLAGS) -DH2O_NO_UNIX_SOCKETS
|
|
||||||
# libuv
|
|
||||||
LDFLAGS := $(LDFLAGS) -luserenv -liphlpapi -lpsapi
|
|
||||||
# secp256k1, due to _FORTIFY_SOURCE
|
|
||||||
LDFLAGS := $(LDFLAGS) -lssp
|
|
||||||
|
|
||||||
ifdef debug
|
|
||||||
CFLAGS := $(CFLAGS) -O0 -g
|
|
||||||
else
|
|
||||||
CFLAGS := $(CFLAGS) -O3 -g
|
|
||||||
endif
|
|
@ -1,7 +0,0 @@
|
|||||||
#include <signal.h>
|
|
||||||
|
|
||||||
// initialize msvcrt signals early, otherwise Ctrl-C does nothing
|
|
||||||
static void __attribute__ ((constructor)) _init_crt_signals()
|
|
||||||
{
|
|
||||||
signal(SIGINT, SIG_DFL);
|
|
||||||
}
|
|
@ -1,116 +0,0 @@
|
|||||||
#include "noun.h"
|
|
||||||
vere.h"/vere.h"
|
|
||||||
|
|
||||||
/* _dup_std_handle(): creates an inheritable duplicate of a standard handle.
|
|
||||||
*/
|
|
||||||
static BOOL
|
|
||||||
_dup_std_handle(HANDLE* new_u, DWORD typ_u)
|
|
||||||
{
|
|
||||||
DWORD dum_u;
|
|
||||||
HANDLE han_u = GetStdHandle(typ_u);
|
|
||||||
BOOL con_u = GetConsoleMode(han_u, &dum_u);
|
|
||||||
if ( con_u ) {
|
|
||||||
han_u = (HANDLE)_get_osfhandle(c3_open(c3_dev_null, O_RDWR, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !DuplicateHandle(GetCurrentProcess(), han_u, GetCurrentProcess(), new_u, 0, TRUE, DUPLICATE_SAME_ACCESS) ) {
|
|
||||||
fprintf(stderr, "vere: DuplicateHandle(%d): %d\r\n", typ_u, GetLastError());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return con_u;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _on_boot_completed_cb: invoked when the ship has finished booting.
|
|
||||||
*/
|
|
||||||
static void _on_boot_completed_cb() {
|
|
||||||
HANDLE hin_u = GetStdHandle(STD_INPUT_HANDLE);
|
|
||||||
SetEvent(hin_u);
|
|
||||||
CloseHandle(hin_u);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* u3_daemon_init(): platform-specific daemon mode initialization.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
u3_daemon_init()
|
|
||||||
{
|
|
||||||
// detect if this process is the child daemon process
|
|
||||||
//
|
|
||||||
if ( ResetEvent(GetStdHandle(STD_INPUT_HANDLE)) ) {
|
|
||||||
u3_Host.bot_f = _on_boot_completed_cb;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
STARTUPINFOW psi_u;
|
|
||||||
ZeroMemory(&psi_u, sizeof(psi_u));
|
|
||||||
psi_u.cb = sizeof(psi_u);
|
|
||||||
psi_u.dwFlags = STARTF_USESTDHANDLES;
|
|
||||||
|
|
||||||
// duplicate standard output and error handles for the child process,
|
|
||||||
// replacing any raw console handles with handles to /dev/null
|
|
||||||
// print a warning if raw console output detected
|
|
||||||
//
|
|
||||||
// On Windows, console handles become invalid once the console is
|
|
||||||
// detached. This will cause urbit terminal output to fail. libuv
|
|
||||||
// provides no way of changing the handle of an open uv_pipe_handle,
|
|
||||||
// and Windows has no equivalent of dup2() for handles, so I cannot
|
|
||||||
// substitute a /dev/null handle once the terminal is initialized.
|
|
||||||
// It is possible to create an anonymous pipe and have the child
|
|
||||||
// process take over its drain end after it signals that the ship
|
|
||||||
// has booted, but -d is intended for background operation anyway
|
|
||||||
// and does not seem to warrant the added complexity.
|
|
||||||
//
|
|
||||||
if ( _dup_std_handle(&psi_u.hStdOutput, STD_OUTPUT_HANDLE) |
|
|
||||||
_dup_std_handle(&psi_u.hStdError, STD_ERROR_HANDLE) )
|
|
||||||
{
|
|
||||||
fprintf(stderr, "vere: -d used from a Windows console without redirection\r\n"
|
|
||||||
" no output from the daemon process will be visible\r\n");
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create an event for the child process to signal
|
|
||||||
// the parent that the ship has finished booting
|
|
||||||
// pass the handle as "stdin" (otherwise unused with -d)
|
|
||||||
//
|
|
||||||
SECURITY_ATTRIBUTES sa_u = {sizeof (SECURITY_ATTRIBUTES), NULL, TRUE};
|
|
||||||
if ( !(psi_u.hStdInput = CreateEvent(&sa_u, TRUE, FALSE, NULL)) ) {
|
|
||||||
fprintf(stderr, "vere: CreateEvent: %d\r\n", GetLastError());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the child process with the same command line as parent
|
|
||||||
// it will start, re-parse the command line, and call u3_daemon_init
|
|
||||||
//
|
|
||||||
PROCESS_INFORMATION ppi_u;
|
|
||||||
if ( !CreateProcessW(NULL, _wcsdup(GetCommandLineW()), NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &psi_u, &ppi_u) ) {
|
|
||||||
fprintf(stderr, "vere: CreateProcess: %d\r\n", GetLastError());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
CloseHandle(ppi_u.hThread);
|
|
||||||
|
|
||||||
// wait for the child process to exit or to signal the event
|
|
||||||
//
|
|
||||||
DWORD exi_u;
|
|
||||||
HANDLE han_u[2] = {ppi_u.hProcess, psi_u.hStdInput};
|
|
||||||
switch ( WaitForMultipleObjects(2, han_u, FALSE, INFINITE) ) {
|
|
||||||
case WAIT_OBJECT_0:
|
|
||||||
// the child process exited prematurely, propagate its exit code
|
|
||||||
//
|
|
||||||
if ( GetExitCodeProcess(ppi_u.hProcess, &exi_u) ) {
|
|
||||||
exit(exi_u);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "vere: GetExitCodeProcess: %d\r\n", GetLastError());
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
case WAIT_OBJECT_0 + 1:
|
|
||||||
// the child process has finished booting, exit normally
|
|
||||||
//
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "vere: WaitForMultipleObjects: %d\r\n", GetLastError());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,74 +0,0 @@
|
|||||||
diff --git a/mdb.c b/mdb.c
|
|
||||||
--- a/mdb.c
|
|
||||||
+++ b/mdb.c
|
|
||||||
@@ -1707,28 +1707,27 @@ static char *const mdb_errstr[] = {
|
|
||||||
"MDB_PROBLEM: Unexpected problem - txn should abort",
|
|
||||||
};
|
|
||||||
|
|
||||||
-char *
|
|
||||||
-mdb_strerror(int err)
|
|
||||||
+void
|
|
||||||
+mdb_logerror(FILE* f, int err, const char* fmt, ...)
|
|
||||||
{
|
|
||||||
-#ifdef _WIN32
|
|
||||||
- /** HACK: pad 4KB on stack over the buf. Return system msgs in buf.
|
|
||||||
- * This works as long as no function between the call to mdb_strerror
|
|
||||||
- * and the actual use of the message uses more than 4K of stack.
|
|
||||||
- */
|
|
||||||
-#define MSGSIZE 1024
|
|
||||||
-#define PADSIZE 4096
|
|
||||||
- char buf[MSGSIZE+PADSIZE], *ptr = buf;
|
|
||||||
-#endif
|
|
||||||
+ va_list ap;
|
|
||||||
+ va_start(ap, fmt);
|
|
||||||
+ vfprintf(f, fmt, ap);
|
|
||||||
+ va_end(ap);
|
|
||||||
+
|
|
||||||
int i;
|
|
||||||
if (!err)
|
|
||||||
- return ("Successful return: 0");
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, ": %s\r\n", "Successful return: 0");
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (err >= MDB_KEYEXIST && err <= MDB_LAST_ERRCODE) {
|
|
||||||
i = err - MDB_KEYEXIST;
|
|
||||||
- return mdb_errstr[i];
|
|
||||||
+ fprintf(stderr, ": %s\r\n", mdb_errstr[i]);
|
|
||||||
+ return;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#ifdef _WIN32
|
|
||||||
/* These are the C-runtime error codes we use. The comment indicates
|
|
||||||
* their numeric value, and the Win32 error they would correspond to
|
|
||||||
* if the error actually came from a Win32 API. A major mess, we should
|
|
||||||
@@ -1742,18 +1741,20 @@ mdb_strerror(int err)
|
|
||||||
case EBUSY: /* 16, CURRENT_DIRECTORY */
|
|
||||||
case EINVAL: /* 22, BAD_COMMAND */
|
|
||||||
case ENOSPC: /* 28, OUT_OF_PAPER */
|
|
||||||
- return strerror(err);
|
|
||||||
+ fprintf(stderr, ": %s\r\n", strerror(err));
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
- buf[0] = 0;
|
|
||||||
- FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
|
|
||||||
+ LPSTR ptr;
|
|
||||||
+ if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
|
|
||||||
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
||||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
||||||
- NULL, err, 0, ptr, MSGSIZE, (va_list *)buf+MSGSIZE);
|
|
||||||
- return ptr;
|
|
||||||
-#else
|
|
||||||
- return strerror(err);
|
|
||||||
-#endif
|
|
||||||
+ NULL, err, 0, (LPSTR)&ptr, sizeof (LPSTR), NULL))
|
|
||||||
+ {
|
|
||||||
+ fprintf(stderr, ": %s\r\n", ptr);
|
|
||||||
+ LocalFree(ptr);
|
|
||||||
+ } else
|
|
||||||
+ fprintf(stderr, ": <%d>\r\n", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** assert(3) variant in cursor context */
|
|
@ -1,26 +0,0 @@
|
|||||||
#ifndef _SYS_MMAN_H
|
|
||||||
#define _SYS_MMAN_H
|
|
||||||
|
|
||||||
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
|
|
||||||
int munmap(void *addr, size_t length);
|
|
||||||
int msync(void *addr, size_t length, int flags);
|
|
||||||
int mprotect(void *addr, size_t len, int prot);
|
|
||||||
|
|
||||||
#define PROT_NONE 0x00 /* No access. */
|
|
||||||
#define PROT_READ 0x01 /* Pages can be read. */
|
|
||||||
#define PROT_WRITE 0x02 /* Pages can be written. */
|
|
||||||
#define PROT_EXEC 0x04 /* Pages can be executed. */
|
|
||||||
|
|
||||||
#define MAP_FILE 0x0001 /* Mapped from a file or device. */
|
|
||||||
#define MAP_ANON 0x0002 /* Allocated from anonymous virtual memory. */
|
|
||||||
#define MAP_TYPE 0x000f /* Mask for type field. */
|
|
||||||
#define MAP_SHARED 0x0010 /* Share changes. */
|
|
||||||
#define MAP_PRIVATE 0x0000 /* Changes private; copy pages on write. */
|
|
||||||
#define MAP_FIXED 0x0100 /* Map address must be exactly as requested. */
|
|
||||||
#define MAP_FAILED ((void *) -1)
|
|
||||||
|
|
||||||
#define MS_ASYNC 1 /* Sync memory asynchronously. */
|
|
||||||
#define MS_SYNC 0 /* Synchronous memory sync. */
|
|
||||||
#define MS_INVALIDATE 2 /* Invalidate the caches. */
|
|
||||||
|
|
||||||
#endif//_SYS_MMAN_H
|
|
@ -1,13 +0,0 @@
|
|||||||
diff --git a/makefile b/makefile
|
|
||||||
--- a/makefile
|
|
||||||
+++ b/makefile
|
|
||||||
@@ -12,5 +12,9 @@ shared: murmur3.c murmur3.h
|
|
||||||
$(CC) -fPIC -O3 -c murmur3.c
|
|
||||||
$(CC) -shared -Wl,--export-dynamic murmur3.o -o libmurmur3.so
|
|
||||||
|
|
||||||
+static: murmur3.c murmur3.h
|
|
||||||
+ $(CC) -fPIC -O3 -c murmur3.c
|
|
||||||
+ $(AR) rcs libmurmur3.a murmur3.o
|
|
||||||
+
|
|
||||||
clean:
|
|
||||||
rm -rf example *.o *.so
|
|
@ -1,152 +0,0 @@
|
|||||||
/* compat/mingw/ptty.c
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
#include "noun.h"
|
|
||||||
vere.h"/vere.h"
|
|
||||||
#include <winternl.h>
|
|
||||||
|
|
||||||
/* _ptty_get_type(): detects tty type.
|
|
||||||
*/
|
|
||||||
static DWORD
|
|
||||||
_ptty_get_type(int fd)
|
|
||||||
{
|
|
||||||
HANDLE h = (HANDLE)_get_osfhandle(fd);
|
|
||||||
if (h == INVALID_HANDLE_VALUE)
|
|
||||||
return FILE_TYPE_UNKNOWN;
|
|
||||||
|
|
||||||
DWORD t = GetFileType(h);
|
|
||||||
if (t != FILE_TYPE_PIPE)
|
|
||||||
return t ;
|
|
||||||
|
|
||||||
// https://github.com/fusesource/jansi-native/commit/461068c67a38647d2890e96250636fc0117074f5
|
|
||||||
ULONG result;
|
|
||||||
BYTE buffer[1024];
|
|
||||||
POBJECT_NAME_INFORMATION nameinfo = (POBJECT_NAME_INFORMATION) buffer;
|
|
||||||
PWSTR name;
|
|
||||||
|
|
||||||
/* get pipe name */
|
|
||||||
if (!NT_SUCCESS(NtQueryObject(h, ObjectNameInformation, buffer, sizeof(buffer) - sizeof(WCHAR), &result)))
|
|
||||||
return FILE_TYPE_UNKNOWN;
|
|
||||||
|
|
||||||
name = nameinfo->Name.Buffer;
|
|
||||||
name[nameinfo->Name.Length] = 0;
|
|
||||||
|
|
||||||
// check for popular terminal emulators
|
|
||||||
// that use named pipes to communicate with subprocesses
|
|
||||||
if (wcsstr(name, L"\\ConEmu") ||
|
|
||||||
(wcsstr(name, L"msys-") || wcsstr(name, L"cygwin-")) && wcsstr(name, L"-pty"))
|
|
||||||
return FILE_TYPE_PIPE;
|
|
||||||
|
|
||||||
return FILE_TYPE_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _ttyf_nop(): stub function.
|
|
||||||
*/
|
|
||||||
static c3_o
|
|
||||||
_ttyf_nop(u3_utty* uty_u)
|
|
||||||
{
|
|
||||||
return c3y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _ttyf_start_raw_input(): ends raw input on the tty.
|
|
||||||
*/
|
|
||||||
static c3_o
|
|
||||||
_ttyf_set_normal(u3_utty* uty_u)
|
|
||||||
{
|
|
||||||
c3_i e;
|
|
||||||
if ( 0 != (e = uv_tty_set_mode(&uty_u->pin_u.tty_u, UV_TTY_MODE_NORMAL)) ) {
|
|
||||||
fprintf(stderr, "uv_tty_set_mode(UV_TTY_MODE_NORMAL) -> %d\r\n", e);
|
|
||||||
return c3n;
|
|
||||||
}
|
|
||||||
return c3y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _ttyf_start_raw_input(): sets the tty to raw input.
|
|
||||||
*/
|
|
||||||
static c3_o
|
|
||||||
_ttyf_set_raw(u3_utty* uty_u)
|
|
||||||
{
|
|
||||||
c3_i e;
|
|
||||||
if ( 0 != (e = uv_tty_set_mode(&uty_u->pin_u.tty_u, UV_TTY_MODE_RAW)) ) {
|
|
||||||
fprintf(stderr, "uv_tty_set_mode(UV_TTY_MODE_RAW) -> %d\r\n", e);
|
|
||||||
return c3n;
|
|
||||||
}
|
|
||||||
return c3y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _ttyf_get_winsize(): gets the tty window size.
|
|
||||||
*/
|
|
||||||
static c3_o
|
|
||||||
_ttyf_get_winsize(u3_utty* uty_u, c3_l* col_l, c3_l* row_l)
|
|
||||||
{
|
|
||||||
c3_i col_i, row_i;
|
|
||||||
if ( 0 != uv_tty_get_winsize(&uty_u->pop_u.tty_u, &col_i, &row_i) ) {
|
|
||||||
return c3n;
|
|
||||||
}
|
|
||||||
|
|
||||||
*col_l = col_i;
|
|
||||||
*row_l = row_i;
|
|
||||||
return c3y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _ttyf_get_winsize(): gets the tty window size.
|
|
||||||
*/
|
|
||||||
static c3_o
|
|
||||||
_ttyf_nop_winsize(u3_utty* uty_u, c3_l* col_l, c3_l* row_l)
|
|
||||||
{
|
|
||||||
return c3n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* u3_ptty_init(): initialize platform-specific tty.
|
|
||||||
*/
|
|
||||||
u3_utty*
|
|
||||||
u3_ptty_init(uv_loop_t* lup_u, const c3_c** err_c)
|
|
||||||
{
|
|
||||||
DWORD pip_l = _ptty_get_type(0);
|
|
||||||
DWORD pop_l = _ptty_get_type(1);
|
|
||||||
if ( pip_l == FILE_TYPE_UNKNOWN || pop_l == FILE_TYPE_UNKNOWN) {
|
|
||||||
*err_c = "not a tty";
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( pip_l != pop_l ) {
|
|
||||||
*err_c = "partly redirected";
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
c3_i e;
|
|
||||||
u3_utty* uty_u = c3_calloc(sizeof(u3_utty));
|
|
||||||
if ( pip_l == FILE_TYPE_CHAR ) {
|
|
||||||
if ( 0 == (e = uv_tty_init(lup_u, &uty_u->pin_u.tty_u, 0, 0)) &&
|
|
||||||
0 == (e = uv_tty_init(lup_u, &uty_u->pop_u.tty_u, 1, 0)) )
|
|
||||||
{
|
|
||||||
SetConsoleOutputCP(CP_UTF8);
|
|
||||||
uty_u->sta_f = _ttyf_set_raw;
|
|
||||||
uty_u->sto_f = _ttyf_set_normal;
|
|
||||||
uty_u->wsz_f = _ttyf_get_winsize;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( 0 == (e = uv_pipe_init(lup_u, &uty_u->pin_u.pip_u, 0)) &&
|
|
||||||
0 == (e = uv_pipe_init(lup_u, &uty_u->pop_u.pip_u, 0)) &&
|
|
||||||
0 == (e = uv_pipe_open(&uty_u->pin_u.pip_u, 0)) &&
|
|
||||||
0 == (e = uv_pipe_open(&uty_u->pop_u.pip_u, 1)) )
|
|
||||||
{
|
|
||||||
fprintf(stderr, "vere: running interactive in a terminal emulator is experimental\r\n"
|
|
||||||
" use -t to disable interactivity or use native Windows console\r\n") ;
|
|
||||||
uty_u->sta_f = _ttyf_nop;
|
|
||||||
uty_u->sto_f = _ttyf_nop;
|
|
||||||
uty_u->wsz_f = _ttyf_nop_winsize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( e ) {
|
|
||||||
*err_c = uv_strerror(e);
|
|
||||||
c3_free(uty_u);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
uty_u->fid_i = 1;
|
|
||||||
uty_u->hij_f = _ttyf_nop;
|
|
||||||
uty_u->loj_f = _ttyf_nop;
|
|
||||||
return uty_u;
|
|
||||||
}
|
|
@ -1,167 +0,0 @@
|
|||||||
#include "noun.h"
|
|
||||||
#include "rsignal.h"
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
int err_win_to_posix(DWORD winerr);
|
|
||||||
|
|
||||||
// The current implementation of rsignal_ is single-threaded,
|
|
||||||
// but it can be extended to multi-threaded by replacing these
|
|
||||||
// static variables with a thread id-based hash map.
|
|
||||||
//
|
|
||||||
static __p_sig_fn_t _fns[SIG_COUNT];
|
|
||||||
static volatile DWORD _tid;
|
|
||||||
static HANDLE _hvt;
|
|
||||||
|
|
||||||
void rsignal_install_handler(int sig, __p_sig_fn_t fn)
|
|
||||||
{
|
|
||||||
if (sig < 0 || sig >= SIG_COUNT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
DWORD newtid = GetCurrentThreadId();
|
|
||||||
DWORD oldtid = InterlockedExchange(&_tid, newtid);
|
|
||||||
if (oldtid != 0 && oldtid != newtid) {
|
|
||||||
fprintf(stderr, "\r\nrsignal_install_handler: %u -> %u\r\n", oldtid, newtid);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
__p_sig_fn_t oldfn = InterlockedExchangePointer((PVOID*)&_fns[sig], fn);
|
|
||||||
if (fn != 0 && oldfn != 0 && oldfn != fn) {
|
|
||||||
fprintf(stderr, "\r\nrsignal_install_handler: %p -> %p\r\n", oldfn, fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rsignal_deinstall_handler(int sig)
|
|
||||||
{
|
|
||||||
rsignal_install_handler(sig, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rsignal_raise(int sig)
|
|
||||||
{
|
|
||||||
if (sig < 0 || sig >= SIG_COUNT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
__p_sig_fn_t oldfn = InterlockedExchangePointer((PVOID*)&_fns[sig], 0);
|
|
||||||
if (oldfn == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (_tid == GetCurrentThreadId()) {
|
|
||||||
oldfn(sig);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HANDLE hthread = OpenThread(THREAD_ALL_ACCESS, FALSE, _tid);
|
|
||||||
if (!hthread) {
|
|
||||||
fprintf(stderr, "\r\nrsignal_raise: OpenThread(%u): %d\r\n", _tid, GetLastError());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SuspendThread(hthread) < 0) {
|
|
||||||
fprintf(stderr, "\r\nrsignal_raise: SuspendThread(%u): %d\r\n", _tid, GetLastError());
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
oldfn(sig);
|
|
||||||
|
|
||||||
if (!ResumeThread(hthread)) {
|
|
||||||
fprintf(stderr, "\r\nrsignal_raise: ResumeThread(%u): %d\r\n", _tid, GetLastError());
|
|
||||||
|
|
||||||
// abort because the main thread is stuck
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
CloseHandle(hthread);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _rsignal_vt_cb(PVOID param, BOOLEAN timedOut)
|
|
||||||
{
|
|
||||||
rsignal_raise(SIGVTALRM);
|
|
||||||
}
|
|
||||||
|
|
||||||
int rsignal_setitimer(int type, struct itimerval *in, struct itimerval *out)
|
|
||||||
{
|
|
||||||
if (in == 0) {
|
|
||||||
errno = EFAULT;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type != ITIMER_VIRTUAL || out != 0) {
|
|
||||||
errno = ENOTSUP;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_hvt != NULL) {
|
|
||||||
DeleteTimerQueueTimer(NULL, _hvt, NULL);
|
|
||||||
_hvt = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timerisset(&in->it_value) && !CreateTimerQueueTimer(&_hvt, NULL, _rsignal_vt_cb, NULL,
|
|
||||||
in->it_value.tv_sec * 1000 + in->it_value.tv_usec / 1000,
|
|
||||||
in->it_interval.tv_sec * 1000 + in->it_interval.tv_usec / 1000, 0))
|
|
||||||
{
|
|
||||||
errno = err_win_to_posix(GetLastError());
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// direct import from ntdll.dll
|
|
||||||
extern DWORD64 __imp_KiUserExceptionDispatcher;
|
|
||||||
|
|
||||||
static void _rsignal_longjmp(intptr_t* builtin_jb)
|
|
||||||
{
|
|
||||||
__builtin_longjmp(builtin_jb, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rsignal_post_longjmp(DWORD tid, intptr_t* builtin_jb)
|
|
||||||
{
|
|
||||||
HANDLE hthread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);
|
|
||||||
if (!hthread) {
|
|
||||||
fprintf(stderr, "\r\nrsignal: OpenThread(%u): %d\r\n", tid, GetLastError());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CONTEXT context;
|
|
||||||
context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
|
|
||||||
if (!GetThreadContext(hthread, &context)) {
|
|
||||||
fprintf(stderr, "\r\nrsignal: GetThreadContext(%u): %d\r\n", tid, GetLastError());
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
// see if the thread is currently handling a structured exception
|
|
||||||
// if so, let the handler (usually the libsigsegv handler) finish
|
|
||||||
// and set up the the signal to run at the exception resume point
|
|
||||||
// otherwise, passing a parameter to fn is completely unreliable
|
|
||||||
//
|
|
||||||
DWORD64 kibase;
|
|
||||||
PRUNTIME_FUNCTION ki = RtlLookupFunctionEntry(__imp_KiUserExceptionDispatcher, &kibase, NULL);
|
|
||||||
CONTEXT c = context;
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
DWORD64 base, frame;
|
|
||||||
PRUNTIME_FUNCTION f = RtlLookupFunctionEntry(c.Rip, &base, NULL);
|
|
||||||
if (!f) break;
|
|
||||||
if (f == ki)
|
|
||||||
{
|
|
||||||
// KiUserExceptionDispatcher has a "bare" frame
|
|
||||||
// with $rsp pointing to the CONTEXT structure
|
|
||||||
//
|
|
||||||
((PCONTEXT)c.Rsp)->Rip = (DWORD64)_rsignal_longjmp;
|
|
||||||
((PCONTEXT)c.Rsp)->Rcx = (DWORD64)builtin_jb;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
PVOID handler_data;
|
|
||||||
RtlVirtualUnwind(0, base, c.Rip, f, &c, &handler_data, &frame, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Rip = (DWORD64)_rsignal_longjmp;
|
|
||||||
context.Rcx = (DWORD64)builtin_jb;
|
|
||||||
if (!SetThreadContext(hthread, &context)) {
|
|
||||||
fprintf(stderr, "\r\nrsignal: SetThreadContext(%u): %d\r\n", tid, GetLastError());
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
CloseHandle(hthread);
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
#ifndef _RSIGNAL_H
|
|
||||||
#define _RSIGNAL_H
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
jmp_buf jb;
|
|
||||||
unsigned long tid;
|
|
||||||
} rsignal_jmpbuf;
|
|
||||||
|
|
||||||
#define rsignal_setjmp(buf) (buf.tid = GetCurrentThreadId(), setjmp(buf.jb))
|
|
||||||
#define rsignal_longjmp(buf, val) if (buf.tid != GetCurrentThreadId()) {buf.jb.retval = (val); rsignal_post_longjmp(buf.tid, buf.jb.buffer);} else longjmp(buf.jb, val)
|
|
||||||
|
|
||||||
void rsignal_raise(int sig);
|
|
||||||
void rsignal_install_handler(int sig, __p_sig_fn_t fn);
|
|
||||||
void rsignal_deinstall_handler(int sig);
|
|
||||||
void rsignal_post_longjmp(unsigned long tid, intptr_t* builtin_jb);
|
|
||||||
|
|
||||||
#define ITIMER_VIRTUAL 1
|
|
||||||
struct itimerval {
|
|
||||||
struct timeval it_value, it_interval;
|
|
||||||
};
|
|
||||||
|
|
||||||
int rsignal_setitimer(int type, struct itimerval *in, struct itimerval *out);
|
|
||||||
|
|
||||||
#endif//_RSIGNAL_H
|
|
@ -1,25 +0,0 @@
|
|||||||
#include "noun.h"
|
|
||||||
#include "rsignal.h"
|
|
||||||
vere.h"/vere.h"
|
|
||||||
|
|
||||||
/* _mingw_exception_filter: replaces libsigsegv on MingW
|
|
||||||
*/
|
|
||||||
EXCEPTION_DISPOSITION _mingw_exception_filter(
|
|
||||||
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
||||||
IN ULONG64 EstablisherFrame,
|
|
||||||
IN OUT PCONTEXT ContextRecord,
|
|
||||||
IN OUT PDISPATCHER_CONTEXT DispatcherContext)
|
|
||||||
{
|
|
||||||
if (ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
|
|
||||||
ExceptionRecord->ExceptionInformation[0] == 1 &&
|
|
||||||
u3e_fault((void*)ExceptionRecord->ExceptionInformation[1], 1))
|
|
||||||
{
|
|
||||||
return ExceptionContinueExecution;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW) {
|
|
||||||
rsignal_raise(SIGSTK);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExceptionContinueSearch;
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
enum { INIT, CPAR, DQ, DQS, SQ, SQS };
|
|
||||||
char line[1 << 16];
|
|
||||||
|
|
||||||
/* seh_handler_decorator: registers u3_exception_handler for all functions in given source file
|
|
||||||
*/
|
|
||||||
int main(int argc, const char* argv[])
|
|
||||||
{
|
|
||||||
if (argc != 2)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
int c, state = INIT, curly = 0, emit = 0;
|
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), stdin))
|
|
||||||
{
|
|
||||||
if (line[0] == '#')
|
|
||||||
{
|
|
||||||
emit = !!strstr(line, argv[1]);
|
|
||||||
fputs(line, stdout);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
for (int i = 0; line[i]; i++)
|
|
||||||
{
|
|
||||||
switch (state) {
|
|
||||||
case INIT:
|
|
||||||
case CPAR:
|
|
||||||
switch (line[i]) {
|
|
||||||
case ' ':
|
|
||||||
case '\t':
|
|
||||||
case '\n':
|
|
||||||
case '\r':
|
|
||||||
case '\f': break;
|
|
||||||
case '{': curly++; if (emit && curly == 1 && state == CPAR) goto emit_handler; goto reset;
|
|
||||||
case '}': curly--; goto reset;
|
|
||||||
case '"': state = DQ; break;
|
|
||||||
case '\'': state = SQ; break;
|
|
||||||
case ')': state = CPAR; break;
|
|
||||||
reset:
|
|
||||||
default: state = INIT; break;
|
|
||||||
} break;
|
|
||||||
case DQ:
|
|
||||||
switch (line[i]) {
|
|
||||||
case '\\': state = DQS; break;
|
|
||||||
case '"': state = INIT; break;
|
|
||||||
} break;
|
|
||||||
case DQS: state = DQ; break;
|
|
||||||
case SQ:
|
|
||||||
switch (line[i]) {
|
|
||||||
case '\\': state = SQS; break;
|
|
||||||
case '\'': state = INIT; break;
|
|
||||||
} break;
|
|
||||||
case SQS: state = SQ; break;
|
|
||||||
}
|
|
||||||
fputc(line[i], stdout);
|
|
||||||
continue;
|
|
||||||
emit_handler:
|
|
||||||
fputs("{__asm__(\".seh_handler _mingw_exception_filter,@except\\n\");", stdout);
|
|
||||||
state = INIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
# This include file injects a step that transforms vere C source to register
|
|
||||||
# a SEH exception handler for each function that is declared in a .c file.
|
|
||||||
# It inserts a .seh_handler directive into each function body with __asm__.
|
|
||||||
# This directive affects the x64 unwind tables (.pdata and .xdata sections)
|
|
||||||
# emitted by the compiler.
|
|
||||||
#
|
|
||||||
# See gas/config/obj-coff-seh.h in binutils source for .seh_handler, and
|
|
||||||
# https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64
|
|
||||||
# for a description of how stack unwinding and SEH work in x64 Windows.
|
|
||||||
#
|
|
||||||
# When this file sets CCEXTRA, the first invocation of $(CC) in Makefile
|
|
||||||
# writes preprocessor output to stdout (-E -o -), which is piped to a simple
|
|
||||||
# parser that inserts __asm__ statements to each function in the .c file
|
|
||||||
# being compiled. The second invocation of $(CC) reads transformed source
|
|
||||||
# from stdin (-x cpp-output -). $< argument to $(sehdexe) tells the parser
|
|
||||||
# which .c file is being compiled.
|
|
||||||
|
|
||||||
sehdexe := build/seh_handler_decorator.exe
|
|
||||||
CCDEPS := $(CCDEPS) $(sehdexe)
|
|
||||||
CCEXTRA = -E -o -|$(sehdexe) $<|$(CC) $(CFLAGS) -x cpp-output -
|
|
||||||
|
|
||||||
$(sehdexe): compat/mingw/seh_handler_decorator.cc
|
|
||||||
@mkdir -p ./build
|
|
||||||
@$(CC) $< -o $@
|
|
@ -1,15 +0,0 @@
|
|||||||
#ifndef _MINGW_SETJMP_H
|
|
||||||
#define _MINGW_SETJMP_H
|
|
||||||
|
|
||||||
// msvcrt setjmp/longjmp are broken on 64-bit systems, use gcc builtins
|
|
||||||
typedef struct jmp_buf {
|
|
||||||
intptr_t buffer[5];
|
|
||||||
int retval;
|
|
||||||
} jmp_buf;
|
|
||||||
|
|
||||||
#define _setjmp setjmp
|
|
||||||
#define _longjmp longjmp
|
|
||||||
#define longjmp(buf, val) {buf.retval = (val); __builtin_longjmp(buf.buffer, 1);}
|
|
||||||
#define setjmp(buf) (__builtin_setjmp(buf.buffer) ? (buf.retval) : 0)
|
|
||||||
|
|
||||||
#endif//_MINGW_SETJMP_H
|
|
@ -1,36 +0,0 @@
|
|||||||
diff --git a/build/Win64-MinGW-w64/Makefile b/build/Win64-MinGW-w64/Makefile
|
|
||||||
--- a/build/Win64-MinGW-w64/Makefile
|
|
||||||
+++ b/build/Win64-MinGW-w64/Makefile
|
|
||||||
@@ -46,7 +46,8 @@ C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
|
||||||
COMPILE_C = \
|
|
||||||
x86_64-w64-mingw32-gcc -c -Werror-implicit-function-declaration \
|
|
||||||
-DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
|
||||||
-MAKELIB = x86_64-w64-mingw32-ar crs $@
|
|
||||||
+MAKELIB = x86_64-w64-mingw32-gcc-ar crs $@
|
|
||||||
+LIBNAME = libsoftfloat3
|
|
||||||
|
|
||||||
OBJ = .o
|
|
||||||
LIB = .a
|
|
||||||
@@ -54,7 +55,7 @@ LIB = .a
|
|
||||||
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
-all: softfloat$(LIB)
|
|
||||||
+all: $(LIBNAME)$(LIB)
|
|
||||||
|
|
||||||
OBJS_PRIMITIVES = \
|
|
||||||
s_eq128$(OBJ) \
|
|
||||||
@@ -380,11 +381,11 @@ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
|
|
||||||
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
|
|
||||||
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
|
|
||||||
|
|
||||||
-softfloat$(LIB): $(OBJS_ALL)
|
|
||||||
+$(LIBNAME)$(LIB): $(OBJS_ALL)
|
|
||||||
$(DELETE) $@
|
|
||||||
$(MAKELIB) $^
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
- $(DELETE) $(OBJS_ALL) softfloat$(LIB)
|
|
||||||
+ $(DELETE) $(OBJS_ALL) $(LIBNAME)$(LIB)
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
diff --git a/src/win/pipe.c b/src/win/pipe.c
|
|
||||||
index 0f2bb869b..f81245ec6 100644
|
|
||||||
--- a/src/win/pipe.c
|
|
||||||
+++ b/src/win/pipe.c
|
|
||||||
@@ -270,6 +270,12 @@ static int uv_set_pipe_handle(uv_loop_t* loop,
|
|
||||||
|
|
||||||
if (!SetNamedPipeHandleState(pipeHandle, &mode, NULL, NULL)) {
|
|
||||||
err = GetLastError();
|
|
||||||
+ if ((err == ERROR_INVALID_FUNCTION || err == ERROR_INVALID_PARAMETER) && (duplex_flags & UV_HANDLE_WRITABLE)) {
|
|
||||||
+ /*
|
|
||||||
+ * it's not a pipe, but simple writes should be fine
|
|
||||||
+ * let's trust callers to know what they're doing
|
|
||||||
+ */
|
|
||||||
+ } else
|
|
||||||
if (err == ERROR_ACCESS_DENIED) {
|
|
||||||
/*
|
|
||||||
* SetNamedPipeHandleState can fail if the handle doesn't have either
|
|
||||||
@@ -1054,7 +1054,6 @@ static DWORD WINAPI uv_pipe_writefile_thread_proc(void* parameter) {
|
|
||||||
assert(req != NULL);
|
|
||||||
assert(req->type == UV_WRITE);
|
|
||||||
assert(handle->type == UV_NAMED_PIPE);
|
|
||||||
- assert(req->write_buffer.base);
|
|
||||||
|
|
||||||
result = WriteFile(handle->handle,
|
|
||||||
req->write_buffer.base,
|
|
||||||
diff --git a/src/win/tty.c b/src/win/tty.c
|
|
||||||
index c359d5601..1b9d4f853 100644
|
|
||||||
--- a/src/win/tty.c
|
|
||||||
+++ b/src/win/tty.c
|
|
||||||
@@ -367,7 +367,7 @@ int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) {
|
|
||||||
flags = ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT;
|
|
||||||
break;
|
|
||||||
case UV_TTY_MODE_RAW:
|
|
||||||
- flags = ENABLE_WINDOW_INPUT;
|
|
||||||
+ flags = ENABLE_WINDOW_INPUT | ENABLE_PROCESSED_INPUT;
|
|
||||||
break;
|
|
||||||
case UV_TTY_MODE_IO:
|
|
||||||
return UV_ENOTSUP;
|
|
@ -1,12 +0,0 @@
|
|||||||
diff --git a/Makefile b/Makefile
|
|
||||||
--- a/Makefile
|
|
||||||
+++ b/Makefile
|
|
||||||
@@ -18,7 +18,7 @@
|
|
||||||
# There may be other macros in mdb.c of interest. You should
|
|
||||||
# read mdb.c before changing any of them.
|
|
||||||
#
|
|
||||||
-CC = gcc
|
|
||||||
+CC = cc
|
|
||||||
AR = ar
|
|
||||||
W = -W -Wall -Wno-unused-parameter -Wbad-function-cast -Wuninitialized
|
|
||||||
THREADS = -pthread
|
|
@ -1,13 +0,0 @@
|
|||||||
diff --git a/makefile b/makefile
|
|
||||||
--- a/makefile
|
|
||||||
+++ b/makefile
|
|
||||||
@@ -12,5 +12,9 @@ shared: murmur3.c murmur3.h
|
|
||||||
$(CC) -fPIC -O3 -c murmur3.c
|
|
||||||
$(CC) -shared -Wl,--export-dynamic murmur3.o -o libmurmur3.so
|
|
||||||
|
|
||||||
+static: murmur3.c murmur3.h
|
|
||||||
+ $(CC) -fPIC -O3 -c murmur3.c
|
|
||||||
+ $(AR) rcs libmurmur3.a murmur3.o
|
|
||||||
+
|
|
||||||
clean:
|
|
||||||
rm -rf example *.o *.so
|
|
@ -1,85 +0,0 @@
|
|||||||
diff --git a/build/template-FAST_INT64/Makefile b/build/template-FAST_INT64/Makefile
|
|
||||||
--- a/build/template-FAST_INT64/Makefile
|
|
||||||
+++ b/build/template-FAST_INT64/Makefile
|
|
||||||
@@ -34,28 +34,27 @@
|
|
||||||
#
|
|
||||||
#=============================================================================
|
|
||||||
|
|
||||||
-# Edit lines marked with `==>'. See "SoftFloat-source.html".
|
|
||||||
+SOURCE_DIR ?= ../../source
|
|
||||||
+SPECIALIZE_TYPE ?= 8086-SSE
|
|
||||||
|
|
||||||
-==> SOURCE_DIR ?= ../../source
|
|
||||||
-==> SPECIALIZE_TYPE ?= 8086
|
|
||||||
+SOFTFLOAT_OPTS ?= \
|
|
||||||
+ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
|
|
||||||
+ -DSOFTFLOAT_FAST_DIV64TO32
|
|
||||||
|
|
||||||
-==> SOFTFLOAT_OPTS ?= \
|
|
||||||
-==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
|
|
||||||
-==> -DSOFTFLOAT_FAST_DIV64TO32
|
|
||||||
+DELETE = rm -f
|
|
||||||
+C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
|
||||||
+COMPILE_C = \
|
|
||||||
+ cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
|
||||||
+MAKELIB = ar crs $@
|
|
||||||
+LIBNAME = libsoftfloat3
|
|
||||||
|
|
||||||
-==> DELETE = rm -f
|
|
||||||
-==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
|
||||||
-==> COMPILE_C = \
|
|
||||||
-==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
|
||||||
-==> MAKELIB = ar crs $@
|
|
||||||
+OBJ = .o
|
|
||||||
+LIB = .a
|
|
||||||
|
|
||||||
-==> OBJ = .o
|
|
||||||
-==> LIB = .a
|
|
||||||
-
|
|
||||||
-==> OTHER_HEADERS =
|
|
||||||
+OTHER_HEADERS =
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
-all: softfloat$(LIB)
|
|
||||||
+all: $(LIBNAME)$(LIB)
|
|
||||||
|
|
||||||
OBJS_PRIMITIVES = \
|
|
||||||
s_eq128$(OBJ) \
|
|
||||||
@@ -381,11 +380,11 @@ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
|
|
||||||
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
|
|
||||||
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
|
|
||||||
|
|
||||||
-softfloat$(LIB): $(OBJS_ALL)
|
|
||||||
+$(LIBNAME)$(LIB): $(OBJS_ALL)
|
|
||||||
$(DELETE) $@
|
|
||||||
$(MAKELIB) $^
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
- $(DELETE) $(OBJS_ALL) softfloat$(LIB)
|
|
||||||
+ $(DELETE) $(OBJS_ALL) $(LIBNAME)$(LIB)
|
|
||||||
|
|
||||||
diff --git a/build/template-FAST_INT64/platform.h b/build/template-FAST_INT64/platform.h
|
|
||||||
--- a/build/template-FAST_INT64/platform.h
|
|
||||||
+++ b/build/template-FAST_INT64/platform.h
|
|
||||||
@@ -34,17 +34,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
=============================================================================*/
|
|
||||||
|
|
||||||
-// Edit lines marked with `==>'. See "SoftFloat-source.html".
|
|
||||||
-
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
-==> #define LITTLEENDIAN 1
|
|
||||||
+#define LITTLEENDIAN 1
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
-==> #define INLINE inline
|
|
||||||
+#define INLINE inline
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
-==> #define THREAD_LOCAL _Thread_local
|
|
||||||
+#define THREAD_LOCAL
|
|
||||||
|
|
@ -1,159 +0,0 @@
|
|||||||
declare -a cdirs
|
|
||||||
declare -a ldirs
|
|
||||||
declare -a pdirs
|
|
||||||
declare -A hdeps
|
|
||||||
sources=(../../nix/sources.json ../../nix/sources-pmnsh.json)
|
|
||||||
[ "yes" == "${build_openssl-no}" ] && sources=(../../nix/sources-openssl.json ${sources[@]})
|
|
||||||
patches=compat/$1
|
|
||||||
deriver=urbit-$1-build
|
|
||||||
markfil=.$1~
|
|
||||||
depdirs=
|
|
||||||
nixpath=${NIX_STORE-../build}
|
|
||||||
|
|
||||||
: ${gnutar:=tar}
|
|
||||||
: ${gnumake:=make}
|
|
||||||
: ${sha256tool:=sha256sum}
|
|
||||||
|
|
||||||
export MAKE=$gnumake
|
|
||||||
|
|
||||||
# LDFLAGS doesn't like absolute paths
|
|
||||||
if [ "${nixpath:0:1}" == "/" ]
|
|
||||||
then
|
|
||||||
mkdir -p $nixpath
|
|
||||||
nixpath=$(realpath --relative-to=. $nixpath)
|
|
||||||
fi
|
|
||||||
|
|
||||||
hex2nixbase32 () {
|
|
||||||
local digits='0123456789abcdfghijklmnpqrsvwxyz'
|
|
||||||
local bits=0
|
|
||||||
local left=0 # number of bits left in $bits
|
|
||||||
local i=0
|
|
||||||
while ((1))
|
|
||||||
do
|
|
||||||
while ((left>=5))
|
|
||||||
do
|
|
||||||
echo -n ${digits:$((bits&31)):1}
|
|
||||||
bits=$((bits>>5))
|
|
||||||
left=$((left-5))
|
|
||||||
done
|
|
||||||
if ((i == ${#1}))
|
|
||||||
then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
char=0x${1:i:2}
|
|
||||||
i=$((i+2))
|
|
||||||
bits=$((bits|(char<<(left))))
|
|
||||||
left=$((left+8))
|
|
||||||
done
|
|
||||||
echo -n ${digits:$bits:1}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildnixdep () {
|
|
||||||
echo Building dependency $key...
|
|
||||||
local cache=https://app.cachix.org/api/v1/cache/${CACHIX_CACHE-}
|
|
||||||
local hash=
|
|
||||||
if [ -n "$url" ]
|
|
||||||
then
|
|
||||||
hash=${hdeps[$key]}
|
|
||||||
dir=$nixpath/$hash-$key
|
|
||||||
if [ -e $dir/$markfil ]
|
|
||||||
then
|
|
||||||
# dependency present, don't reupload
|
|
||||||
hash=
|
|
||||||
else
|
|
||||||
# dependency absent, check the binary cache if configured
|
|
||||||
if [ -n "${CACHIX_CACHE-}" ]
|
|
||||||
then
|
|
||||||
echo Checking binary cache for $hash-$key...
|
|
||||||
narinfo="$cache/${hash}.narinfo"
|
|
||||||
if curl -fLI "$narinfo"
|
|
||||||
then
|
|
||||||
url="$cache/$(curl -fL "$narinfo"|while IFS=: read k v; do if [ "$k" == "URL" ]; then echo $v; fi; done)"
|
|
||||||
echo Found $url
|
|
||||||
strip=0
|
|
||||||
hash=
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
mkdir -p $dir
|
|
||||||
pushd $dir
|
|
||||||
curl -fL "$url"|($gnutar --strip $strip -xzf - || true)
|
|
||||||
popd
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# local dependency
|
|
||||||
dir=../$key
|
|
||||||
fi
|
|
||||||
|
|
||||||
# patch and build the dependency if necessary
|
|
||||||
if [ ! -e $dir/$markfil ]
|
|
||||||
then
|
|
||||||
local patch=$patches/$key.patch
|
|
||||||
[ -e $patch ] && patch -d $dir -p 1 <$patch
|
|
||||||
pushd $dir
|
|
||||||
eval "$cmdprep"
|
|
||||||
eval $gnumake "$cmdmake"
|
|
||||||
touch $markfil
|
|
||||||
popd
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if configured, upload freshly built dependency to binary cache
|
|
||||||
if [ -n "$hash" -a -n "${CACHIX_AUTH_TOKEN-}" ]
|
|
||||||
then
|
|
||||||
(
|
|
||||||
echo Uploading freshly built $hash-$key to binary cache...
|
|
||||||
tar -C $dir -czf $hash.tar .
|
|
||||||
local size=$(stat -c '%s' $hash.tar)
|
|
||||||
read filehash _ < <($sha256tool $hash.tar)
|
|
||||||
curl -fL -H "Content-Type: application/gzip" -H "Authorization: Bearer $CACHIX_AUTH_TOKEN" --data-binary @"$hash.tar" "$cache/nar"
|
|
||||||
curl -fL -H "Content-Type: application/json" -H "Authorization: Bearer $CACHIX_AUTH_TOKEN" --data-binary @- "$cache/${hash}.narinfo" <<EOF
|
|
||||||
{
|
|
||||||
"cStoreHash": "$hash",
|
|
||||||
"cStoreSuffix": "$key",
|
|
||||||
"cNarHash": "$sha256tool:$(hex2nixbase32 $filehash)",
|
|
||||||
"cNarSize": $size,
|
|
||||||
"cFileHash": "$filehash",
|
|
||||||
"cFileSize": $size,
|
|
||||||
"cReferences": [],
|
|
||||||
"cDeriver": "$deriver"
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
echo Done. ) || true
|
|
||||||
rm $hash.tar || true
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# I have to go over the sources files several times
|
|
||||||
# because jq does not have a way to invoke external programs
|
|
||||||
jqprep='add|to_entries|.[]|.value.pmnsh as $p|select($p and $p.compat.'$1' != false)|(($p + $p.compat.'$1')|del(.compat)) as $o|'
|
|
||||||
|
|
||||||
# list external dependencies, create hash map and directory replacement regex
|
|
||||||
# use -j and \u0000 to work around https://github.com/stedolan/jq/issues/1870
|
|
||||||
while read -rd "" key json
|
|
||||||
do
|
|
||||||
# create 'store hash' from sources.json data and patch
|
|
||||||
patch=$patches/$key.patch
|
|
||||||
read hash _ < <((
|
|
||||||
echo -n $json
|
|
||||||
[ -e $patch ] && cat $patch)|$sha256tool)
|
|
||||||
hash=$(hex2nixbase32 $hash)
|
|
||||||
hdeps[$key]=$hash
|
|
||||||
depdirs="$depdirs|gsub(\"\\\\.\\\\./$key\";\"\\(\$d)/$hash-$key\")"
|
|
||||||
done < <(jq --arg deriver "$deriver" -Sscrj "$jqprep"'select(.value.url)|.key," ",{($deriver):(.value|del(.pmnsh) + ({'$1':$o}))},"\u0000"' ${sources[@]})
|
|
||||||
|
|
||||||
# build dependencies, create include and library directory arrays
|
|
||||||
. <(jq --arg nixpath "$nixpath" -sr "$jqprep"'(if .value.url then ".." else $nixpath end) as $d|"
|
|
||||||
unset dir
|
|
||||||
key=\(.key|@sh) \\
|
|
||||||
url=\(.value.url//""|@sh) \\
|
|
||||||
strip=\($o.strip+1) \\
|
|
||||||
cmdprep=\($o.prepare//""'"$depdirs"'|@sh) \\
|
|
||||||
cmdmake=\($o.make//""'"$depdirs"'|@sh) \\
|
|
||||||
buildnixdep # sets dir
|
|
||||||
pdirs+=($dir) # XX support json override a la cdirs/pdirs
|
|
||||||
\($o.include//"."|if type == "array" then . else [.] end|map("cdirs+=(-I$dir/\(.))")|join("\n"))
|
|
||||||
\($o.lib//"."|if type == "array" then . else [.] end|map("ldirs+=(-L$dir/\(.))")|join("\n"))"' ${sources[@]})
|
|
||||||
|
|
||||||
CFLAGS="${CFLAGS-} ${cdirs[@]}"
|
|
||||||
LDFLAGS="${LDFLAGS-} ${ldirs[@]}"
|
|
||||||
|
|
||||||
PKG_CONFIG_PATH="$(IFS=:;echo "${pdirs[*]}"):${PKG_CONFIG_PATH-}"
|
|
@ -1,11 +0,0 @@
|
|||||||
#ifndef _RSIGNAL_H
|
|
||||||
#define _RSIGNAL_H
|
|
||||||
|
|
||||||
#define rsignal_jmpbuf sigjmp_buf
|
|
||||||
#define rsignal_setjmp(buf) sigsetjmp((buf), 1)
|
|
||||||
#define rsignal_longjmp siglongjmp
|
|
||||||
#define rsignal_install_handler signal
|
|
||||||
#define rsignal_deinstall_handler(sig) signal((sig), SIG_IGN)
|
|
||||||
#define rsignal_setitimer setitimer
|
|
||||||
|
|
||||||
#endif//_RSIGNAL_H
|
|
225
pkg/urbit/configure
vendored
225
pkg/urbit/configure
vendored
@ -1,225 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
URBIT_VERSION="$(cat ./version)"
|
|
||||||
|
|
||||||
# we require pkg-config metadata to statically link these
|
|
||||||
#
|
|
||||||
pkgc_deps=" \
|
|
||||||
libcurl \
|
|
||||||
libh2o \
|
|
||||||
liburcrypt-0 \
|
|
||||||
libuv \
|
|
||||||
openssl \
|
|
||||||
"
|
|
||||||
|
|
||||||
deps=" \
|
|
||||||
ent \
|
|
||||||
gmp \
|
|
||||||
lmdb \
|
|
||||||
murmur3 \
|
|
||||||
pthread \
|
|
||||||
sigsegv \
|
|
||||||
softfloat3 \
|
|
||||||
"
|
|
||||||
|
|
||||||
echo '#pragma once' >include/config.h
|
|
||||||
|
|
||||||
defmacro () {
|
|
||||||
echo "#define $1 $2" >>include/config.h
|
|
||||||
}
|
|
||||||
|
|
||||||
defmacro URBIT_VERSION "\"$URBIT_VERSION\""
|
|
||||||
defmacro U3_VERE_PACE "\"${VERE_PACE:-once}\""
|
|
||||||
|
|
||||||
opt_debug=
|
|
||||||
opt_static=
|
|
||||||
|
|
||||||
while test $# != 0
|
|
||||||
do
|
|
||||||
case $1 in
|
|
||||||
--enable-debug)
|
|
||||||
opt_debug=1
|
|
||||||
;;
|
|
||||||
--disable-debug)
|
|
||||||
opt_debug=
|
|
||||||
;;
|
|
||||||
--enable-static)
|
|
||||||
opt_static=1
|
|
||||||
;;
|
|
||||||
--enable-shared)
|
|
||||||
opt_static=
|
|
||||||
;;
|
|
||||||
--disable-static)
|
|
||||||
opt_static=
|
|
||||||
;;
|
|
||||||
--disable-shared)
|
|
||||||
opt_static=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "unrecognized option: $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
[ -z "${NO_GUARD_PAGE-}" ] && defmacro U3_GUARD_PAGE 1
|
|
||||||
[ -n "${MEMORY_DEBUG-}" ] && defmacro U3_MEMORY_DEBUG 1
|
|
||||||
[ -n "${MEMORY_LOG-}" ] && defmacro U3_MEMORY_LOG 1
|
|
||||||
[ -n "${CPU_DEBUG-}" ] && defmacro U3_CPU_DEBUG 1
|
|
||||||
[ -n "${EVENT_TIME_DEBUG-}" ] && defmacro U3_EVENT_TIME_DEBUG 1
|
|
||||||
|
|
||||||
if [ -n "${HOST-}" ]
|
|
||||||
then os=$(sed 's$^[^-]*-\([^-]*\)-.*$\1$' <<< "$HOST")
|
|
||||||
cpu=$(sed 's$-.*$$' <<< ${HOST})
|
|
||||||
else os=$(uname -s)
|
|
||||||
cpu=$(uname -m)
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $(tr A-Z a-z <<< $cpu) in
|
|
||||||
unknown)
|
|
||||||
defmacro U3_OS_ENDIAN_little 1
|
|
||||||
;;
|
|
||||||
i386)
|
|
||||||
defmacro U3_OS_ENDIAN_little 1
|
|
||||||
;;
|
|
||||||
i686)
|
|
||||||
defmacro U3_OS_ENDIAN_little 1
|
|
||||||
;;
|
|
||||||
x86_64 | amd64)
|
|
||||||
defmacro U3_OS_ENDIAN_little 1
|
|
||||||
;;
|
|
||||||
arm64|aarch64)
|
|
||||||
defmacro U3_OS_ENDIAN_little 1
|
|
||||||
defmacro U3_CPU_aarch64 1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown or unsupported CPU: '$cpu'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# TODO Determine if the target cpu is little or big endian.
|
|
||||||
case $(tr A-Z a-z <<< $os) in
|
|
||||||
*mingw*)
|
|
||||||
# mingw builds are static-only
|
|
||||||
#
|
|
||||||
opt_static=1
|
|
||||||
|
|
||||||
# ensure required mingw packages are installed
|
|
||||||
mpkgs=(cmake curl gcc jq make)
|
|
||||||
pacman -S --needed autoconf automake-wrapper libtool patch ${mpkgs[@]/#/mingw-w64-x86_64-}
|
|
||||||
|
|
||||||
gnumake=mingw32-make
|
|
||||||
|
|
||||||
. compat/poor-mans-nix-shell.sh mingw
|
|
||||||
compat/create-include-files.sh 'stat -c %s' /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
|
|
||||||
|
|
||||||
defmacro U3_OS_mingw 1
|
|
||||||
|
|
||||||
deps="${deps/sigsegv}"
|
|
||||||
compat="${compat-} mingw"
|
|
||||||
;;
|
|
||||||
m1brew)
|
|
||||||
# ensure required packages are installed
|
|
||||||
brew install -q autoconf automake bash cmake coreutils gmp jq libsigsegv libtool libuv openssl pkgconfig
|
|
||||||
|
|
||||||
if (( ${BASH_VERSION%%.*} < 5 ))
|
|
||||||
then
|
|
||||||
echo Running bash version $BASH_VERSION is too low, please restart bash to use freshly installed one
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# for some reason pkg-config does not pick up openssl
|
|
||||||
export PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig:${PKG_CONFIG_PATH-}"
|
|
||||||
|
|
||||||
. compat/poor-mans-nix-shell.sh m1brew
|
|
||||||
compat/create-include-files.sh 'stat -f %z' /etc/ssl/cert.pem
|
|
||||||
|
|
||||||
defmacro U3_OS_osx 1
|
|
||||||
|
|
||||||
compat="${compat-} posix m1brew"
|
|
||||||
;;
|
|
||||||
*linux*)
|
|
||||||
defmacro U3_OS_linux 1
|
|
||||||
defmacro U3_OS_PROF 1
|
|
||||||
;;
|
|
||||||
*darwin*)
|
|
||||||
defmacro U3_OS_osx 1
|
|
||||||
defmacro U3_OS_PROF 1
|
|
||||||
;;
|
|
||||||
*apple*)
|
|
||||||
defmacro U3_OS_osx 1
|
|
||||||
defmacro U3_OS_PROF 1
|
|
||||||
;;
|
|
||||||
*freebsd*)
|
|
||||||
defmacro U3_OS_bsd 1
|
|
||||||
deps="$deps kvm" # XX use new compat.mk pattern
|
|
||||||
;;
|
|
||||||
*openbsd*)
|
|
||||||
# pkg_add bash automake libtool jq gtar cmake gmake libsigsegv gmp
|
|
||||||
# Tested versions:
|
|
||||||
# bash-5.1.8 automake-1.16.3 (autoconf-2.69p3) libtool-2.4.2p2
|
|
||||||
# jq-1.6p0 gtar-1.34-static cmake-3.20.3p0v0 gmake-4.3 libsigsegv-2.12
|
|
||||||
# gmp-6.2.1p0
|
|
||||||
|
|
||||||
gnutar=gtar
|
|
||||||
gnumake=gmake
|
|
||||||
sha256tool=sha256
|
|
||||||
build_openssl=yes
|
|
||||||
export AUTOCONF_VERSION="${AUTOCONF_VERSION-2.69}"
|
|
||||||
export AUTOMAKE_VERSION="${AUTOMAKE_VERSION-1.16}"
|
|
||||||
. compat/poor-mans-nix-shell.sh openbsd
|
|
||||||
compat/create-include-files.sh 'stat -f %z' /etc/ssl/cert.pem
|
|
||||||
|
|
||||||
defmacro U3_OS_bsd 1
|
|
||||||
defmacro U3_OS_no_ubc 1
|
|
||||||
|
|
||||||
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH-}"
|
|
||||||
deps="$deps aes_siv secp256k1"
|
|
||||||
|
|
||||||
compat="${compat-} posix openbsd"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown or unsupported OS: '$os'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
PKG_CONFIG="${PKG_CONFIG-pkg-config}"
|
|
||||||
|
|
||||||
if [ -n "${opt_static-}" ]
|
|
||||||
then
|
|
||||||
CFLAGS="${CFLAGS-} -static"
|
|
||||||
# XX can't set -static here due libuv's -ldl on MacOS
|
|
||||||
#
|
|
||||||
# LDFLAGS="${LDFLAGS-} -static"
|
|
||||||
PKG_CONFIG="$PKG_CONFIG --static"
|
|
||||||
fi
|
|
||||||
|
|
||||||
CFLAGS="${CFLAGS-} $($PKG_CONFIG --cflags $pkgc_deps)"
|
|
||||||
LDFLAGS="${LDFLAGS-} $($PKG_CONFIG --libs $pkgc_deps)"
|
|
||||||
|
|
||||||
for dep in $deps; do
|
|
||||||
LDFLAGS="${LDFLAGS-} -l$dep"
|
|
||||||
done
|
|
||||||
|
|
||||||
compat="${compat-posix}"
|
|
||||||
for citem in $compat; do
|
|
||||||
CFLAGS="${CFLAGS-} -Icompat/$citem"
|
|
||||||
done
|
|
||||||
|
|
||||||
cat >config.mk <<EOF
|
|
||||||
CFLAGS := $CFLAGS -funsigned-char -ffast-math -fcommon -std=gnu99 -Wno-format-zero-length
|
|
||||||
LDFLAGS := $LDFLAGS
|
|
||||||
CC := ${CC-cc}
|
|
||||||
compat := $compat
|
|
||||||
debug := $opt_debug
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo == config.mk == >&2
|
|
||||||
cat config.mk >&2
|
|
||||||
|
|
||||||
echo == include/config.h == >&2
|
|
||||||
cat include/config.h >&2
|
|
@ -1,86 +0,0 @@
|
|||||||
#include "noun.h"
|
|
||||||
|
|
||||||
/* _setup(): prepare for tests.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
_setup(void)
|
|
||||||
{
|
|
||||||
// XX at 1<<24, this succeeds on mac, but bail:exit's on linux.
|
|
||||||
// investigate possible u3n_prog corruption
|
|
||||||
//
|
|
||||||
u3m_init(1 << 25);
|
|
||||||
u3m_pave(c3y);
|
|
||||||
u3e_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static u3_noun
|
|
||||||
_nock_fol(u3_noun fol)
|
|
||||||
{
|
|
||||||
return u3n_nock_on(u3_nul, fol);
|
|
||||||
}
|
|
||||||
|
|
||||||
static c3_i
|
|
||||||
_test_nock_meme(void)
|
|
||||||
{
|
|
||||||
// (jam !=(=(~ =|(i=@ |-(?:(=(i ^~((bex 32))) ~ [i $(i +(i))]))))))
|
|
||||||
//
|
|
||||||
const c3_y buf_y[] = {
|
|
||||||
0xe1, 0x16, 0x1b, 0x4, 0x1b, 0xe1, 0x20, 0x58, 0x1c, 0x76, 0x4d, 0x96, 0xd8,
|
|
||||||
0x31, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x8, 0x37, 0xce, 0xd, 0x92, 0x21,
|
|
||||||
0x83, 0x68, 0x61, 0x87, 0x39, 0xce, 0x4d, 0xe, 0x92, 0x21, 0x87, 0x19, 0x8
|
|
||||||
};
|
|
||||||
u3_noun fol = u3s_cue_bytes(sizeof(buf_y), buf_y);
|
|
||||||
u3_noun gon;
|
|
||||||
c3_w i_w;
|
|
||||||
c3_i ret_i = 1;
|
|
||||||
|
|
||||||
for ( i_w = 0; i_w < 3; i_w++ ) {
|
|
||||||
gon = u3m_soft(0, _nock_fol, u3k(fol));
|
|
||||||
|
|
||||||
if ( c3n == u3r_p(gon, c3__meme, 0) ) {
|
|
||||||
u3m_p("nock meme unexpected mote", u3h(gon));
|
|
||||||
ret_i = 0;
|
|
||||||
u3z(gon);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
u3z(gon);
|
|
||||||
}
|
|
||||||
|
|
||||||
u3z(fol);
|
|
||||||
|
|
||||||
return ret_i;
|
|
||||||
}
|
|
||||||
|
|
||||||
static c3_i
|
|
||||||
_test_nock(void)
|
|
||||||
{
|
|
||||||
c3_i ret_i = 1;
|
|
||||||
|
|
||||||
if ( !_test_nock_meme() ) {
|
|
||||||
fprintf(stderr, "test nock meme: failed\r\n");
|
|
||||||
ret_i = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret_i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* main(): run all test cases.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
_setup();
|
|
||||||
|
|
||||||
if ( !_test_nock() ) {
|
|
||||||
fprintf(stderr, "test nock: failed\r\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// GC
|
|
||||||
//
|
|
||||||
u3m_grab(u3_none);
|
|
||||||
|
|
||||||
fprintf(stderr, "test nock: ok\r\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
1.15
|
|
Loading…
Reference in New Issue
Block a user