From 8b43d5a488ec5b34e7d666530b867c74151962bb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 9 Apr 2024 13:10:06 -0500 Subject: [PATCH] use macports-legacy-support for OS X disabled for macOS onwards modified version without APSL licensed files --- CMakeLists.txt | 7 + extern/macports-legacy-support/.gitignore | 7 + extern/macports-legacy-support/.travis.yml | 3 + extern/macports-legacy-support/BUILDING.txt | 38 ++ extern/macports-legacy-support/LICENSE | 19 + extern/macports-legacy-support/Makefile | 346 +++++++++++ extern/macports-legacy-support/README.md | 245 ++++++++ .../include/CoreFoundation/CoreFoundation.h | 33 ++ .../include/IOKit/usb/USB.h | 32 ++ .../include/MacportsLegacySupport.h | 204 +++++++ .../include/OpenGL/gliDispatch.h | 43 ++ .../include/TargetConditionals.h | 52 ++ .../macports-legacy-support/include/assert.h | 19 + extern/macports-legacy-support/include/cmath | 96 ++++ .../include/copyfile.h | 35 ++ .../macports-legacy-support/include/dirent.h | 42 ++ .../include/mach/machine.h | 22 + extern/macports-legacy-support/include/math.h | 108 ++++ .../macports-legacy-support/include/net/if.h | 30 + .../macports-legacy-support/include/netdb.h | 33 ++ .../macports-legacy-support/include/os/lock.h | 63 ++ .../macports-legacy-support/include/pthread.h | 43 ++ .../include/pthread_impl.h | 34 ++ .../macports-legacy-support/include/stdio.h | 102 ++++ .../macports-legacy-support/include/stdlib.h | 79 +++ .../macports-legacy-support/include/string.h | 56 ++ .../macports-legacy-support/include/strings.h | 62 ++ .../macports-legacy-support/include/sys/aio.h | 57 ++ .../include/sys/fcntl.h | 64 +++ .../include/sys/fsgetpath.h | 46 ++ .../include/sys/mman.h | 33 ++ .../include/sys/queue.h | 39 ++ .../include/sys/random.h | 37 ++ .../include/sys/socket.h | 48 ++ .../include/sys/spawn.h | 39 ++ .../include/sys/stat.h | 76 +++ .../include/sys/time.h | 37 ++ .../include/sys/unistd.h | 93 +++ extern/macports-legacy-support/include/time.h | 105 ++++ .../include/uuid/uuid.h | 36 ++ .../macports-legacy-support/include/wchar.h | 53 ++ .../include/xlocale/_wchar.h | 35 ++ .../macports-legacy-support/src/add_symbols.c | 83 +++ .../macports-legacy-support/src/arc4random.c | 540 ++++++++++++++++++ .../macports-legacy-support/src/arc4random.h | 49 ++ .../src/dirfuncs_compat.c | 81 +++ .../src/dirfuncs_compat.h | 48 ++ extern/macports-legacy-support/src/dprintf.c | 39 ++ extern/macports-legacy-support/src/fmemopen.c | 262 +++++++++ .../src/fsetattrlist.c | 77 +++ .../macports-legacy-support/src/fsgetpath.c | 80 +++ extern/macports-legacy-support/src/getdelim.c | 105 ++++ extern/macports-legacy-support/src/getdelim.h | 37 ++ .../macports-legacy-support/src/getentropy.c | 89 +++ extern/macports-legacy-support/src/getline.c | 48 ++ extern/macports-legacy-support/src/getline.h | 37 ++ .../src/macports_legacy_atexit.c | 82 +++ .../src/macports_legacy_copyfile.c | 78 +++ .../src/macports_legacy_os_unfair_lock.c | 36 ++ .../src/macports_legacy_realpath.c | 54 ++ .../src/macports_legacy_symbol_aliases.c | 63 ++ .../src/macports_legacy_sysconf.c | 98 ++++ extern/macports-legacy-support/src/memmem.c | 72 +++ .../macports-legacy-support/src/memstream.c | 180 ++++++ .../src/pthread_setname_np.c | 25 + extern/macports-legacy-support/src/sincos.c | 36 ++ extern/macports-legacy-support/src/strings.c | 99 ++++ extern/macports-legacy-support/src/strndup.c | 66 +++ extern/macports-legacy-support/src/strndup.h | 41 ++ extern/macports-legacy-support/src/strnlen.c | 58 ++ extern/macports-legacy-support/src/strnlen.h | 46 ++ extern/macports-legacy-support/src/time.c | 147 +++++ .../src/wcpcpy_family.c | 37 ++ .../src/wcscasecmp_family.c | 65 +++ extern/macports-legacy-support/src/wcsdup.c | 49 ++ extern/macports-legacy-support/src/wcsnlen.c | 44 ++ 76 files changed, 5602 insertions(+) create mode 100644 extern/macports-legacy-support/.gitignore create mode 100644 extern/macports-legacy-support/.travis.yml create mode 100644 extern/macports-legacy-support/BUILDING.txt create mode 100644 extern/macports-legacy-support/LICENSE create mode 100644 extern/macports-legacy-support/Makefile create mode 100644 extern/macports-legacy-support/README.md create mode 100644 extern/macports-legacy-support/include/CoreFoundation/CoreFoundation.h create mode 100644 extern/macports-legacy-support/include/IOKit/usb/USB.h create mode 100644 extern/macports-legacy-support/include/MacportsLegacySupport.h create mode 100644 extern/macports-legacy-support/include/OpenGL/gliDispatch.h create mode 100644 extern/macports-legacy-support/include/TargetConditionals.h create mode 100644 extern/macports-legacy-support/include/assert.h create mode 100644 extern/macports-legacy-support/include/cmath create mode 100644 extern/macports-legacy-support/include/copyfile.h create mode 100644 extern/macports-legacy-support/include/dirent.h create mode 100644 extern/macports-legacy-support/include/mach/machine.h create mode 100644 extern/macports-legacy-support/include/math.h create mode 100644 extern/macports-legacy-support/include/net/if.h create mode 100644 extern/macports-legacy-support/include/netdb.h create mode 100644 extern/macports-legacy-support/include/os/lock.h create mode 100644 extern/macports-legacy-support/include/pthread.h create mode 100644 extern/macports-legacy-support/include/pthread_impl.h create mode 100644 extern/macports-legacy-support/include/stdio.h create mode 100644 extern/macports-legacy-support/include/stdlib.h create mode 100644 extern/macports-legacy-support/include/string.h create mode 100644 extern/macports-legacy-support/include/strings.h create mode 100644 extern/macports-legacy-support/include/sys/aio.h create mode 100644 extern/macports-legacy-support/include/sys/fcntl.h create mode 100644 extern/macports-legacy-support/include/sys/fsgetpath.h create mode 100644 extern/macports-legacy-support/include/sys/mman.h create mode 100644 extern/macports-legacy-support/include/sys/queue.h create mode 100644 extern/macports-legacy-support/include/sys/random.h create mode 100644 extern/macports-legacy-support/include/sys/socket.h create mode 100644 extern/macports-legacy-support/include/sys/spawn.h create mode 100644 extern/macports-legacy-support/include/sys/stat.h create mode 100644 extern/macports-legacy-support/include/sys/time.h create mode 100644 extern/macports-legacy-support/include/sys/unistd.h create mode 100644 extern/macports-legacy-support/include/time.h create mode 100644 extern/macports-legacy-support/include/uuid/uuid.h create mode 100644 extern/macports-legacy-support/include/wchar.h create mode 100644 extern/macports-legacy-support/include/xlocale/_wchar.h create mode 100644 extern/macports-legacy-support/src/add_symbols.c create mode 100644 extern/macports-legacy-support/src/arc4random.c create mode 100644 extern/macports-legacy-support/src/arc4random.h create mode 100644 extern/macports-legacy-support/src/dirfuncs_compat.c create mode 100644 extern/macports-legacy-support/src/dirfuncs_compat.h create mode 100644 extern/macports-legacy-support/src/dprintf.c create mode 100644 extern/macports-legacy-support/src/fmemopen.c create mode 100644 extern/macports-legacy-support/src/fsetattrlist.c create mode 100644 extern/macports-legacy-support/src/fsgetpath.c create mode 100644 extern/macports-legacy-support/src/getdelim.c create mode 100644 extern/macports-legacy-support/src/getdelim.h create mode 100644 extern/macports-legacy-support/src/getentropy.c create mode 100644 extern/macports-legacy-support/src/getline.c create mode 100644 extern/macports-legacy-support/src/getline.h create mode 100644 extern/macports-legacy-support/src/macports_legacy_atexit.c create mode 100644 extern/macports-legacy-support/src/macports_legacy_copyfile.c create mode 100644 extern/macports-legacy-support/src/macports_legacy_os_unfair_lock.c create mode 100644 extern/macports-legacy-support/src/macports_legacy_realpath.c create mode 100644 extern/macports-legacy-support/src/macports_legacy_symbol_aliases.c create mode 100644 extern/macports-legacy-support/src/macports_legacy_sysconf.c create mode 100644 extern/macports-legacy-support/src/memmem.c create mode 100644 extern/macports-legacy-support/src/memstream.c create mode 100644 extern/macports-legacy-support/src/pthread_setname_np.c create mode 100644 extern/macports-legacy-support/src/sincos.c create mode 100644 extern/macports-legacy-support/src/strings.c create mode 100644 extern/macports-legacy-support/src/strndup.c create mode 100644 extern/macports-legacy-support/src/strndup.h create mode 100644 extern/macports-legacy-support/src/strnlen.c create mode 100644 extern/macports-legacy-support/src/strnlen.h create mode 100644 extern/macports-legacy-support/src/time.c create mode 100644 extern/macports-legacy-support/src/wcpcpy_family.c create mode 100644 extern/macports-legacy-support/src/wcscasecmp_family.c create mode 100644 extern/macports-legacy-support/src/wcsdup.c create mode 100644 extern/macports-legacy-support/src/wcsnlen.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 73c7f4d87..17c68dcd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -759,6 +759,13 @@ if (WIN32) list(APPEND ENGINE_SOURCES res/furnace.rc) endif() +if (APPLE) + if (CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.12) + list(APPEND DEPENDENCIES_INCLUDE_DIRS extern/macports-legacy-support/include) + list(APPEND ENGINE_SOURCES extern/macports-legacy-support/src/time.c) + endif() +endif() + set(CLI_SOURCES src/cli/cli.cpp ) diff --git a/extern/macports-legacy-support/.gitignore b/extern/macports-legacy-support/.gitignore new file mode 100644 index 000000000..f4d9a80b0 --- /dev/null +++ b/extern/macports-legacy-support/.gitignore @@ -0,0 +1,7 @@ +*.o +*.o.* +*.d +*.dylib +lib +*~ +*.dSYM diff --git a/extern/macports-legacy-support/.travis.yml b/extern/macports-legacy-support/.travis.yml new file mode 100644 index 000000000..ef1dff3ef --- /dev/null +++ b/extern/macports-legacy-support/.travis.yml @@ -0,0 +1,3 @@ +language: c +os: osx +script: make && sudo make install && make test diff --git a/extern/macports-legacy-support/BUILDING.txt b/extern/macports-legacy-support/BUILDING.txt new file mode 100644 index 000000000..237e76443 --- /dev/null +++ b/extern/macports-legacy-support/BUILDING.txt @@ -0,0 +1,38 @@ +## Building + +Usual Makefile project. This project does not require a configure phase. + +### Special optional variables + +# `PLATFORM` + +Darwin version to target against. Detected automatically, but can also +be overridden manually to test builds for other OS versions. +(This is not the macOS version.) + +# `FORCE_ARCH` + +Architecture to build for. Accepts a single value, not a list. + +If your `lipo` binary is new enough and supports the `-archs` flag, you will +not need to use this variable. Instead, directly build the software +universally in one pass using the usual `-arch` compiler flags. The +autodetection, split and merge features will then handle the different +architectures automatically. + +Older versions of `lipo` do not support the `-archs` flag, so automatic +architecture detection via binary/object file inspection is not be possible +on older platforms. + +In order to avoid an additional dependency on the `cctools` port +to provide a newer `lipo` version, this variable was introduced. +It disables the automatic architecture detection feature and instead +hardcodes the contained value as the target architecture. + +Within `MacPorts`, we use it in multi-architecture builds with one +pass per architecture. Finally, the `MacPorts ``muniversal` PortGroup +will merge the resulting binaries into one fat/universal binary automatically. + +Some symbols must be built multiple times. Each variant will use a different +data layout and have a special postfix appended to it. The data layouts +supported and needed depend upon the architecture and (target) OS version. diff --git a/extern/macports-legacy-support/LICENSE b/extern/macports-legacy-support/LICENSE new file mode 100644 index 000000000..f894050cf --- /dev/null +++ b/extern/macports-legacy-support/LICENSE @@ -0,0 +1,19 @@ +All the files under Apple Public Source License have been removed for compliance. +The remaining files are under MIT License. + +Parts of this project that have been created by members of the MacPorts community +are under the MIT License + +Copyright (c) 2018-2020 Chris Jones, Michael Dickens +Mihai Moldovan, and many other contributing members of the MacPorts community + +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. diff --git a/extern/macports-legacy-support/Makefile b/extern/macports-legacy-support/Makefile new file mode 100644 index 000000000..feb2460fc --- /dev/null +++ b/extern/macports-legacy-support/Makefile @@ -0,0 +1,346 @@ +# GNU Makefile for MacportsLegacySupport +# Copyright (c) 2018 Chris Jones +# Copyright (c) 2019 Michael Dickens +# +# Permission to use, copy, modify, and 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. + +DESTDIR ?= +PREFIX ?= /usr/local +INCSUBDIR = LegacySupport +PKGINCDIR = $(PREFIX)/include/$(INCSUBDIR) +LIBDIR = $(PREFIX)/lib +AREXT = .a +SOEXT = .dylib +LIBNAME = MacportsLegacySupport +SYSLIBNAME = MacportsLegacySystem.B +DLIBFILE = lib$(LIBNAME)$(SOEXT) +SLIBFILE = lib$(LIBNAME)$(AREXT) +SYSLIBFILE = lib$(SYSLIBNAME)$(SOEXT) +DLIBPATH = $(LIBDIR)/$(DLIBFILE) +SLIBPATH = $(LIBDIR)/$(SLIBFILE) +SYSLIBPATH = $(LIBDIR)/$(SYSLIBFILE) +BUILDDLIBDIR = lib +BUILDSLIBDIR = lib +BUILDDLIBPATH = $(BUILDDLIBDIR)/$(DLIBFILE) +BUILDSLIBPATH = $(BUILDSLIBDIR)/$(SLIBFILE) +BUILDSYSLIBPATH = $(BUILDDLIBDIR)/$(SYSLIBFILE) +SOCURVERSION ?= 1.0 +SOCOMPATVERSION ?= 1.0 +BUILDDLIBFLAGS = -dynamiclib -headerpad_max_install_names \ + -install_name @executable_path/../$(BUILDDLIBPATH) \ + -current_version $(SOCURVERSION) \ + -compatibility_version $(SOCOMPATVERSION) +BUILDSYSLIBFLAGS = -dynamiclib -headerpad_max_install_names \ + -install_name @executable_path/../$(BUILDSYSLIBPATH) \ + -current_version $(SOCURVERSION) \ + -compatibility_version $(SOCOMPATVERSION) +SYSREEXPORTFLAG = -Wl,-reexport_library /usr/lib/libSystem.B.dylib +BUILDSLIBFLAGS = -qs +POSTINSTALL = install_name_tool + +MAX_DARWIN_REEXPORT ?= 19 + +FORCE_ARCH ?= +ARCHFLAGS ?= +LIPO ?= lipo +CC ?= cc $(ARCHFLAGS) +CFLAGS ?= -Os -Wall -Wno-deprecated-declarations +DLIBCFLAGS ?= -fPIC +SLIBCFLAGS ?= +CXX ?= c++ $(ARCHFLAGS) +CXXFLAGS ?= -Os -Wall +LD ?= ld +LDFLAGS ?= +AR ?= ar + +UNAME ?= uname +SED ?= /usr/bin/sed +GREP ?= /usr/bin/grep +CP ?= /bin/cp + +MKINSTALLDIRS = install -d -m 755 +INSTALL_PROGRAM = install -c -m 755 +INSTALL_DATA = install -c -m 644 +RM = rm -f +RMDIR = sh -c 'for d; do test ! -d "$$d" || rmdir -p "$$d"; done' rmdir + +PLATFORM ?= $(shell $(UNAME) -r | $(SED) -ne 's/\([0-9][0-9]*\)\..*/\1/p') + +SRCDIR = src +SRCINCDIR = include +# Use VAR := $(shell CMD) instead of VAR != CMD to support old make versions +FIND_LIBHEADERS := find $(SRCINCDIR) -type f \( -name '*.h' -o \ + \( -name 'c*' ! -name '*.*' \) \) +LIBHEADERS := $(shell $(FIND_LIBHEADERS)) +ALLHEADERS := $(LIBHEADERS) $(wildcard $(SRCDIR)/*.h) + +MULTISRCS := $(SRCDIR)/fdopendir.c +ADDSRCS := $(SRCDIR)/add_symbols.c +LIBSRCS := $(filter-out $(MULTISRCS) $(ADDSRCS),$(wildcard $(SRCDIR)/*.c)) + +DLIBOBJEXT = .dl.o +SLIBOBJEXT = .o +DLIBOBJS := $(patsubst %.c,%$(DLIBOBJEXT),$(LIBSRCS)) +MULTIDLIBOBJS := $(patsubst %.c,%$(DLIBOBJEXT),$(MULTISRCS)) +SLIBOBJS := $(patsubst %.c,%$(SLIBOBJEXT),$(LIBSRCS)) +MULTISLIBOBJS := $(patsubst %.c,%$(SLIBOBJEXT),$(MULTISRCS)) +ADDOBJS := $(patsubst %.c,%$(SLIBOBJEXT),$(ADDSRCS)) + +TESTDIR = test +TESTNAMEPREFIX = $(TESTDIR)/test_ +TESTRUNPREFIX = run_ +TESTLDFLAGS = -L$(BUILDDLIBDIR) $(LDFLAGS) +TESTLIBS = -l$(LIBNAME) +TESTSRCS_C := $(wildcard $(TESTNAMEPREFIX)*.c) +TESTSRCS_CPP := $(wildcard $(TESTNAMEPREFIX)*.cpp) +TESTOBJS_C := $(patsubst %.c,%.o,$(TESTSRCS_C)) +TESTOBJS_CPP := $(patsubst %.cpp,%.o,$(TESTSRCS_CPP)) +TESTPRGS_C := $(patsubst %.c,%,$(TESTSRCS_C)) +TESTPRGS_CPP := $(patsubst %.cpp,%,$(TESTSRCS_CPP)) +TESTPRGS = $(TESTPRGS_C) $(TESTPRGS_CPP) +TESTRUNS := $(patsubst $(TESTNAMEPREFIX)%,$(TESTRUNPREFIX)%,$(TESTPRGS)) + +define splitandfilterandmergemultiarch + output='$(1)' && \ + lipo='$(2)' && \ + rm='$(3)' && \ + cp='$(4)' && \ + ld='$(5)' && \ + grep='$(6)' && \ + platform='$(7)' && \ + force_arch='$(8)' && \ + objectlist="$${output}".* && \ + archlist='' && \ + fatness='' && \ + for object in $${objectlist}; do \ + if [ -z "$${force_arch}" ]; then \ + archlist_new="$$($${lipo} -archs "$${object}")"; \ + else \ + archlist_new="$${force_arch}"; \ + fi && \ + if [ -n "$${archlist}" ] && [ "$${archlist}" != "$${archlist_new}" ]; then \ + printf 'Old/previous architecture list "%s" does not match new one "%s", this is unsupported.\n' "$${archlist}" "$${archlist_new}" >&2 && \ + exit '1'; \ + else \ + archlist="$${archlist_new}"; \ + fi && \ + ( $${lipo} -info "$${object}" | grep -qs '^Non-fat file:' ); \ + fatness_new="$${?}" && \ + if [ -n "$${fatness}" ] && [ "$${fatness}" != "$${fatness_new}" ]; then \ + printf 'Old/previous fatness value "%d" does not match new one "%d", this is unsupported.\n' "$${fatness}" "$${fatness_new}" >&2 && \ + exit '2'; \ + else \ + fatness="$${fatness_new}"; \ + fi && \ + if [ -n "$${force_arch}" ] && [ '0' -ne "$${fatness}" ]; then \ + printf 'Architecture forced to "%s", but object file "%s" is a multi-architecture (fat) object file, this is unsupported.\n' "$${force_arch}" "$${object}" >&2 && \ + exit '3'; \ + fi && \ + $$(: 'Check for unknown architectures.') && \ + for arch in $${archlist}; do \ + case "$${arch}" in \ + (unknown*) \ + printf 'Unknown architecture "%s" encountered, this is unsupported.\n' "$${arch}" >&2 && \ + exit '4'; \ + ;; \ + (*) \ + ;; \ + esac && \ + if [ '0' -eq "$${fatness}" ]; then \ + $${cp} "$${object}" "$${object}.$${arch}" && \ + $$(: 'A non-fat file cannot have more than one architecture, but breaking out sounds weird.'); \ + else \ + $${lipo} "$${object}" -thin "$${arch}" -output "$${object}.$${arch}"; \ + fi; \ + done && \ + $${rm} "$${object}"; \ + done && \ + $$(: '... and use ld to merge each variant into a single-architecture object file ...') && \ + for arch in $${archlist}; do \ + $$(: 'Filter out variants not applicable to certain architectures.') && \ + $$(: 'For instance, the x86_64 architecture is fully UNIX2003-compliant and thus does not have $$UNIX2003-compat functons.') && \ + $$(: 'On the contrary, the i386 architecture has only $$UNIX2003-compat functions for the $$INODE64 feature set.') && \ + $$(: '10.4 is so old that it does not even have the $$INODE64 feature.') && \ + case "$${arch}" in \ + ('x86_64') \ + $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode64.$${arch}" -o "$${output}.$${arch}"; \ + ;; \ + ('ppc64') \ + if [ '9' -gt "$${platform}" ]; then \ + $${ld} -r "$${output}.inode32.$${arch}" -o "$${output}.$${arch}"; \ + else \ + $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode64.$${arch}" -o "$${output}.$${arch}"; \ + fi; \ + ;; \ + ('i386'|'ppc'|'ppc7400') \ + if [ '9' -gt "$${platform}" ]; then \ + $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode32unix2003.$${arch}" -o "$${output}.$${arch}"; \ + else \ + $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode32unix2003.$${arch}" "$${output}.inode64unix2003.$${arch}" -o "$${output}.$${arch}"; \ + fi; \ + ;; \ + (*) \ + $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode32unix2003.$${arch}" "$${output}.inode64.$${arch}" "$${output}.inode64unix2003.$${arch}" -o "$${output}.$${arch}"; \ + ;; \ + esac; \ + done && \ + $$(: '... build list of single-architecture merged object files ...') && \ + objectarchlist='' && \ + for arch in $${archlist}; do \ + objectarchlist="$${objectarchlist} $${output}.$${arch}"; \ + done && \ + if [ '0' -eq "$${fatness}" ]; then \ + $$(: 'Thin files can just be copied directly, assuming that the list will only contain one element.') && \ + $${cp} $${objectarchlist} "$${output}"; \ + else \ + $$(: '... and eventually use lipo to merge them all together!') && \ + $${lipo} $${objectarchlist} -create -output "$${output}"; \ + fi +endef + +all: dlib slib syslib +dlib: $(BUILDDLIBPATH) +slib: $(BUILDSLIBPATH) +syslib: dlib $(BUILDSYSLIBPATH) + +# Special rules for special implementations. +# For instance, functions using struct stat need to be implemented multiple +# times with different stat structs - a 32-bit-inode based one and a 64-bit- +# inode-based one. +$(MULTIDLIBOBJS): %$(DLIBOBJEXT): %.c $(ALLHEADERS) + # Generate possibly multi-architecture object files ... + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(DLIBCFLAGS) -D__DARWIN_UNIX03=0 -D__DARWIN_64_BIT_INO_T=0 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode32 + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(DLIBCFLAGS) -D__DARWIN_UNIX03=1 -D__DARWIN_ONLY_UNIX_CONFORMANCE=0 -D__DARWIN_64_BIT_INO_T=0 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode32unix2003 + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(DLIBCFLAGS) -D__DARWIN_UNIX03=1 -D__DARWIN_ONLY_UNIX_CONFORMANCE=1 -D__DARWIN_64_BIT_INO_T=1 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode64 + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(DLIBCFLAGS) -D__DARWIN_UNIX03=1 -D__DARWIN_ONLY_UNIX_CONFORMANCE=0 -D__DARWIN_64_BIT_INO_T=1 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode64unix2003 + # ... and split them up, because ld can only generate single-architecture files ... + $(call splitandfilterandmergemultiarch,$@,$(LIPO),$(RM),$(CP),$(LD),$(GREP),$(PLATFORM),$(FORCE_ARCH)) + +$(MULTISLIBOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS) + # Generate possibly multi-architecture object files ... + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(SLIBCFLAGS) -D__DARWIN_UNIX03=0 -D__DARWIN_64_BIT_INO_T=0 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode32 + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(SLIBCFLAGS) -D__DARWIN_UNIX03=1 -D__DARWIN_ONLY_UNIX_CONFORMANCE=0 -D__DARWIN_64_BIT_INO_T=0 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode32unix2003 + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(SLIBCFLAGS) -D__DARWIN_UNIX03=1 -D__DARWIN_ONLY_UNIX_CONFORMANCE=1 -D__DARWIN_64_BIT_INO_T=1 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode64 + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(SLIBCFLAGS) -D__DARWIN_UNIX03=1 -D__DARWIN_ONLY_UNIX_CONFORMANCE=0 -D__DARWIN_64_BIT_INO_T=1 -D__DARWIN_ONLY_64_BIT_INO_T=0 $< -o $@.inode64unix2003 + # ... and split them up, because ld can only generate single-architecture files ... + $(call splitandfilterandmergemultiarch,$@,$(LIPO),$(RM),$(CP),$(LD),$(GREP),$(PLATFORM),$(FORCE_ARCH)) + +# Generously marking all header files as potential dependencies +$(DLIBOBJS): %$(DLIBOBJEXT): %.c $(ALLHEADERS) + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(DLIBCFLAGS) $< -o $@ + +$(SLIBOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS) + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(SLIBCFLAGS) $< -o $@ + +$(ADDOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS) + $(CC) -c -I$(SRCINCDIR) $(CFLAGS) $(SLIBCFLAGS) $< -o $@ + +$(TESTOBJS_C): %.o: %.c $(ALLHEADERS) + $(CC) -c -std=c99 -I$(SRCINCDIR) $(CFLAGS) $< -o $@ + +$(TESTOBJS_CPP): %.o: %.cpp $(ALLHEADERS) + $(CXX) -c -I$(SRCINCDIR) $(CXXFLAGS) $< -o $@ + +$(BUILDDLIBPATH): $(DLIBOBJS) $(MULTIDLIBOBJS) + $(MKINSTALLDIRS) $(BUILDDLIBDIR) + $(CC) $(BUILDDLIBFLAGS) $(LDFLAGS) $^ -o $@ + +# Wrapped libSystem relies on reexport which does not work on Darwin20+ +$(BUILDSYSLIBPATH): $(DLIBOBJS) $(MULTIDLIBOBJS) $(ADDOBJS) +ifeq ($(shell test $(PLATFORM) -le $(MAX_DARWIN_REEXPORT); echo $$?),0) + $(MKINSTALLDIRS) $(BUILDDLIBDIR) + $(CC) $(BUILDSYSLIBFLAGS) $(LDFLAGS) $(SYSREEXPORTFLAG) $^ -o $@ +endif + +$(BUILDSLIBPATH): $(SLIBOBJS) $(MULTISLIBOBJS) + $(MKINSTALLDIRS) $(BUILDSLIBDIR) + $(RM) $@ + $(AR) $(BUILDSLIBFLAGS) $@ $^ + +$(TESTPRGS_C): %: %.o $(BUILDDLIBPATH) + $(CC) $(TESTLDFLAGS) $< $(TESTLIBS) -o $@ + +$(TESTPRGS_CPP): %: %.o $(BUILDDLIBPATH) + $(CXX) $(TESTLDFLAGS) $< $(TESTLIBS) -o $@ + +# Special clause for testing the cmath fix: Just need to verify that +# building succeeds or fails, not that the executable runs or what it +# produces. Note that for some reason all Clang compilers tested +# (Apple and MP) successfully compile and link this code regardless of +# the c++ standard chosen, which seems to be a build issue since the +# functions being tested were not introduced until c++11. GCC +# correctly fails the compile and link using c++03 or older, but +# succeeds using c++11 -- as desired. +test_cmath: test/test_cmath.cc $(ALLHEADERS) + $(info 1: testing compiler '$(CXX)' for non-legacy cmath using c++03; the build should fail, regardless of the compiler or OS) + $(info 1: $(CXX) $(CXXFLAGS) -std=c++03 $< -o test/$@_cxx03) + @-$(CXX) -I$(SRCINCDIR) $(CXXFLAGS) -std=c++03 $< -o test/$@_cxx03 &> /dev/null && echo "1: c++03 no legacy cmath build success (test failed)!" || echo "1: c++03 no legacy cmath build failure (test succeeded)!" + $(info 2: testing compiler '$(CXX)' for non-legacy cmath using c++03; the build should fail, regardless of the compiler or OS) + $(info 2: $(CXX) -I$(SRCINCDIR) $(CXXFLAGS) -std=c++03 $< -o test/$@_cxx03) + @-$(CXX) -I$(SRCINCDIR) $(CXXFLAGS) -std=c++03 $< -o test/$@_cxx03 &> /dev/null && echo "2: c++03 legacy cmath build success (test failed)!" || echo "2: c++03 legacy cmath build failure (test succeeded)!" + $(info 3: testing compiler '$(CXX)' for non-legacy cmath using c++11; if the compiler supports this standard, then the build should succeed regardless of OS) + $(info 3: $(CXX) $(CXXFLAGS) -std=c++11 $< -o test/$@_cxx11) + @-$(CXX) $(CXXFLAGS) -std=c++11 $< -o test/$@_cxx11 &> /dev/null && echo "3: c++11 no legacy cmath build success (test failed)!" || echo "3: c++11 no legacy cmath build failure (test succeeded)!" + $(info 4: testing compiler '$(CXX)' for legacy cmath using c++11; if the compiler supports this standard, then the build should succeed regardless of OS) + $(info 4: $(CXX) -I$(SRCINCDIR) $(CXXFLAGS) -std=c++11 $< -o test/$@_cxx11) + @-$(CXX) -I$(SRCINCDIR) $(CXXFLAGS) -std=c++11 $< -o test/$@_cxx11 &> /dev/null && echo "4: c++11 legacy cmath build success (test succeeded)!" || echo "4: c++11 legacy cmath build failure (test failed)!" + +# Special clause for testing faccessat in a setuid program. +# Must be run by root. +# Assumes there is a _uucp user. +# Tests setuid _uucp, setuid root, and setgid tty. +test_faccessat_setuid: test/test_faccessat + @test/do_test_faccessat_setuid "$(BUILDDLIBPATH)" + +test_faccessat_setuid_msg: + @echo 'Run "sudo make test_faccessat_setuid" to test faccessat properly (Not on 10.4)' + +$(TESTRUNS): $(TESTRUNPREFIX)%: $(TESTNAMEPREFIX)% + $< + +install: install-headers install-lib + +install-headers: + $(MKINSTALLDIRS) $(patsubst $(SRCINCDIR)/%,$(DESTDIR)$(PKGINCDIR)/%,\ + $(sort $(dir $(LIBHEADERS)))) + for h in $(patsubst $(SRCINCDIR)/%,%,$(LIBHEADERS)); do \ + $(INSTALL_DATA) $(SRCINCDIR)/"$$h" $(DESTDIR)$(PKGINCDIR)/"$$h"; \ + done + +install-lib: install-dlib install-slib install-syslib + +install-dlib: $(BUILDDLIBPATH) + $(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR) + $(INSTALL_PROGRAM) $(BUILDDLIBPATH) $(DESTDIR)$(LIBDIR) + $(POSTINSTALL) -id $(DLIBPATH) $(DESTDIR)$(DLIBPATH) + +install-syslib: $(BUILDSYSLIBPATH) +ifeq ($(shell test $(PLATFORM) -le $(MAX_DARWIN_REEXPORT); echo $$?),0) + $(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR) + $(INSTALL_PROGRAM) $(BUILDSYSLIBPATH) $(DESTDIR)$(LIBDIR) + $(POSTINSTALL) -id $(SYSLIBPATH) $(DESTDIR)$(SYSLIBPATH) +endif + +install-slib: $(BUILDSLIBPATH) + $(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR) + $(INSTALL_DATA) $(BUILDSLIBPATH) $(DESTDIR)$(LIBDIR) + +test check: $(TESTRUNS) test_cmath test_faccessat_setuid_msg + +clean: + $(RM) $(foreach D,$(SRCDIR) $(TESTDIR),$D/*.o $D/*.o.* $D/*.d) + $(RM) $(BUILDDLIBPATH) $(BUILDSLIBPATH) $(BUILDSYSLIBPATH) $(TESTPRGS) test/test_cmath_* test/test_faccessat_setuid + @$(RMDIR) $(BUILDDLIBDIR) $(BUILDSLIBDIR) + +.PHONY: all dlib slib clean check test $(TESTRUNS) test_cmath +.PHONY: install install-headers install-lib install-dlib install-slib diff --git a/extern/macports-legacy-support/README.md b/extern/macports-legacy-support/README.md new file mode 100644 index 000000000..1734d2eb0 --- /dev/null +++ b/extern/macports-legacy-support/README.md @@ -0,0 +1,245 @@ +# MODIFIED + +this is a modified version of macports-legacy-support which removes APSL-licensed files. + +# MacPorts Support for Legacy OSX Versions + +Installs wrapper headers and library functions that add common +functions missing in various older OSX releases to bring them +approximately up to current expected standards. + +Three different libraries are provided + + - libMacportsLegacySupport.a - A static library with the missing functions for the given OS. + - libMacportsLegacySupport.dylib - A dynamic library with the missing functions for the given OS. + - libMacportsLegacySystem.B.dylib - Similar to libMacportsLegacySupport.dylib but in addition re-exports the symbols from libSystem.B.dylib. + +To use this library within [MacPorts](https://github.com/macports) +add the `legacysupport` PortGroup to the Portfile. This will add the +required include paths and libraries to allow the library to do it's +magic with most build systems. + +Wrapped headers and replaced functions are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Header FileFeatureMax Version Needing Feature
assert.hAdds C11 static_assert definitionOSX10.10
cmathAdds the same functions as those provided by the herein math.h, + in namespace std::.see math.h
copyfile.hWraps copyfile_state_get to support COPYFILE_STATE_COPIEDOSX10.5
dirent.hAdds fdopendir function. + OSX10.9
os/lock.hAdds os_unfair_lock_lock, os_unfair_lock_trylock, and os_unfair_lock_unlock functionsOSX10.11
math.hAdds declaration of various long long methods (OSX10.6) and __sincos (macOS10.8)OSX10.6(8), GCC 8
netdb.hAdds declaration of AI_NUMERICSERVOSX10.5
pthread.hAdds PTHREAD_RWLOCK_INITIALIZEROSX10.4
Adds pthread_setname_np functionOSX10.5
stdio.hAdds dprintf, getline, getdelim, + open_memstream, and fmemopen functionsOSX10.6, OSX10.12 (open_memstream)
stdlib.hAdds posix_memalign functional replacement, and wraps realpath + to accept a NULL buffer argumentOSX10.5
Adds arc4random_uniform and arc4random_buf functionsOSX10.6
string.hAdds stpncpy, strnlen, strndup and memmem functionsOSX10.6
strings.hAdds fls,flsl,ffsl(OSX10.4) and flsll,ffsll(macOS10.8) functionsOSX10.4(8)
time.hAdds functions clock_gettime(macOS10.11) and timespec_get(macOS10.14). Defines TIME_UTC (macOS10.14). Declares asctime_r, ctime_r, gmtime_r, and localtime_r functions that are otherwise hidden in the presence of _ANSI_SOURCE, _POSIX_C_SOURCE, or _XOPEN_SOURCE (OSX10.4)OSX10.4(11,14)
wchar.hAdds wcsdup, wcsnlen, wcpcpy, + wcpncpy, wcscasecmp, and wcsncasecmp + functionsOSX10.6
mach/machine.hAdds missing machine definitionsOSX10.13
net/if.hAdds include sys/socket.h, expected on current macOS systemsOSX10.8
xlocale/_wchar.hAdds wcscasecmp_l, wcsncasecmp_l functionsOSX10.6
sys/aio.hAdjusts includes and defines to match SDK 10.5+OSX10.4
sys/fcntl.hAdds missing O_CLOEXEC, AT_FDCWD, AT_EACCESS, + AT_SYMLINK_NOFOLLOW, AT_SYMLINK_FOLLOW, and + AT_REMOVEDIR definitionsas required (?)
Adds openat functionOSX10.9
sys/fsgetpath.hAdds missing utimensat, fsgetpath and setattrlistat functionsOSX10.12
sys/mman.hAdds missing MAP_ANONYMOUS definitionOSX10.10
sys/stdio.hAdds renameat functionOSX10.9
sys/stat.hAdds fchmodat, fstatat, fstatat64 (if required, and on 10.5+), + and mkdirat functionsOSX10.9
Adds lchmod functionOSX10.4
sys/random.hAdds getentropy functionOSX10.11
sys/socket.hCorrects CMSG_DATA definitionOSX10.5
sys/time.hAdds lutimes functionOSX10.4
sys/types.hAdds definitions for u_char, u_short, u_int, u_long, ushort, and uint types that can be exposed via _DARWIN_C_SOURCEOSX10.4
sys/unistd.hAdds getattrlistat, readlinkat, faccessat, + fchownat, linkat, symlinkat, + and unlinkat functionsOSX10.9
Wraps sysconf to support _SC_NPROCESSORS_CONF and + _SC_NPROCESSORS_ONLNOSX10.4
Wraps sysconf to support _SC_PHYS_PAGESOSX10.10
uuid/uuid.hAdds typedef of uuid_string_tOSX10.5
CoreFoundation/CoreFoundation.hAdds CFPropertyListCreateWithStream functionOSX10.5
OpenGL/gliDispatch.hWraps gliDispatch.h to prevent including + glext.h and thereby match behaviour of newer systems.OSX10.6
TargetConditionals.hAdds definitions for TARGET_CPU_ARM, TARGET_CPU_ARM64, + TARGET_OS_SIMULATOR, TARGET_OS_IOS, TARGET_OS_TV, + TARGET_OS_WATCH and TARGET_OS_OSX if needed.OSX10.10
-Adds __bzero library symbolOSX10.5
-Adds _dirfd library symbolOSX10.7
-Adds _fstatat$INODE64 library symbolOSX10.9
+ +For information on building this library outside MacPorts, see BUILDING.txt. diff --git a/extern/macports-legacy-support/include/CoreFoundation/CoreFoundation.h b/extern/macports-legacy-support/include/CoreFoundation/CoreFoundation.h new file mode 100644 index 000000000..1846623ee --- /dev/null +++ b/extern/macports-legacy-support/include/CoreFoundation/CoreFoundation.h @@ -0,0 +1,33 @@ + +/* + * Copyright (c) 2022 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_CoreFoundationCoreFoundation_H_ +#define _MACPORTS_CoreFoundationCoreFoundation_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system CoreFoundation/CoreFoundation.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_CoreFoundation__ + +#define CFPropertyListCreateWithStream(A,B,C,D,E,F) CFPropertyListCreateFromStream(A,B,C,D,E,F) + +#endif /* __MP_LEGACY_SUPPORT_CoreFoundation__ */ + +#endif /* _MACPORTS_CoreFoundationCoreFoundation_H_ */ diff --git a/extern/macports-legacy-support/include/IOKit/usb/USB.h b/extern/macports-legacy-support/include/IOKit/usb/USB.h new file mode 100644 index 000000000..20ce0298e --- /dev/null +++ b/extern/macports-legacy-support/include/IOKit/usb/USB.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 Evan Miller + * + * Permission to use, copy, modify, and 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. + */ + +/* pack(1) and align=reset don't mix in some versions of GCC. + * See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50909 */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && !defined(__clang__) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +/* 10.4 and up need three invocations */ +#pragma options align=power +#pragma options align=power +#pragma options align=power +/* 10.8 and up need two more */ +#pragma options align=power +#pragma options align=power +/* 10.15 and up need none (extras won't hurt so SDK branching is unimplemented) */ +#endif +#endif + +#include_next diff --git a/extern/macports-legacy-support/include/MacportsLegacySupport.h b/extern/macports-legacy-support/include/MacportsLegacySupport.h new file mode 100644 index 000000000..f1bc4cc42 --- /dev/null +++ b/extern/macports-legacy-support/include/MacportsLegacySupport.h @@ -0,0 +1,204 @@ + +/* + * Copyright (c) 2018 Chris Jones + * Copyright (c) 2019 Michael Dickens + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_LEGACYSUPPORTDEFS_H_ +#define _MACPORTS_LEGACYSUPPORTDEFS_H_ + +/* Not needed -- #include "AvailabilityMacros.h" */ + +/* C++ extern definitions */ +#if defined(__cplusplus) +#define __MP__BEGIN_DECLS extern "C" { +#define __MP__END_DECLS } +#else +#define __MP__BEGIN_DECLS +#define __MP__END_DECLS +#endif + +/* foundational defs, used later */ + +#if defined(__i386) +#define __MP_LEGACY_SUPPORT_I386__ 1 +#else +#define __MP_LEGACY_SUPPORT_I386__ 0 +#endif + +/* defines for when legacy support is required for various functions */ + +/* fsgetpath */ +#define __MP_LEGACY_SUPPORT_FSGETPATH__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300) + +/* **setattrlistat */ +#define __MP_LEGACY_SUPPORT_SETATTRLISTAT__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300) + +/* ** utimensat, futimens, UTIME_NOW, UTIME_OMIT */ +#define __MP_LEGACY_SUPPORT_UTIMENSAT__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300) + +/* clock_gettime */ +#define __MP_LEGACY_SUPPORT_GETTIME__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) + +/* timespec_get */ +#define __MP_LEGACY_SUPPORT_TIMESPEC_GET__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) + +/* **at calls */ +#define __MP_LEGACY_SUPPORT_ATCALLS__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000) + +/* fdopendir */ +#define __MP_LEGACY_SUPPORT_FDOPENDIR__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000) + +/* this header is automatically included by on systems 10.9 and up. + It is therefore expected to be included by most current software. */ +/* include */ +#define __MP_LEGACY_SUPPORT_NETIF_SOCKET_FIX__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1090) + +/* CMSG_DATA definition in */ +#define __MP_LEGACY_SUPPORT_CMSG_DATA_FIX__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* stpncpy */ +#define __MP_LEGACY_SUPPORT_STPNCPY__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* strnlen */ +#define __MP_LEGACY_SUPPORT_STRNLEN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* strndup */ +#define __MP_LEGACY_SUPPORT_STRNDUP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* dprintf */ +#define __MP_LEGACY_SUPPORT_DPRINTF__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* getline */ +#define __MP_LEGACY_SUPPORT_GETLINE__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* memmem */ +#define __MP_LEGACY_SUPPORT_MEMMEM__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* wcsdup */ +#define __MP_LEGACY_SUPPORT_WCSDUP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* wcsnlen */ +#define __MP_LEGACY_SUPPORT_WCSNLEN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* wcpcpy, wcpncpy */ +#define __MP_LEGACY_SUPPORT_WCPCPY__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* wcsncasecmp_l, wcscasecmp_l, wcsncasecmp, wcscasecmp */ +#define __MP_LEGACY_SUPPORT_WCSCASECMP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* llround */ +#define __MP_LEGACY_SUPPORT_LLROUND__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* arc4random */ +#define __MP_LEGACY_SUPPORT_ARC4RANDOM__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* getentropy */ +#define __MP_LEGACY_SUPPORT_GETENTROPY__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) + +/* posix_memalign does not exist on < 1060 */ +#define __MP_LEGACY_SUPPORT_POSIX_MEMALIGN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* AI_NUMERICSERV does not exist on < 1060 */ +#define __MP_LEGACY_SUPPORT_AI_NUMERICSERV__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* realpath() on < 1060 does not support modern NULL buffer usage */ +#define __MP_LEGACY_SUPPORT_REALPATH_WRAP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* setattrlistat */ +#define __MP_LEGACY_SUPPORT_FSETATTRLIST__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* localtime_r, gmtime_r, etc only declared on Tiger when _ANSI_SOURCE and _POSIX_C_SOURCE are undefined */ +#define __MP_LEGACY_SUPPORT_TIME_THREAD_SAFE_FUNCTIONS__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) + +/* lsmod does not exist on Tiger */ +#define __MP_LEGACY_SUPPORT_LSMOD__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) + +/* lutimes does not exist on Tiger */ +#define __MP_LEGACY_SUPPORT_LUTIMES__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) + +/* sys/aio.h header needs adjustment to match newer SDKs */ +#define __MP_LEGACY_SUPPORT_SYSAIOTIGERFIX__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) + +/* sysconf() is missing some functions on some systems, and may misbehave on i386 */ +#define __MP_LEGACY_SUPPORT_SYSCONF_WRAP__ (__APPLE__ && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101100 \ + || __MP_LEGACY_SUPPORT_I386__)) + +/* pthread_rwlock_initializer is not defined on Tiger */ +#define __MP_LEGACY_SUPPORT_PTHREAD_RWLOCK__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) + +/* STAILQ_FOREACH is not defined on Tiger*/ +#define __MP_LEGACY_SUPPORT_STAILQ_FOREACH__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) + +/* c++11 PPC 10.[45] and Intel 10.[4-6], GNU g++ 4.6 through 8. */ +#if (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070 \ + && defined(__GNUC__) && (__GNUC__ <= 8) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)))) +#define __MP_LEGACY_SUPPORT_CXX11_CMATH__ 1 +#else +#define __MP_LEGACY_SUPPORT_CXX11_CMATH__ 0 +#endif + +/* cossin */ +#define __MP_LEGACY_SUPPORT_COSSIN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1090) + +/* ffsl */ +#define __MP_LEGACY_SUPPORT_FFSL__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) +/* ffsll */ +#define __MP_LEGACY_SUPPORT_FFSLL__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1090) + +/* fls */ +#define __MP_LEGACY_SUPPORT_FLS__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) +/* flsl */ +#define __MP_LEGACY_SUPPORT_FLSL__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) +/* flsll */ +#define __MP_LEGACY_SUPPORT_FLSLL__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1090) + +/* open_memstream */ +#define __MP_LEGACY_SUPPORT_OPEN_MEMSTREAM__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300) + +/* fmemopen */ +#define __MP_LEGACY_SUPPORT_FMEMOPEN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300) + +/* pthread_setname_np */ +#define __MP_LEGACY_SUPPORT_PTHREAD_SETNAME_NP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* Compound macros, bundling functionality needed by multiple single features. */ +#define __MP_LEGACY_SUPPORT_NEED_ATCALL_MACROS__ (__MP_LEGACY_SUPPORT_ATCALLS__ || __MP_LEGACY_SUPPORT_SETATTRLISTAT__) + +#define __MP_LEGACY_SUPPORT_NEED_BEST_FCHDIR__ (__MP_LEGACY_SUPPORT_FDOPENDIR__ || __MP_LEGACY_SUPPORT_ATCALLS__ || __MP_LEGACY_SUPPORT_SETATTRLISTAT__) + +/* for now, just add missing typedef statements */ +#define __MP_LEGACY_SUPPORT_UUID__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* for now, just forward call to CFPropertyListCreateWithStream */ +#define __MP_LEGACY_SUPPORT_CoreFoundation__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* copyfile and its associated functions have gained functionality over the years */ +#define __MP_LEGACY_SUPPORT_COPYFILE_WRAP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* _tlv_atexit and __cxa_thread_atexit */ +#define __MP_LEGACY_SUPPORT_ATEXIT_WRAP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) + +/* os_unfair_lock structure and its associated functions */ +#define __MP_LEGACY_SUPPORT_OS_UNFAIR_LOCK__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) + +/* library symbol ___bzero */ +#define __MP_LEGACY_SUPPORT_SYMBOL____bzero__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060) + +/* library symbol _dirfd */ +#define __MP_LEGACY_SUPPORT_SYMBOL__dirfd__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1080) + +#endif /* _MACPORTS_LEGACYSUPPORTDEFS_H_ */ diff --git a/extern/macports-legacy-support/include/OpenGL/gliDispatch.h b/extern/macports-legacy-support/include/OpenGL/gliDispatch.h new file mode 100644 index 000000000..06ce3cfbf --- /dev/null +++ b/extern/macports-legacy-support/include/OpenGL/gliDispatch.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 + * + * Permission to use, copy, modify, and 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. + */ + + +/* in SDKs > 10.6 this Apple header does not include glext.h. + * Including it causes redefinition errors that are hard to + * overcome in ports, eg mesa, so we block the loading of + * glext.h here on older systems for consistent behaviour with newer systems + * + * Note: this header has no specific blocker as it may be called + * multiple times and should have the same effect each time + */ + +#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 +# ifdef __glext_h_ +# define MACPORTS_LEGACY_SAVED_GLEXT_SET +# else +# define __glext_h_ +# endif +#endif + +#include_next + +#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 +# ifdef MACPORTS_LEGACY_SAVED_GLEXT_SET +# undef MACPORTS_LEGACY_SAVED_GLEXT_SET +# else +# undef __glext_h_ +# endif +#endif diff --git a/extern/macports-legacy-support/include/TargetConditionals.h b/extern/macports-legacy-support/include/TargetConditionals.h new file mode 100644 index 000000000..55517aa1f --- /dev/null +++ b/extern/macports-legacy-support/include/TargetConditionals.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 + * + * Permission to use, copy, modify, and 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. + */ + + +/* + * TARGET_OS_SIMULATOR replaced TARGET_IPHONE_SIMULATOR and is not defined in older os versions + */ + +#include_next + +#ifndef TARGET_OS_OSX +# define TARGET_OS_OSX 1 +#endif +/* We never support these OSes */ +#ifndef TARGET_OS_SIMULATOR +# define TARGET_OS_SIMULATOR 0 +#endif +#ifndef TARGET_OS_IOS +# define TARGET_OS_IOS 0 +#endif +#ifndef TARGET_OS_TV +# define TARGET_OS_TV 0 +#endif +#ifndef TARGET_OS_WATCH +# define TARGET_OS_WATCH 0 +#endif +#ifndef TARGET_OS_DRIVERKIT +# define TARGET_OS_DRIVERKIT 0 +#endif +#ifndef TARGET_OS_MACCATALYST +# define TARGET_OS_MACCATALYST 0 +#endif +/* If not defined, OS will never support ARM */ +#ifndef TARGET_CPU_ARM +# define TARGET_CPU_ARM 0 +#endif +#ifndef TARGET_CPU_ARM64 +# define TARGET_CPU_ARM64 0 +#endif diff --git a/extern/macports-legacy-support/include/assert.h b/extern/macports-legacy-support/include/assert.h new file mode 100644 index 000000000..430fecd9e --- /dev/null +++ b/extern/macports-legacy-support/include/assert.h @@ -0,0 +1,19 @@ + +/* Include the primary system assert.h */ +#include_next + + +/* now add the missing definition of static_assert for C11 code, added to the 10.11 SDK. */ +/* if a newer assert.h header has already done this in a modern SDK, then */ +/* _ASSERT_H_ will be defined and will block this */ + +#ifndef _ASSERT_H_ +#define _ASSERT_H_ + +#ifndef __cplusplus +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#define static_assert _Static_assert +#endif /* __STDC_VERSION__ */ +#endif /* !__cplusplus */ + +#endif /* _ASSERT_H_ */ diff --git a/extern/macports-legacy-support/include/cmath b/extern/macports-legacy-support/include/cmath new file mode 100644 index 000000000..ae1abbdab --- /dev/null +++ b/extern/macports-legacy-support/include/cmath @@ -0,0 +1,96 @@ +/* -*- c++ -*- */ +/* + * Copyright (c) 2019 Michael Dickens + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_CMATH_ +#define _MACPORTS_CMATH_ + +/* include MP support header to see if c++11 cmath support is needed */ +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_CXX11_CMATH__ + +/* + * NOTE: This has to come -before- the include_next, so that the + * setting is valid for any subsequently included header. + */ + +#undef L_GLIBCXX_USE_C99_MATH_TR1 +#ifndef _GLIBCXX_USE_C99_MATH_TR1 +#define L_GLIBCXX_USE_C99_MATH_TR1 1 + +/* + * this macro enables c++11 math support in g++. It just needs to be + * defined; not to any particular value; use 1 just because. + */ +#define _GLIBCXX_USE_C99_MATH_TR1 1 +#endif + +/* + * Include our local math.h. NOTE: This has to come -before- the + * include_next for , so that the top-level functions are + * all declared before they are referenced. + */ +#include +#endif /* __MP_LEGACY_SUPPORT_CXX11_CMATH__ */ + +/* + * Include the next cmath, which might be from the primary system or + * it might be within GCC's c++ headers; either is OK here. + */ +#include_next + +#if __MP_LEGACY_SUPPORT_CXX11_CMATH__ + +#ifdef L_GLIBCXX_USE_C99_MATH_TR1 +#undef _GLIBCXX_USE_C99_MATH_TR1 +#undef L_GLIBCXX_USE_C99_MATH_TR1 +#endif + +/* + * this is the same condition that defines the function prototypes in + * the system . + */ +#if ( defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L ) || ! defined( __STRICT_ANSI__ ) || ! defined( __GNUC__ ) +#else +#ifdef _GLIBCXX_NO_C99_ROUNDING_FUNCS +/* have to define these ourselves because GCC doesn't properly */ +#if __cplusplus >= 201103L + +#undef llrint +#undef llrintf +#undef llrintl +#undef llround +#undef llroundf +#undef llroundl + +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + using ::llrint; + using ::llrintf; + using ::llrintl; + using ::llround; + using ::llroundf; + using ::llroundl; +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace + +#endif /* __cplusplus >= 201103L */ +#endif /* _GLIBCXX_NO_C99_ROUNDING_FUNCS */ +#endif /* various */ +#endif /* __MP_LEGACY_SUPPORT_CXX11_CMATH__ */ +#endif /* _MACPORTS_CMATH_ */ diff --git a/extern/macports-legacy-support/include/copyfile.h b/extern/macports-legacy-support/include/copyfile.h new file mode 100644 index 000000000..c9f819edf --- /dev/null +++ b/extern/macports-legacy-support/include/copyfile.h @@ -0,0 +1,35 @@ + +/* + * Copyright (c) 2022 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_COPYFILE_H_ +#define _MACPORTS_COPYFILE_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system copyfile.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_COPYFILE_WRAP__ + +#define COPYFILE_STATE_STATUS_CB 6 +#define COPYFILE_STATE_STATUS_CTX 7 +#define COPYFILE_STATE_COPIED 8 + +#endif + +#endif /* _MACPORTS_COPYFILE_H_ */ diff --git a/extern/macports-legacy-support/include/dirent.h b/extern/macports-legacy-support/include/dirent.h new file mode 100644 index 000000000..884911f2d --- /dev/null +++ b/extern/macports-legacy-support/include/dirent.h @@ -0,0 +1,42 @@ + +/* + * Copyright (c) 2019 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_DIRENT_H_ +#define _MACPORTS_DIRENT_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system dirent.h */ +#include_next + +/* fdopendir */ +#if __MP_LEGACY_SUPPORT_FDOPENDIR__ + +__MP__BEGIN_DECLS + +#ifndef __DARWIN_ALIAS_I +extern DIR *fdopendir(int fd) __DARWIN_ALIAS(fdopendir); +#else +extern DIR *fdopendir(int fd) __DARWIN_ALIAS_I(fdopendir); +#endif + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_FDOPENDIR__ */ + +#endif /* _MACPORTS_DIRENT_H_ */ diff --git a/extern/macports-legacy-support/include/mach/machine.h b/extern/macports-legacy-support/include/mach/machine.h new file mode 100644 index 000000000..a938ab35a --- /dev/null +++ b/extern/macports-legacy-support/include/mach/machine.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2022 + * + * Permission to use, copy, modify, and 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_next + +#ifndef CPU_SUBTYPE_ARM64E +#define CPU_SUBTYPE_ARM64E ((cpu_subtype_t) 2) +#endif diff --git a/extern/macports-legacy-support/include/math.h b/extern/macports-legacy-support/include/math.h new file mode 100644 index 000000000..0bd67e93d --- /dev/null +++ b/extern/macports-legacy-support/include/math.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018 Chris Jones + * Copyright (c) 2019 Michael Dickens + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_MATH_H_ +#define _MACPORTS_MATH_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_LLROUND__ + +__MP__BEGIN_DECLS + +/* + * These functions are present in the system math library but their + * prototypes might not be declared under some circumstances. Declare + * them here anyway. + */ + +/* + * this is the same condition that defines the function prototypes in + * the GCC . + */ +#if !(__DARWIN_NO_LONG_LONG) +extern long long int llrint ( double ); +extern long long int llrintf ( float ); +extern long long int llrintl ( long double ); + +extern long long int llround ( double ); +extern long long int llroundf ( float ); +extern long long int llroundl ( long double ); +#endif + +__MP__END_DECLS + +/* + * If the GCC header exists, then tell it: (1) to include the + * next , which should be from the system; and (2) to not use + * it's yet, because it basically wraps and we need + * to keep everything herein focused on just . If the user + * wants , they should #include that specific header. + */ + +#undef L_GLIBCXX_MATH_H +#ifndef _GLIBCXX_MATH_H +#define L_GLIBCXX_MATH_H 1 +#define _GLIBCXX_MATH_H 1 +#endif + +#undef L_GLIBCXX_INCLUDE_NEXT_C_HEADERS +#ifndef _GLIBCXX_INCLUDE_NEXT_C_HEADERS +#define L_GLIBCXX_INCLUDE_NEXT_C_HEADERS 1 +#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS 1 +#endif + +#endif /* __MP_LEGACY_SUPPORT_LLROUND__ */ + +/* + * Include the next math.h, which might be from the primary system or + * it might be within GCC's c or c++ (yup!) headers + */ + +#include_next + +#if __MP_LEGACY_SUPPORT_COSSIN__ + +/* Following is borrowed from math.h on macOS 10.9+ */ + +/* __sincos and __sincosf were introduced in OSX 10.9 and iOS 7.0. When + targeting an older system, we simply split them up into discrete calls + to sin( ) and cos( ). */ + +__MP__BEGIN_DECLS +extern void __sincosf(float __x, float *__sinp, float *__cosp); +extern void __sincos(double __x, double *__sinp, double *__cosp); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_COSSIN__ */ + +#if __MP_LEGACY_SUPPORT_LLROUND__ + +#ifdef L_GLIBCXX_MATH_H +#undef L_GLIBCXX_MATH_H +#undef _GLIBCXX_MATH_H +#endif + +#ifdef L_GLIBCXX_INCLUDE_NEXT_C_HEADERS +#undef L_GLIBCXX_INCLUDE_NEXT_C_HEADERS +#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS +#endif + +#endif /* __MP_LEGACY_SUPPORT_LLROUND__ */ + +#endif /* _MACPORTS_MATH_H_ */ diff --git a/extern/macports-legacy-support/include/net/if.h b/extern/macports-legacy-support/include/net/if.h new file mode 100644 index 000000000..fcc347058 --- /dev/null +++ b/extern/macports-legacy-support/include/net/if.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_NETIF_H_ +#define _MACPORTS_NETIF_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_NETIF_SOCKET_FIX__ +# include +#endif + +/* Include the primary system */ +#include_next + +#endif /* _MACPORTS_NETIF_H_ */ diff --git a/extern/macports-legacy-support/include/netdb.h b/extern/macports-legacy-support/include/netdb.h new file mode 100644 index 000000000..32c42ca5c --- /dev/null +++ b/extern/macports-legacy-support/include/netdb.h @@ -0,0 +1,33 @@ + +/* + * Copyright (c) 2018 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_NETDB_H_ +#define _MACPORTS_NETDB_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system netdb.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_AI_NUMERICSERV__ +# ifndef AI_NUMERICSERV +# define AI_NUMERICSERV 0x00001000 /* prevent service name resolution */ +# endif +#endif + +#endif /* _MACPORTS_NETDB_H_ */ diff --git a/extern/macports-legacy-support/include/os/lock.h b/extern/macports-legacy-support/include/os/lock.h new file mode 100644 index 000000000..c318c4540 --- /dev/null +++ b/extern/macports-legacy-support/include/os/lock.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2023 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_LOCK_H_ +#define _MACPORTS_LOCK_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_OS_UNFAIR_LOCK__ + +/* + os/lock.h does not exist + use deprecated OSSpinLock instead + + see https://developer.apple.com/documentation/os/os_unfair_lock +*/ + +#include + +#define OS_UNFAIR_LOCK_INIT OS_SPINLOCK_INIT + +typedef OSSpinLock os_unfair_lock; +typedef OSSpinLock *os_unfair_lock_t; + +__MP__BEGIN_DECLS + +void os_unfair_lock_lock(os_unfair_lock_t lock); + +bool os_unfair_lock_trylock(os_unfair_lock_t lock); + +void os_unfair_lock_unlock(os_unfair_lock_t lock); + +__MP__END_DECLS + +/* +it is not clear how to implement these functions + +void os_unfair_lock_assert_owner(const os_unfair_lock *lock); +void os_unfair_lock_assert_not_owner(const os_unfair_lock *lock); +*/ + +#else /*__MP_LEGACY_SUPPORT_OS_UNFAIR_LOCK__*/ + +/* Include the primary system os/lock.h */ +#include_next + +#endif /*__MP_LEGACY_SUPPORT_OS_UNFAIR_LOCK__*/ + +#endif diff --git a/extern/macports-legacy-support/include/pthread.h b/extern/macports-legacy-support/include/pthread.h new file mode 100644 index 000000000..b9372a937 --- /dev/null +++ b/extern/macports-legacy-support/include/pthread.h @@ -0,0 +1,43 @@ + +/* + * Copyright (c) 2018 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_PTHREAD_H_ +#define _MACPORTS_PTHREAD_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system pthread.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_PTHREAD_RWLOCK__ +/* PTHREAD_RWLOCK_INITIALIZER is not defined on Tiger */ +#ifndef PTHREAD_RWLOCK_INITIALIZER +#define PTHREAD_RWLOCK_INITIALIZER {_PTHREAD_RWLOCK_SIG_init, {0}} +#endif +#endif /* __MP_LEGACY_SUPPORT_PTHREAD_RWLOCK__ */ + + +__MP__BEGIN_DECLS + +#if __MP_LEGACY_SUPPORT_PTHREAD_SETNAME_NP__ +int pthread_setname_np(const char *); +#endif /* __MP_LEGACY_SUPPORT_PTHREAD_SETNAME_NP__ */ + +__MP__END_DECLS + +#endif /* _MACPORTS_PTHREAD_H_ */ diff --git a/extern/macports-legacy-support/include/pthread_impl.h b/extern/macports-legacy-support/include/pthread_impl.h new file mode 100644 index 000000000..5fd417260 --- /dev/null +++ b/extern/macports-legacy-support/include/pthread_impl.h @@ -0,0 +1,34 @@ + +/* + * Copyright (c) 2018 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_PTHREAD_IMPL_H_ +#define _MACPORTS_PTHREAD_IMPL_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system pthread_impl.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_PTHREAD_RWLOCK__ +/* PTHREAD_RWLOCK_INITIALIZER is not defined on Tiger */ +#ifndef _PTHREAD_RWLOCK_SIG_init +#define _PTHREAD_RWLOCK_SIG_init 0x2DA8B3B4 +#endif +#endif /* __MP_LEGACY_SUPPORT_PTHREAD_RWLOCK__ */ + +#endif /* _MACPORTS_PTHREAD_IMPL_H_ */ diff --git a/extern/macports-legacy-support/include/stdio.h b/extern/macports-legacy-support/include/stdio.h new file mode 100644 index 000000000..3ddd71880 --- /dev/null +++ b/extern/macports-legacy-support/include/stdio.h @@ -0,0 +1,102 @@ + +/* + * Copyright (c) 2018 Chris Jones + * Copyright (c) 2018 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_STDIO_H_ +#define _MACPORTS_STDIO_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system time.h */ +#include_next + +/* dprintf */ +#if __MP_LEGACY_SUPPORT_DPRINTF__ + +__MP__BEGIN_DECLS +extern int dprintf(int fd, const char * __restrict format, ...); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_DPRINTF__ */ + +/* getline */ +#if __MP_LEGACY_SUPPORT_GETLINE__ + +/* + * [XSI] The ssize_t and size_t types shall be defined as described + * in . + */ +#ifndef _SIZE_T +#define _SIZE_T +typedef __darwin_size_t size_t; +#endif + +#ifndef _SSIZE_T +#define _SSIZE_T +typedef __darwin_ssize_t ssize_t; +#endif + +__MP__BEGIN_DECLS +extern ssize_t getdelim(char **lineptr, size_t *n, int delimiter, FILE *fp); +extern ssize_t getline (char **lineptr, size_t *n, FILE *stream); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_GETLINE__ */ + +/* open_memstream */ +#if __MP_LEGACY_SUPPORT_OPEN_MEMSTREAM__ + +__MP__BEGIN_DECLS +FILE *open_memstream(char **ptr, size_t *sizeloc); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_OPEN_MEMSTREAM__ */ + +/* fmemopen */ +#if __MP_LEGACY_SUPPORT_FMEMOPEN__ + +__MP__BEGIN_DECLS +FILE *fmemopen(void *buf, size_t size, const char *mode); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_FMEMOPEN__ */ + +/* renameat */ +#if __MP_LEGACY_SUPPORT_ATCALLS__ + +/* + * [XSI] The ssize_t and size_t types shall be defined as described + * in . + */ +#ifndef _SIZE_T +#define _SIZE_T +typedef __darwin_size_t size_t; +#endif + +#ifndef _SSIZE_T +#define _SSIZE_T +typedef __darwin_ssize_t ssize_t; +#endif + +__MP__BEGIN_DECLS +extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_ATCALLS__ */ + +#endif /* _MACPORTS_STDIO_H_ */ diff --git a/extern/macports-legacy-support/include/stdlib.h b/extern/macports-legacy-support/include/stdlib.h new file mode 100644 index 000000000..b3b8f434b --- /dev/null +++ b/extern/macports-legacy-support/include/stdlib.h @@ -0,0 +1,79 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_STDLIB_H_ +#define _MACPORTS_STDLIB_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system stdlib.h */ +#include_next + +/* posix_memalign */ +#if __MP_LEGACY_SUPPORT_POSIX_MEMALIGN__ + +/* + * [XSI] The ssize_t and size_t types shall be defined as described + * in . + */ +#ifndef _SIZE_T +#define _SIZE_T +typedef __darwin_size_t size_t; +#endif + +#ifndef _SSIZE_T +#define _SSIZE_T +typedef __darwin_ssize_t ssize_t; +#endif + +__MP__BEGIN_DECLS +extern int posix_memalign(void **memptr, size_t alignment, size_t size); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_POSIX_MEMALIGN__ */ + +/* arc4random */ +#if __MP_LEGACY_SUPPORT_ARC4RANDOM__ + +#ifndef _SIZE_T +#define _SIZE_T +typedef __darwin_size_t size_t; +#endif +#ifndef _UINT32_T +#define _UINT32_T +typedef unsigned int uint32_t; +#endif + +/* + * Generate and return a uniformly random 32-bit quantity with an + * upper bound of 'upper_bound' + */ +__MP__BEGIN_DECLS +extern uint32_t arc4random_uniform( uint32_t upper_bound ); +__MP__END_DECLS + +/* + * Generate 'n' random bytes and put them in 'buf'. + */ +__MP__BEGIN_DECLS +extern void arc4random_buf( void* buf, size_t n ); +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_ARC4RANDOM__ */ + +#endif /* _MACPORTS_STDLIB_H_ */ diff --git a/extern/macports-legacy-support/include/string.h b/extern/macports-legacy-support/include/string.h new file mode 100644 index 000000000..68b88b65e --- /dev/null +++ b/extern/macports-legacy-support/include/string.h @@ -0,0 +1,56 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_STRING_H_ +#define _MACPORTS_STRING_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system string.h */ +#include_next + +/* stpncpy */ +#if __MP_LEGACY_SUPPORT_STPNCPY__ +__MP__BEGIN_DECLS +extern char *stpncpy(char *dst, const char *src, size_t n); +__MP__END_DECLS +#endif + +/* strnlen */ +#if __MP_LEGACY_SUPPORT_STRNLEN__ +__MP__BEGIN_DECLS +extern size_t strnlen(const char *s, size_t maxlen); +__MP__END_DECLS +#endif + +/* strndup */ +#if __MP_LEGACY_SUPPORT_STRNDUP__ +__MP__BEGIN_DECLS +extern char *strndup(const char *s, size_t n); +__MP__END_DECLS +#endif + +/* memmem */ +#if __MP_LEGACY_SUPPORT_MEMMEM__ +__MP__BEGIN_DECLS +extern void * +memmem(const void *l, size_t l_len, const void *s, size_t s_len); +__MP__END_DECLS +#endif + +#endif /* _MACPORTS_STRING_H_ */ diff --git a/extern/macports-legacy-support/include/strings.h b/extern/macports-legacy-support/include/strings.h new file mode 100644 index 000000000..667ed3dd9 --- /dev/null +++ b/extern/macports-legacy-support/include/strings.h @@ -0,0 +1,62 @@ + +/* + * Copyright (c) 2020 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_STRINGS_H_ +#define _MACPORTS_STRINGS_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system string.h */ +#include_next + +/* ffsl */ +#if __MP_LEGACY_SUPPORT_FFSL__ +__MP__BEGIN_DECLS +extern int ffsl(long int); +__MP__END_DECLS +#endif + +/* ffsll */ +#if __MP_LEGACY_SUPPORT_FFSLL__ +__MP__BEGIN_DECLS +extern int ffsll(long long int); +__MP__END_DECLS +#endif + +/* fls */ +#if __MP_LEGACY_SUPPORT_FLS__ +__MP__BEGIN_DECLS +extern int fls(int); +__MP__END_DECLS +#endif + +/* flsl */ +#if __MP_LEGACY_SUPPORT_FLSL__ +__MP__BEGIN_DECLS +extern int flsl(long int); +__MP__END_DECLS +#endif + +/* flsll */ +#if __MP_LEGACY_SUPPORT_FLSLL__ +__MP__BEGIN_DECLS +extern int flsll(long long int); +__MP__END_DECLS +#endif + +#endif /* _MACPORTS_STRINGS_H_ */ diff --git a/extern/macports-legacy-support/include/sys/aio.h b/extern/macports-legacy-support/include/sys/aio.h new file mode 100644 index 000000000..4a3565c1a --- /dev/null +++ b/extern/macports-legacy-support/include/sys/aio.h @@ -0,0 +1,57 @@ + +/* + * Copyright (c) 2020 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYS_AIO_H_ +#define _MACPORTS_SYS_AIO_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + + +/* in the MacOSX10.4.sdk, several definitions are missing from this file that are included + in later SDKs. This fix includes the headers in the order used in this file + later SDKs, and adds the two missing definitions prior to calling the + usual header. + + The alternate method here would be to copy in the header from the + MacOSX10.4.sdk and patch it in place, as is done in gcc. We may do that + in the end, if it turns out to be less intrusive. + +*/ + +#if __MP_LEGACY_SUPPORT_SYSAIOTIGERFIX__ + +#include +#include +#include + +#ifndef _OFF_T +typedef __darwin_off_t off_t; +#define _OFF_T +#endif + +#ifndef _SSIZE_T +#define _SSIZE_T +typedef __darwin_ssize_t ssize_t; +#endif + +#endif /* __MP_LEGACY_SUPPORT_SYSAIOTIGERFIX__ */ + +/* Include the primary system sys/aio.h */ +#include_next + +#endif /* _MACPORTS_SYS_AIO_H_ */ diff --git a/extern/macports-legacy-support/include/sys/fcntl.h b/extern/macports-legacy-support/include/sys/fcntl.h new file mode 100644 index 000000000..b473fb84a --- /dev/null +++ b/extern/macports-legacy-support/include/sys/fcntl.h @@ -0,0 +1,64 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYSFCNTL_H_ +#define _MACPORTS_SYSFCNTL_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system fcntl.h */ +#include_next + +/* replace missing O_CLOEXEC definition with 0, which works + * but does not replace the full function of that flag + * this is the commonly done fix in MacPorts (see gtk3, for example) + * FIXME - this could use a proper fix, if possible + */ + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +/* atcalls */ +#if __MP_LEGACY_SUPPORT_ATCALLS__ + +#ifndef AT_FDCWD +#define AT_FDCWD -2 +#endif +#ifndef AT_EACCESS +#define AT_EACCESS 0x0010 /* Use effective ids in access check */ +#endif +#ifndef AT_SYMLINK_NOFOLLOW +#define AT_SYMLINK_NOFOLLOW 0x0020 /* Act on the symlink itself not the target */ +#endif +#ifndef AT_SYMLINK_FOLLOW +#define AT_SYMLINK_FOLLOW 0x0040 /* Act on target of symlink */ +#endif +#ifndef AT_REMOVEDIR +#define AT_REMOVEDIR 0x0080 /* Path refers to directory */ +#endif + +__MP__BEGIN_DECLS + +extern int openat(int dirfd, const char *pathname, int flags, ...); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_ATCALLS__ */ + +#endif /* _MACPORTS_SYSFCNTL_H_ */ diff --git a/extern/macports-legacy-support/include/sys/fsgetpath.h b/extern/macports-legacy-support/include/sys/fsgetpath.h new file mode 100644 index 000000000..f7e1ee320 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/fsgetpath.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_FSGETPATH_H_ +#define _MACPORTS_FSGETPATH_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +#if defined(__has_include_next) +#if __has_include_next() + +/* Include the primary system sys/fsgetpath.h */ +#include_next + +#endif +#endif + +#if __MP_LEGACY_SUPPORT_FSGETPATH__ + +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 + +__MP__BEGIN_DECLS +extern ssize_t fsgetpath(char * __restrict buf, size_t bufsize, fsid_t* fsid, uint64_t objid); +__MP__END_DECLS + +#else +#error "No implementation of fsgetpath is presently available for MacOSX prior to 10.6" +#endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 */ + +#endif /* __MP_LEGACY_SUPPORT_FSGETPATH__ */ + +#endif /* _MACPORTS_FSGETPATH_H_ */ diff --git a/extern/macports-legacy-support/include/sys/mman.h b/extern/macports-legacy-support/include/sys/mman.h new file mode 100644 index 000000000..c15dc0266 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/mman.h @@ -0,0 +1,33 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_MMAN_H_ +#define _MACPORTS_MMAN_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system sys/mman.h */ +#include_next + +/* MAP_ANONYMOUS only exists on 10.11+ */ +/* Prior to that it was called MAP_ANON */ +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +#endif /* _MACPORTS_MMAN_H_ */ diff --git a/extern/macports-legacy-support/include/sys/queue.h b/extern/macports-legacy-support/include/sys/queue.h new file mode 100644 index 000000000..82efb7fc9 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/queue.h @@ -0,0 +1,39 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYS_QUEUE_H_ +#define _MACPORTS_SYS_QUEUE_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system sys/queue.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_STAILQ_FOREACH__ +/* STAILQ_FOREACH is not defined on Tiger */ + +#ifndef STAILQ_FOREACH +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) +#endif + +#endif /* __MP_LEGACY_SUPPORT_STAILQ_FOREACH__ */ + +#endif /* _MACPORTS_SYS_QUEUE_H_ */ diff --git a/extern/macports-legacy-support/include/sys/random.h b/extern/macports-legacy-support/include/sys/random.h new file mode 100644 index 000000000..d1fcd648e --- /dev/null +++ b/extern/macports-legacy-support/include/sys/random.h @@ -0,0 +1,37 @@ + +/* + * Copyright (c) 2021 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYSRANDOM_H_ +#define _MACPORTS_SYSRANDOM_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system random.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_GETENTROPY__ + +__MP__BEGIN_DECLS + +extern int getentropy(void *buf, size_t buflen); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_GETENTROPY__ */ + +#endif /* _MACPORTS_SYSRANDOM_H_ */ diff --git a/extern/macports-legacy-support/include/sys/socket.h b/extern/macports-legacy-support/include/sys/socket.h new file mode 100644 index 000000000..774aa0dcd --- /dev/null +++ b/extern/macports-legacy-support/include/sys/socket.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024 Frederick H. G. Wright II + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYS_SOCKET_H_ +#define _MACPORTS_SYS_SOCKET_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system sys/socket.h */ +#include_next + +/* + * OSX prior to 10.6 defines CMSG_DATA without properly considering 64-bit + * builds, due to bad alignment assumptions, though it happens to work in + * the 10.4 case and only actually fails in the 10.5 64-bit case. + * + * In those OS versions we substitute a version of the definition from 10.6. + */ + +#if __MP_LEGACY_SUPPORT_CMSG_DATA_FIX__ + +#define __DARWIN_ALIGNBYTES32 (sizeof(__uint32_t) - 1) +#define __DARWIN_ALIGN32(p) \ + ((size_t)((char *)(size_t)(p) \ + + __DARWIN_ALIGNBYTES32) &~ __DARWIN_ALIGNBYTES32) + +/* given pointer to struct cmsghdr, return pointer to data */ +#undef CMSG_DATA +#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \ + __DARWIN_ALIGN32(sizeof(struct cmsghdr))) + +#endif /* __MP_LEGACY_SUPPORT_CMSG_DATA_FIX__ */ + +#endif /* _MACPORTS_SYS_SOCKET_H_ */ diff --git a/extern/macports-legacy-support/include/sys/spawn.h b/extern/macports-legacy-support/include/sys/spawn.h new file mode 100644 index 000000000..75b5ca408 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/spawn.h @@ -0,0 +1,39 @@ + +/* + * Copyright (c) 2020 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYS_SPAWN_H_ +#define _MACPORTS_SYS_SPAWN_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* spawn.h exists on Leopard or later. Use this block method at present + * because gcc versions < 5 don't recognize __have_include() + */ +#if (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050) + +/* Include the primary system sys/queue.h */ +#include_next + +/* replace if missing */ +#ifndef POSIX_SPAWN_CLOEXEC_DEFAULT +#define POSIX_SPAWN_CLOEXEC_DEFAULT 0x4000 +#endif + +#endif + +#endif /* _MACPORTS_SYS_SPAWN_H_ */ diff --git a/extern/macports-legacy-support/include/sys/stat.h b/extern/macports-legacy-support/include/sys/stat.h new file mode 100644 index 000000000..55605bd02 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/stat.h @@ -0,0 +1,76 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYSSTAT_H_ +#define _MACPORTS_SYSSTAT_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system stat.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_UTIMENSAT__ + +#if !defined(UTIME_NOW) +#define UTIME_NOW -1 +#endif + +#if !defined(UTIME_OMIT) +#define UTIME_OMIT -2 +#endif + +__MP__BEGIN_DECLS + +extern int futimens(int fd, const struct timespec _times_in[2]); +extern int utimensat(int fd, const char *path, const struct timespec _times_in[2], int flags); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_UTIMENSAT__ */ + + +#if __MP_LEGACY_SUPPORT_ATCALLS__ + +__MP__BEGIN_DECLS + +extern int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags); +extern int fstatat(int dirfd, const char *pathname, struct stat *buf, int flags); + +/* 64bit inode types appeared only on 10.5, and currently can't be replaced on Tiger */ +/* due to lack of kernel support for the underlying syscalls */ +#if !__DARWIN_ONLY_64_BIT_INO_T && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 + extern int fstatat64(int dirfd, const char *pathname, struct stat64 *buf, int flags); +#endif + +extern int mkdirat(int dirfd, const char *pathname, mode_t mode); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_ATCALLS__ */ + +#if __MP_LEGACY_SUPPORT_LSMOD__ + +__MP__BEGIN_DECLS + +extern int lchmod(const char *, mode_t); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_LSMOD__ */ + +#endif /* _MACPORTS_SYSSTAT_H_ */ diff --git a/extern/macports-legacy-support/include/sys/time.h b/extern/macports-legacy-support/include/sys/time.h new file mode 100644 index 000000000..fb426f356 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/time.h @@ -0,0 +1,37 @@ + +/* + * Copyright (c) 2020 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYSTIME_H_ +#define _MACPORTS_SYSTIME_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system time.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_LUTIMES__ + +__MP__BEGIN_DECLS + +extern int lutimes(const char *, const struct timeval *); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_LUTIMES__ */ + +#endif /* _MACPORTS_SYSTIME_H_ */ diff --git a/extern/macports-legacy-support/include/sys/unistd.h b/extern/macports-legacy-support/include/sys/unistd.h new file mode 100644 index 000000000..a66c33277 --- /dev/null +++ b/extern/macports-legacy-support/include/sys/unistd.h @@ -0,0 +1,93 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_SYSUNISTD_H_ +#define _MACPORTS_SYSUNISTD_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system unistd.h */ +#include_next + +/* For types such as uint32_t. */ +#include + +#if __MP_LEGACY_SUPPORT_ATCALLS__ + +/* + * [XSI] The ssize_t and size_t types shall be defined as described + * in . + */ +#ifndef _SIZE_T +#define _SIZE_T +typedef __darwin_size_t size_t; +#endif + +#ifndef _SSIZE_T +#define _SSIZE_T +typedef __darwin_ssize_t ssize_t; +#endif + +#ifndef _UID_T +#define _UID_T +typedef __darwin_uid_t uid_t; /* user id */ +#endif + +#ifndef _GID_T +#define _GID_T +typedef __darwin_gid_t gid_t; +#endif + +__MP__BEGIN_DECLS + +extern int getattrlistat(int dirfd, const char *pathname, void *a, + void *buf, size_t size, unsigned long flags); +extern ssize_t readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz); +extern int faccessat(int dirfd, const char *pathname, int mode, int flags); +extern int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags); +extern int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags); +extern int symlinkat(const char *oldpath, int newdirfd, const char *newpath); +extern int unlinkat(int dirfd, const char *pathname, int flags); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_ATCALLS__ */ + + +#if __MP_LEGACY_SUPPORT_SETATTRLISTAT__ + +/* + * [XSI] The ssize_t and size_t types shall be defined as described + * in . + */ +#ifndef _SIZE_T +#define _SIZE_T +typedef __darwin_size_t size_t; +#endif + + +__MP__BEGIN_DECLS + +extern int setattrlistat(int dirfd, const char *pathname, void *a, + void *buf, size_t size, uint32_t flags); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_SETATTRLISTAT__ */ + +#endif /* _MACPORTS_SYSUNISTD_H_ */ diff --git a/extern/macports-legacy-support/include/time.h b/extern/macports-legacy-support/include/time.h new file mode 100644 index 000000000..af5e2ad32 --- /dev/null +++ b/extern/macports-legacy-support/include/time.h @@ -0,0 +1,105 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_TIME_H_ +#define _MACPORTS_TIME_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system time.h */ +#include_next + +/* The following functions are implemented by Tiger, but the declarations are + * missing if _ANSI_SOURCE or _POSIX_C_SOURCE are defined, which occurs when + * _XOPEN_SOURCE is set. */ +#if __MP_LEGACY_SUPPORT_TIME_THREAD_SAFE_FUNCTIONS__ + +__MP__BEGIN_DECLS +#if defined(_ANSI_SOURCE) || defined(_POSIX_C_SOURCE) +char *asctime_r(const struct tm *, char *); +char *ctime_r(const time_t *, char *); +struct tm *gmtime_r(const time_t *, struct tm *); +struct tm *localtime_r(const time_t *, struct tm *); +#endif /* defined(_ANSI_SOURCE) || defined(_POSIX_C_SOURCE) */ +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_TIME_THREAD_SAFE_FUNCTIONS__ */ + +/* Legacy implementation of clock_gettime */ +#if __MP_LEGACY_SUPPORT_GETTIME__ + +/* One define types and methods if not already defined. */ +#if !defined(CLOCK_REALTIME) && !defined(CLOCK_MONOTONIC) +typedef int clockid_t; +#endif /* !defined(CLOCK_REALTIME) && !defined(CLOCK_MONOTONIC) */ + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 0 +#endif +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC 6 +#endif + +#ifndef CLOCK_MONOTONIC_RAW +#define CLOCK_MONOTONIC_RAW 4 +#endif +#ifndef CLOCK_MONOTONIC_RAW_APPROX +#define CLOCK_MONOTONIC_RAW_APPROX 5 +#endif + +#ifndef CLOCK_UPTIME_RAW +#define CLOCK_UPTIME_RAW 8 +#endif + +#ifndef CLOCK_UPTIME_RAW_APPROX +#define CLOCK_UPTIME_RAW_APPROX 8 +#endif + +#ifndef CLOCK_PROCESS_CPUTIME_ID +#define CLOCK_PROCESS_CPUTIME_ID 12 +#endif + +#ifndef CLOCK_THREAD_CPUTIME_ID +#define CLOCK_THREAD_CPUTIME_ID 16 +#endif + +__MP__BEGIN_DECLS + +extern int clock_gettime( clockid_t clk_id, struct timespec *ts ); +extern int clock_getres ( clockid_t clk_id, struct timespec *ts ); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_GETTIME__ */ + +/* Legacy implementation of timespec */ +#if __MP_LEGACY_SUPPORT_TIMESPEC_GET__ + +#ifndef TIME_UTC +#define TIME_UTC 1 /* time elapsed since epoch */ +#endif + +__MP__BEGIN_DECLS + +extern int timespec_get(struct timespec *ts, int base); + +__MP__END_DECLS + +#endif /* __MP_LEGACY_SUPPORT_TIMESPEC_GET__ */ + +#endif /* _MACPORTS_TIME_H_ */ diff --git a/extern/macports-legacy-support/include/uuid/uuid.h b/extern/macports-legacy-support/include/uuid/uuid.h new file mode 100644 index 000000000..6b9373d80 --- /dev/null +++ b/extern/macports-legacy-support/include/uuid/uuid.h @@ -0,0 +1,36 @@ + +/* + * Copyright (c) 2022 + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_UUIDUUID_H_ +#define _MACPORTS_UUIDUUID_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system uuid/uuid.h */ +#include_next + +#if __MP_LEGACY_SUPPORT_UUID__ + +#ifndef _UUID_STRING_T +#define _UUID_STRING_T +typedef char uuid_string_t[37]; +#endif /* _UUID_STRING_T */ + +#endif /* __MP_LEGACY_SUPPORT_UTIMENSAT__ */ + +#endif /* _MACPORTS_UUIDUUID_H_ */ diff --git a/extern/macports-legacy-support/include/wchar.h b/extern/macports-legacy-support/include/wchar.h new file mode 100644 index 000000000..27c01468b --- /dev/null +++ b/extern/macports-legacy-support/include/wchar.h @@ -0,0 +1,53 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_WCHAR_H_ +#define _MACPORTS_WCHAR_H_ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* Include the primary system wchar.h */ +#include_next + +__MP__BEGIN_DECLS + +/* wcsdup */ +#if __MP_LEGACY_SUPPORT_WCSDUP__ + extern wchar_t * wcsdup(const wchar_t *s); +#endif + +/* wcsnlen */ +#if __MP_LEGACY_SUPPORT_WCSNLEN__ + extern size_t wcsnlen(const wchar_t *, size_t); +#endif + +/* wcpcpy, wcpncpy */ +#if __MP_LEGACY_SUPPORT_WCPCPY__ + extern wchar_t * wcpcpy(wchar_t *__restrict d, const wchar_t *__restrict s); + extern wchar_t *wcpncpy(wchar_t *__restrict d, const wchar_t *__restrict s, size_t n); +#endif + +/* wcsncasecmp, wcscasecmp */ +#if __MP_LEGACY_SUPPORT_WCSCASECMP__ + extern int wcscasecmp(const wchar_t *l, const wchar_t *r); + extern int wcsncasecmp(const wchar_t *l, const wchar_t *r, size_t n); +#endif + +__MP__END_DECLS + +#endif /* _MACPORTS_WCHAR_H_ */ diff --git a/extern/macports-legacy-support/include/xlocale/_wchar.h b/extern/macports-legacy-support/include/xlocale/_wchar.h new file mode 100644 index 000000000..31183d6dd --- /dev/null +++ b/extern/macports-legacy-support/include/xlocale/_wchar.h @@ -0,0 +1,35 @@ + +/* + * Copyright (c) 2018 Christian Cornelssen + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef _MACPORTS_XLOCALE__WCHAR_H_ +#define _MACPORTS_XLOCALE__WCHAR_H_ + +/* Include the primary system xlocale/_wchar.h */ +#include_next + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* wcsncasecmp_l, wcscasecmp_l */ +#if __MP_LEGACY_SUPPORT_WCSCASECMP__ +__MP__BEGIN_DECLS +extern int wcscasecmp_l(const wchar_t *l, const wchar_t *r, locale_t locale); +extern int wcsncasecmp_l(const wchar_t *l, const wchar_t *r, size_t n, locale_t locale); +__MP__END_DECLS +#endif + +#endif /* _MACPORTS_XLOCALE__WCHAR_H_ */ diff --git a/extern/macports-legacy-support/src/add_symbols.c b/extern/macports-legacy-support/src/add_symbols.c new file mode 100644 index 000000000..76aa34afd --- /dev/null +++ b/extern/macports-legacy-support/src/add_symbols.c @@ -0,0 +1,83 @@ +#include "MacportsLegacySupport.h" + +#if !(__MP_LEGACY_SUPPORT_POSIX_MEMALIGN__) +extern const char posix_memalign_tmp4 __asm("$ld$add$os10.4$_posix_memalign"); __attribute__((visibility("default"))) const char posix_memalign_tmp4 = 0; +extern const char posix_memalign_tmp5 __asm("$ld$add$os10.5$_posix_memalign"); __attribute__((visibility("default"))) const char posix_memalign_tmp5 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_REALPATH_WRAP__) +extern const char realpath_tmp4 __asm("$ld$add$os10.4$_realpath"); __attribute__((visibility("default"))) const char realpath_tmp4 = 0; +extern const char realpath_tmp5 __asm("$ld$add$os10.5$_realpath$DARWIN_EXTSN"); __attribute__((visibility("default"))) const char realpath_tmp5 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_SYSCONF_WRAP__) +extern const char sysconf_tmp4 __asm("$ld$add$os10.4$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp4 = 0; +extern const char sysconf_tmp5 __asm("$ld$add$os10.5$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp5 = 0; +extern const char sysconf_tmp6 __asm("$ld$add$os10.6$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp6 = 0; +extern const char sysconf_tmp7 __asm("$ld$add$os10.7$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp7 = 0; +extern const char sysconf_tmp8 __asm("$ld$add$os10.8$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp8 = 0; +extern const char sysconf_tmp9 __asm("$ld$add$os10.9$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp9 = 0; +extern const char sysconf_tmp10 __asm("$ld$add$os10.10$_sysconf"); __attribute__((visibility("default"))) const char sysconf_tmp10 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_PTHREAD_SETNAME_NP__) +extern const char pthread_setname_np_tmp4 __asm("$ld$add$os10.4$_pthread_setname_np"); __attribute__((visibility("default"))) const char pthread_setname_np_tmp4 = 0; +extern const char pthread_setname_np_tmp5 __asm("$ld$add$os10.5$_pthread_setname_np"); __attribute__((visibility("default"))) const char pthread_setname_np_tmp5 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_COPYFILE_WRAP__) +/* extern const char copyfile_state_get_tmp4 __asm("$ld$add$os10.4$_copyfile_state_get"); __attribute__((visibility("default"))) const char copyfile_state_get_tmp4 = 0; */ +extern const char copyfile_state_get_tmp5 __asm("$ld$add$os10.5$_copyfile_state_get"); __attribute__((visibility("default"))) const char copyfile_state_get_tmp5 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_ATEXIT_WRAP__) +extern const char _tlv_atexit_tmp4 __asm("$ld$add$os10.4$__tlv_atexit"); __attribute__((visibility("default"))) const char _tlv_atexit_tmp4 = 0; +extern const char _tlv_atexit_tmp5 __asm("$ld$add$os10.5$__tlv_atexit"); __attribute__((visibility("default"))) const char _tlv_atexit_tmp5 = 0; +extern const char _tlv_atexit_tmp6 __asm("$ld$add$os10.6$__tlv_atexit"); __attribute__((visibility("default"))) const char _tlv_atexit_tmp6 = 0; + +extern const char __cxa_thread_atexit_tmp4 __asm("$ld$add$os10.4$___cxa_thread_atexit"); __attribute__((visibility("default"))) const char __cxa_thread_atexit_tmp4 = 0; +extern const char __cxa_thread_atexit_tmp5 __asm("$ld$add$os10.5$___cxa_thread_atexit"); __attribute__((visibility("default"))) const char __cxa_thread_atexit_tmp5 = 0; +extern const char __cxa_thread_atexit_tmp6 __asm("$ld$add$os10.6$___cxa_thread_atexit"); __attribute__((visibility("default"))) const char __cxa_thread_atexit_tmp6 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_GETENTROPY__) +extern const char getentropy_tmp4 __asm("$ld$add$os10.4$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp4 = 0; +extern const char getentropy_tmp5 __asm("$ld$add$os10.5$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp5 = 0; +extern const char getentropy_tmp6 __asm("$ld$add$os10.6$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp6 = 0; +extern const char getentropy_tmp7 __asm("$ld$add$os10.7$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp7 = 0; +extern const char getentropy_tmp8 __asm("$ld$add$os10.8$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp8 = 0; +extern const char getentropy_tmp9 __asm("$ld$add$os10.9$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp9 = 0; +extern const char getentropy_tmp10 __asm("$ld$add$os10.10$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp10 = 0; +extern const char getentropy_tmp11 __asm("$ld$add$os10.11$_getentropy"); __attribute__((visibility("default"))) const char getentropy_tmp11 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_GETTIME__) +extern const char clock_gettime_tmp4 __asm("$ld$add$os10.4$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp4 = 0; +extern const char clock_gettime_tmp5 __asm("$ld$add$os10.5$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp5 = 0; +extern const char clock_gettime_tmp6 __asm("$ld$add$os10.6$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp6 = 0; +extern const char clock_gettime_tmp7 __asm("$ld$add$os10.7$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp7 = 0; +extern const char clock_gettime_tmp8 __asm("$ld$add$os10.8$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp8 = 0; +extern const char clock_gettime_tmp9 __asm("$ld$add$os10.9$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp9 = 0; +extern const char clock_gettime_tmp10 __asm("$ld$add$os10.10$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp10 = 0; +extern const char clock_gettime_tmp11 __asm("$ld$add$os10.11$_clock_gettime"); __attribute__((visibility("default"))) const char clock_gettime_tmp11 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_SYMBOL____bzero__) +extern const char __bzero_tmp4 __asm("$ld$add$os10.4$___bzero"); __attribute__((visibility("default"))) const char __bzero_tmp4 = 0; +extern const char __bzero_tmp5 __asm("$ld$add$os10.5$___bzero"); __attribute__((visibility("default"))) const char __bzero_tmp5 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_SYMBOL__dirfd__) +extern const char dirfd_tmp4 __asm("$ld$add$os10.4$_dirfd"); __attribute__((visibility("default"))) const char dirfd_tmp4 = 0; +extern const char dirfd_tmp5 __asm("$ld$add$os10.5$_dirfd"); __attribute__((visibility("default"))) const char dirfd_tmp5 = 0; +extern const char dirfd_tmp6 __asm("$ld$add$os10.6$_dirfd"); __attribute__((visibility("default"))) const char dirfd_tmp6 = 0; +extern const char dirfd_tmp7 __asm("$ld$add$os10.7$_dirfd"); __attribute__((visibility("default"))) const char dirfd_tmp7 = 0; +#endif + +#if !(__MP_LEGACY_SUPPORT_ATCALLS__) +extern const char fstatat$INODE64_tmp5 __asm("$ld$add$os10.5$_fstatat$INODE64"); __attribute__((visibility("default"))) const char fstatat$INODE64_tmp5 = 0; +extern const char fstatat$INODE64_tmp6 __asm("$ld$add$os10.6$_fstatat$INODE64"); __attribute__((visibility("default"))) const char fstatat$INODE64_tmp6 = 0; +extern const char fstatat$INODE64_tmp7 __asm("$ld$add$os10.7$_fstatat$INODE64"); __attribute__((visibility("default"))) const char fstatat$INODE64_tmp7 = 0; +extern const char fstatat$INODE64_tmp8 __asm("$ld$add$os10.8$_fstatat$INODE64"); __attribute__((visibility("default"))) const char fstatat$INODE64_tmp8 = 0; +extern const char fstatat$INODE64_tmp9 __asm("$ld$add$os10.9$_fstatat$INODE64"); __attribute__((visibility("default"))) const char fstatat$INODE64_tmp9 = 0; +#endif diff --git a/extern/macports-legacy-support/src/arc4random.c b/extern/macports-legacy-support/src/arc4random.c new file mode 100644 index 000000000..dc00b5b0a --- /dev/null +++ b/extern/macports-legacy-support/src/arc4random.c @@ -0,0 +1,540 @@ +/* + * Copyright (c) 1996, David Mazieres + * Copyright (c) 2008, Damien Miller + * Copyright (c) 2013, Markus Friedl + * Copyright (c) 2014, Theo de Raadt + * Copyright (c) 2015, Sudhi Herle + * + * Permission to use, copy, modify, and 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. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_ARC4RANDOM__ + +/* + * ChaCha based random number generator from OpenBSD. + * + * Made fully portable and thread-safe by Sudhi Herle. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define ARC4R_KEYSZ 32 +#define ARC4R_IVSZ 8 +#define ARC4R_BLOCKSZ 64 +#define ARC4R_RSBUFSZ (16*ARC4R_BLOCKSZ) + +typedef struct +{ + uint32_t input[16]; /* could be compressed */ +} chacha_ctx; + +struct rand_state +{ + size_t rs_have; /* valid bytes at end of rs_buf */ + size_t rs_count; /* bytes till reseed */ + pid_t rs_pid; /* My PID */ + chacha_ctx rs_chacha; /* chacha context for random keystream */ + u_char rs_buf[ARC4R_RSBUFSZ]; /* keystream blocks */ +}; +typedef struct rand_state rand_state; + +#define KEYSTREAM_ONLY + +typedef unsigned char u8; +typedef uint32_t u32; + + +#define U8C(v) (v##U) +#define U32C(v) (v##U) + +#define U8V(v) ((u8)(v) & U8C(0xFF)) +#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF)) + +#define ROTL32(v, n) \ + (U32V((v) << (n)) | ((v) >> (32 - (n)))) + +#define U8TO32_LITTLE(p) \ + (((u32)((p)[0]) ) | \ + ((u32)((p)[1]) << 8) | \ + ((u32)((p)[2]) << 16) | \ + ((u32)((p)[3]) << 24)) + +#define U32TO8_LITTLE(p, v) \ + do { \ + (p)[0] = U8V((v) ); \ + (p)[1] = U8V((v) >> 8); \ + (p)[2] = U8V((v) >> 16); \ + (p)[3] = U8V((v) >> 24); \ + } while (0) + +#define ROTATE(v,c) (ROTL32(v,c)) +#define XOR(v,w) ((v) ^ (w)) +#define PLUS(v,w) (U32V((v) + (w))) +#define PLUSONE(v) (PLUS((v),1)) + +#define QUARTERROUND(a,b,c,d) \ + a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \ + c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \ + a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \ + c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); + +static const char sigma[16] = "expand 32-byte k"; +static const char tau[16] = "expand 16-byte k"; + +static void +_chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits,u32 ivbits) +{ + const char *constants; + + (void)ivbits; + + x->input[4] = U8TO32_LITTLE(k + 0); + x->input[5] = U8TO32_LITTLE(k + 4); + x->input[6] = U8TO32_LITTLE(k + 8); + x->input[7] = U8TO32_LITTLE(k + 12); + if (kbits == 256) { /* recommended */ + k += 16; + constants = sigma; + } else { /* kbits == 128 */ + constants = tau; + } + x->input[8] = U8TO32_LITTLE(k + 0); + x->input[9] = U8TO32_LITTLE(k + 4); + x->input[10] = U8TO32_LITTLE(k + 8); + x->input[11] = U8TO32_LITTLE(k + 12); + x->input[0] = U8TO32_LITTLE(constants + 0); + x->input[1] = U8TO32_LITTLE(constants + 4); + x->input[2] = U8TO32_LITTLE(constants + 8); + x->input[3] = U8TO32_LITTLE(constants + 12); +} + +static void +_chacha_ivsetup(chacha_ctx *x,const u8 *iv) +{ + x->input[12] = 0; + x->input[13] = 0; + x->input[14] = U8TO32_LITTLE(iv + 0); + x->input[15] = U8TO32_LITTLE(iv + 4); +} + +static void +_chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes) +{ + u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15; + u8 *ctarget = NULL; + u8 tmp[64]; + u_int i; + + if (!bytes) return; + + j0 = x->input[0]; + j1 = x->input[1]; + j2 = x->input[2]; + j3 = x->input[3]; + j4 = x->input[4]; + j5 = x->input[5]; + j6 = x->input[6]; + j7 = x->input[7]; + j8 = x->input[8]; + j9 = x->input[9]; + j10 = x->input[10]; + j11 = x->input[11]; + j12 = x->input[12]; + j13 = x->input[13]; + j14 = x->input[14]; + j15 = x->input[15]; + + for (;;) { + if (bytes < 64) { + for (i = 0;i < bytes;++i) tmp[i] = m[i]; + m = tmp; + ctarget = c; + c = tmp; + } + x0 = j0; + x1 = j1; + x2 = j2; + x3 = j3; + x4 = j4; + x5 = j5; + x6 = j6; + x7 = j7; + x8 = j8; + x9 = j9; + x10 = j10; + x11 = j11; + x12 = j12; + x13 = j13; + x14 = j14; + x15 = j15; + for (i = 20;i > 0;i -= 2) { + QUARTERROUND( x0, x4, x8,x12) + QUARTERROUND( x1, x5, x9,x13) + QUARTERROUND( x2, x6,x10,x14) + QUARTERROUND( x3, x7,x11,x15) + QUARTERROUND( x0, x5,x10,x15) + QUARTERROUND( x1, x6,x11,x12) + QUARTERROUND( x2, x7, x8,x13) + QUARTERROUND( x3, x4, x9,x14) + } + x0 = PLUS(x0,j0); + x1 = PLUS(x1,j1); + x2 = PLUS(x2,j2); + x3 = PLUS(x3,j3); + x4 = PLUS(x4,j4); + x5 = PLUS(x5,j5); + x6 = PLUS(x6,j6); + x7 = PLUS(x7,j7); + x8 = PLUS(x8,j8); + x9 = PLUS(x9,j9); + x10 = PLUS(x10,j10); + x11 = PLUS(x11,j11); + x12 = PLUS(x12,j12); + x13 = PLUS(x13,j13); + x14 = PLUS(x14,j14); + x15 = PLUS(x15,j15); + +#ifndef KEYSTREAM_ONLY + x0 = XOR(x0,U8TO32_LITTLE(m + 0)); + x1 = XOR(x1,U8TO32_LITTLE(m + 4)); + x2 = XOR(x2,U8TO32_LITTLE(m + 8)); + x3 = XOR(x3,U8TO32_LITTLE(m + 12)); + x4 = XOR(x4,U8TO32_LITTLE(m + 16)); + x5 = XOR(x5,U8TO32_LITTLE(m + 20)); + x6 = XOR(x6,U8TO32_LITTLE(m + 24)); + x7 = XOR(x7,U8TO32_LITTLE(m + 28)); + x8 = XOR(x8,U8TO32_LITTLE(m + 32)); + x9 = XOR(x9,U8TO32_LITTLE(m + 36)); + x10 = XOR(x10,U8TO32_LITTLE(m + 40)); + x11 = XOR(x11,U8TO32_LITTLE(m + 44)); + x12 = XOR(x12,U8TO32_LITTLE(m + 48)); + x13 = XOR(x13,U8TO32_LITTLE(m + 52)); + x14 = XOR(x14,U8TO32_LITTLE(m + 56)); + x15 = XOR(x15,U8TO32_LITTLE(m + 60)); +#endif + + j12 = PLUSONE(j12); + if (!j12) { + j13 = PLUSONE(j13); + /* stopping at 2^70 bytes per nonce is user's responsibility */ + } + + U32TO8_LITTLE(c + 0,x0); + U32TO8_LITTLE(c + 4,x1); + U32TO8_LITTLE(c + 8,x2); + U32TO8_LITTLE(c + 12,x3); + U32TO8_LITTLE(c + 16,x4); + U32TO8_LITTLE(c + 20,x5); + U32TO8_LITTLE(c + 24,x6); + U32TO8_LITTLE(c + 28,x7); + U32TO8_LITTLE(c + 32,x8); + U32TO8_LITTLE(c + 36,x9); + U32TO8_LITTLE(c + 40,x10); + U32TO8_LITTLE(c + 44,x11); + U32TO8_LITTLE(c + 48,x12); + U32TO8_LITTLE(c + 52,x13); + U32TO8_LITTLE(c + 56,x14); + U32TO8_LITTLE(c + 60,x15); + + if (bytes <= 64) { + if (bytes < 64) { + for (i = 0;i < bytes;++i) ctarget[i] = c[i]; + } + x->input[12] = j12; + x->input[13] = j13; + return; + } + bytes -= 64; + c += 64; +#ifndef KEYSTREAM_ONLY + m += 64; +#endif + } +} + +#define minimum(a, b) ((a) < (b) ? (a) : (b)) + +#include "arc4random.h" + + +static inline void +_rs_init(rand_state* st, u8 *buf, size_t n) +{ + assert(n >= (ARC4R_KEYSZ + ARC4R_IVSZ)); + + _chacha_keysetup(&st->rs_chacha, buf, ARC4R_KEYSZ * 8, 0); + _chacha_ivsetup(&st->rs_chacha, buf + ARC4R_KEYSZ); +} + + + +static inline void +_rs_rekey(rand_state* st, u8 *dat, size_t datlen) +{ + /* fill rs_buf with the keystream */ + _chacha_encrypt_bytes(&st->rs_chacha, st->rs_buf, st->rs_buf, sizeof st->rs_buf); + + /* mix in optional user provided data */ + if (dat) { + size_t i, m; + + m = minimum(datlen, ARC4R_KEYSZ + ARC4R_IVSZ); + for (i = 0; i < m; i++) + st->rs_buf[i] ^= dat[i]; + + memset(dat, 0, datlen); + } + + /* immediately reinit for backtracking resistance */ + _rs_init(st, st->rs_buf, ARC4R_KEYSZ + ARC4R_IVSZ); + memset(st->rs_buf, 0, ARC4R_KEYSZ + ARC4R_IVSZ); + st->rs_have = (sizeof st->rs_buf) - ARC4R_KEYSZ - ARC4R_IVSZ; +} + + +static void +_rs_stir(rand_state* st) +{ + u8 rnd[ARC4R_KEYSZ + ARC4R_IVSZ]; + + + int r = getentropy(rnd, sizeof rnd); + assert(r == 0); + + _rs_rekey(st, rnd, sizeof(rnd)); + + /* invalidate rs_buf */ + st->rs_have = 0; + memset(st->rs_buf, 0, sizeof st->rs_buf); + + st->rs_count = 1600000; +} + + +static inline void +_rs_stir_if_needed(rand_state* st, size_t len) +{ + if (st->rs_count <= len) + _rs_stir(st); + + st->rs_count -= len; +} + + +static inline void +_rs_random_buf(rand_state* rs, void *_buf, size_t n) +{ + u8 *buf = (u8 *)_buf; + u8 *keystream; + size_t m; + + _rs_stir_if_needed(rs, n); + while (n > 0) { + if (rs->rs_have > 0) { + m = minimum(n, rs->rs_have); + keystream = rs->rs_buf + sizeof(rs->rs_buf) - rs->rs_have; + memcpy(buf, keystream, m); + memset(keystream, 0, m); + buf += m; + n -= m; + rs->rs_have -= m; + } else + _rs_rekey(rs, NULL, 0); + } +} + +static inline uint32_t +_rs_random_u32(rand_state* rs) +{ + u8 *keystream; + uint32_t val; + + _rs_stir_if_needed(rs, sizeof(val)); + if (rs->rs_have < sizeof(val)) + _rs_rekey(rs, NULL, 0); + keystream = rs->rs_buf + sizeof(rs->rs_buf) - rs->rs_have; + memcpy(&val, keystream, sizeof(val)); + memset(keystream, 0, sizeof(val)); + rs->rs_have -= sizeof(val); + + return val; +} + + +#if defined(__Darwin__) || defined(__APPLE__) + +/* + * Multi-threaded support using pthread API. Needed for OS X: + * + * https://www.reddit.com/r/cpp/comments/3bg8jc/anyone_know_if_and_when_applexcode_will_support/ + */ +static pthread_key_t Rkey; +static pthread_once_t Ronce = PTHREAD_ONCE_INIT; +static volatile uint32_t Rforked = 0; + +/* + * Fork handler to reset my context + */ +static void +_atfork() +{ + // the pthread_atfork() callbacks called once per process. + // We set it to be called by the child process. + Rforked++; +} + +/* + * Run once and only once by pthread lib. We use the opportunity to + * create the thread-specific key. + */ +static void +_screate() +{ + pthread_key_create(&Rkey, 0); + pthread_atfork(0, 0, _atfork); + + /* + * Get entropy once to initialize the fd - for non OpenBSD + * systems. + */ + uint8_t buf[8]; + getentropy(buf, sizeof buf); +} + + +/* + * Get the per-thread rand state. Initialize if needed. + */ +static rand_state* +_sget() +{ + pthread_once(&Ronce, _screate); + + volatile pthread_key_t* k = &Rkey; + rand_state * z = (rand_state *)pthread_getspecific(*k); + if (!z) { + z = (rand_state*)calloc(sizeof *z, 1); + assert(z); + + _rs_stir(z); + z->rs_pid = getpid(); + + pthread_setspecific(*k, z); + } + + /* Detect if a fork has happened */ + if (Rforked > 0 || getpid() != z->rs_pid) { + Rforked = 0; + z->rs_pid = getpid(); + _rs_stir(z); + } + + return z; +} + +#else + +/* + * Use gcc extension to declare a thread-local variable. + * + * On most systems (including x86_64), thread-local access is + * essentially free for non .so use cases. + * + */ +static __thread rand_state st = { .rs_count = 0, .rs_pid = 0 }; +static inline rand_state* +_sget() +{ + rand_state* s = &st; + + if (s->rs_count == 0 || getpid() != s->rs_pid) { + _rs_stir(s); + s->rs_pid = getpid(); + } + return s; +} + +#endif /* __Darwin__ */ + + +/* + * Public API. + */ + + +void +arc4random_buf(void* b, size_t n) +{ + rand_state* z = _sget(); + + _rs_random_buf(z, b, n); +} + + + +/* + * Calculate a uniformly distributed random number less than upper_bound + * avoiding "modulo bias". + * + * Uniformity is achieved by generating new random numbers until the one + * returned is outside the range [0, 2**32 % upper_bound). This + * guarantees the selected random number will be inside + * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) + * after reduction modulo upper_bound. + */ +uint32_t +arc4random_uniform(uint32_t upper_bound) +{ + rand_state* z = _sget(); + uint32_t r, min; + + if (upper_bound < 2) + return 0; + + /* 2**32 % x == (2**32 - x) % x */ + min = -upper_bound % upper_bound; + + /* + * This could theoretically loop forever but each retry has + * p > 0.5 (worst case, usually far better) of selecting a + * number inside the range we need, so it should rarely need + * to re-roll. + */ + for (;;) { + r = _rs_random_u32(z); + if (r >= min) + break; + } + + return r % upper_bound; +} + + +#endif /* __MP_LEGACY_SUPPORT_ARC4RANDOM__ */ diff --git a/extern/macports-legacy-support/src/arc4random.h b/extern/macports-legacy-support/src/arc4random.h new file mode 100644 index 000000000..ad6d43aa0 --- /dev/null +++ b/extern/macports-legacy-support/src/arc4random.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1996, David Mazieres + * Copyright (c) 2008, Damien Miller + * Copyright (c) 2013, Markus Friedl + * Copyright (c) 2014, Theo de Raadt + * Copyright (c) 2015, Sudhi Herle + * + * Permission to use, copy, modify, and 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. + */ + +#ifndef ___ARC4RANDOM_H_5000666_1462841354__ +#define ___ARC4RANDOM_H_5000666_1462841354__ 1 + + /* Provide C linkage for symbols declared here .. */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include +#include + +/* + * Generate and return a uniformly random 32-bit quantity with an + * upper bound of 'upper_bound' + */ +extern uint32_t arc4random_uniform(uint32_t upper_bound); + +/* + * Generate 'n' random bytes and put them in 'buf'. + */ +extern void arc4random_buf(void* buf, size_t n); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* ! ___ARC4RANDOM_H_5000666_1462841354__ */ + +/* EOF */ diff --git a/extern/macports-legacy-support/src/dirfuncs_compat.c b/extern/macports-legacy-support/src/dirfuncs_compat.c new file mode 100644 index 000000000..c84346763 --- /dev/null +++ b/extern/macports-legacy-support/src/dirfuncs_compat.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2024 Frederick H. G. Wright II + * + * Permission to use, copy, modify, and 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. + */ + +/* + * Earlier versions of legacy-support needed wrappers around several OS + * calls related to directories, in order to implement fdopendir(). That + * is no longer the case, but existing dependents still reference those + * wrapper calls. For compatibility, we continue to provide those functions, + * but just as transparent wrappers around the OS calls. + * + * These wrappers can eventually be removed once all dependents have been + * rebuilt with the current headers. But since there would be significant + * work in determining when this is the case, and since they only add 752 + * bytes to the library size, they should probably be left in place for a + * long time. + * + * This is only relevant for OS versions where our fdopendir() is needed, + * hence the conditional (which is the same conditional as was used for + * the earlier implementations). + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_FDOPENDIR__ + +#include "dirfuncs_compat.h" + +DIR * +__mpls_opendir(const char *filename) { + return opendir(filename); +} + +struct dirent * +__mpls_readdir(DIR *dirp) { + return readdir(dirp); +} + +int +__mpls_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) { + return readdir_r(dirp, entry, result); +} + +long +__mpls_telldir(DIR *dirp) { + return telldir(dirp); +} + +void +__mpls_seekdir(DIR *dirp, long loc) { + seekdir(dirp, loc); +} + +void +__mpls_rewinddir(DIR *dirp) { + rewinddir(dirp); +} + +int +__mpls_closedir(DIR *dirp) { + return closedir(dirp); +} + +int +__mpls_dirfd(DIR *dirp) { + return dirfd(dirp); +} + +#endif /* __MP_LEGACY_SUPPORT_FDOPENDIR__ */ diff --git a/extern/macports-legacy-support/src/dirfuncs_compat.h b/extern/macports-legacy-support/src/dirfuncs_compat.h new file mode 100644 index 000000000..4329bdcfc --- /dev/null +++ b/extern/macports-legacy-support/src/dirfuncs_compat.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024 Frederick H. G. Wright II + * + * Permission to use, copy, modify, and 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. + */ + +/* Prototypes for directory function compatibility wrappers */ + +#ifndef __MP_LEGACY_SUPPORT_DIRFUNCS_COMPAT_H +#define __MP_LEGACY_SUPPORT_DIRFUNCS_COMPAT_H + +#include + +DIR * +__mpls_opendir(const char *filename); + +struct dirent * +__mpls_readdir(DIR *dirp); + +int +__mpls_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); + +long +__mpls_telldir(DIR *dirp); + +void +__mpls_seekdir(DIR *dirp, long loc); + +void +__mpls_rewinddir(DIR *dirp); + +int +__mpls_closedir(DIR *dirp); + +int +__mpls_dirfd(DIR *dirp); + +#endif /* __MP_LEGACY_SUPPORT_DIRFUNCS_COMPAT_H */ diff --git a/extern/macports-legacy-support/src/dprintf.c b/extern/macports-legacy-support/src/dprintf.c new file mode 100644 index 000000000..83f7e9de2 --- /dev/null +++ b/extern/macports-legacy-support/src/dprintf.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Evan Miller + * + * Permission to use, copy, modify, and 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. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_DPRINTF__ + +#include +#include +#include + +int dprintf(int fildes, const char * __restrict format, ...) { + FILE *stream = fdopen(fildes, "w"); + if (stream == NULL) { + errno = EBADF; + return -1; + } + va_list ap; + va_start(ap, format); + int result = vfprintf(stream, format, ap); + va_end(ap); + fclose(stream); + return result; +} + +#endif /* __MP_LEGACY_SUPPORT_DPRINTF__ */ diff --git a/extern/macports-legacy-support/src/fmemopen.c b/extern/macports-legacy-support/src/fmemopen.c new file mode 100644 index 000000000..22f7f1050 --- /dev/null +++ b/extern/macports-legacy-support/src/fmemopen.c @@ -0,0 +1,262 @@ +/*- + * Copyright (C) 2013 Pietro Cerutti + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#include +#include +#include +#include +#include + +extern int __sflags(const char *, int *); + +struct fmemopen_cookie +{ + char *buf; /* pointer to the memory region */ + bool own; /* did we allocate the buffer ourselves? */ + char bin; /* is this a binary buffer? */ + size_t size; /* buffer length in bytes */ + size_t len; /* data length in bytes */ + size_t off; /* current offset into the buffer */ +}; + +static int fmemopen_read(void *cookie, char *buf, int nbytes); +static int fmemopen_write(void *cookie, const char *buf, int nbytes); +static fpos_t fmemopen_seek(void *cookie, fpos_t offset, int whence); +static int fmemopen_close(void *cookie); + +FILE * +fmemopen(void * __restrict buf, size_t size, const char * __restrict mode) +{ + struct fmemopen_cookie *ck; + FILE *f; + int flags, rc; + + /* + * POSIX says we shall return EINVAL if size is 0. + */ + if (size == 0) { + errno = EINVAL; + return (NULL); + } + + /* + * Retrieve the flags as used by open(2) from the mode argument, and + * validate them. + */ + rc = __sflags(mode, &flags); + if (rc == 0) { + errno = EINVAL; + return (NULL); + } + + /* + * There's no point in requiring an automatically allocated buffer + * in write-only mode. + */ + if (!(flags & O_RDWR) && buf == NULL) { + errno = EINVAL; + return (NULL); + } + + ck = malloc(sizeof(struct fmemopen_cookie)); + if (ck == NULL) { + return (NULL); + } + + ck->off = 0; + ck->size = size; + + /* Check whether we have to allocate the buffer ourselves. */ + ck->own = ((ck->buf = buf) == NULL); + if (ck->own) { + ck->buf = malloc(size); + if (ck->buf == NULL) { + free(ck); + return (NULL); + } + } + + /* + * POSIX distinguishes between w+ and r+, in that w+ is supposed to + * truncate the buffer. + */ + if (ck->own || mode[0] == 'w') { + ck->buf[0] = '\0'; + } + + /* Check for binary mode. */ + ck->bin = strchr(mode, 'b') != NULL; + + /* + * The size of the current buffer contents is set depending on the + * mode: + * + * for append (text-mode), the position of the first NULL byte, or the + * size of the buffer if none is found + * + * for append (binary-mode), the size of the buffer + * + * for read, the size of the buffer + * + * for write, 0 + */ + switch (mode[0]) { + case 'a': + ck->off = ck->len = strnlen(ck->buf, ck->size); + break; + case 'r': + ck->len = size; + break; + case 'w': + ck->len = 0; + break; + } + + f = funopen(ck, + flags & O_WRONLY ? NULL : fmemopen_read, + flags & O_RDONLY ? NULL : fmemopen_write, + fmemopen_seek, fmemopen_close); + + if (f == NULL) { + if (ck->own) + free(ck->buf); + free(ck); + return (NULL); + } + + if (mode[0] == 'a') + f->_flags |= __SAPP; + + /* + * Turn off buffering, so a write past the end of the buffer + * correctly returns a short object count. + */ + setvbuf(f, NULL, _IONBF, 0); + + return (f); +} + +static int +fmemopen_read(void *cookie, char *buf, int nbytes) +{ + struct fmemopen_cookie *ck = cookie; + + if (nbytes > ck->len - ck->off) + nbytes = ck->len - ck->off; + + if (nbytes == 0) + return (0); + + memcpy(buf, ck->buf + ck->off, nbytes); + + ck->off += nbytes; + + return (nbytes); +} + +static int +fmemopen_write(void *cookie, const char *buf, int nbytes) +{ + struct fmemopen_cookie *ck = cookie; + + if (nbytes > ck->size - ck->off) + nbytes = ck->size - ck->off; + + if (nbytes == 0) + return (0); + + memcpy(ck->buf + ck->off, buf, nbytes); + + ck->off += nbytes; + + if (ck->off > ck->len) + ck->len = ck->off; + + /* + * We append a NULL byte if all these conditions are met: + * - the buffer is not binary + * - the buffer is not full + * - the data just written doesn't already end with a NULL byte + */ + if (!ck->bin && ck->off < ck->size && ck->buf[ck->off - 1] != '\0') + ck->buf[ck->off] = '\0'; + + return (nbytes); +} + +static fpos_t +fmemopen_seek(void *cookie, fpos_t offset, int whence) +{ + struct fmemopen_cookie *ck = cookie; + + + switch (whence) { + case SEEK_SET: + if (offset > ck->size) { + errno = EINVAL; + return (-1); + } + ck->off = offset; + break; + + case SEEK_CUR: + if (ck->off + offset > ck->size) { + errno = EINVAL; + return (-1); + } + ck->off += offset; + break; + + case SEEK_END: + if (offset > 0 || -offset > ck->len) { + errno = EINVAL; + return (-1); + } + ck->off = ck->len + offset; + break; + + default: + errno = EINVAL; + return (-1); + } + + return (ck->off); +} + +static int +fmemopen_close(void *cookie) +{ + struct fmemopen_cookie *ck = cookie; + + if (ck->own) + free(ck->buf); + + free(ck); + + return (0); +} diff --git a/extern/macports-legacy-support/src/fsetattrlist.c b/extern/macports-legacy-support/src/fsetattrlist.c new file mode 100644 index 000000000..245a12965 --- /dev/null +++ b/extern/macports-legacy-support/src/fsetattrlist.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021 Mihai Moldovan + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_FSETATTRLIST__ + +#include +#include +#include +#include + +#include +#include +#include + + +#ifdef __LP64__ +int fsetattrlist(int fd, void *a, void *buf, size_t size, unsigned int flags) +#else /* defined (__LP64__) */ +int fsetattrlist(int fd, void *a, void *buf, size_t size, unsigned long flags) +#endif /* defined (__LP64__) */ +{ + int cont = 1, + ret = 0; + + char fpath[MAXPATHLEN]; + memset (fpath, 0, MAXPATHLEN); + if (-1 == fcntl(fd, F_GETPATH, fpath)) { + ret = EBADF; + cont = 0; + } + +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1080 + /* + * Older systems don't correctly check if no attributes are to be set, which usually + * means a buffer size of zero and return an error since they malloc a block of + * memory with size zero, leading to ENOMEM. + * + * Emulate the fix from 10.8 for those. + */ + const struct attrlist *al = a; + if (al->commonattr == 0 && + (al->volattr & ~ATTR_VOL_INFO) == 0 && + al->dirattr == 0 && + al->fileattr == 0 && + al->forkattr == 0) { + cont = 0; + + /* + * Explicitly let the potential error from above pass through, since that's what + * the original function seems to do as well. + */ + } +#endif + + if (cont) { + ret = setattrlist(fpath, a, buf, size, flags); + } + + return ret; +} + +#endif /* __MP_LEGACY_SUPPORT_FSETATTRLIST__ */ diff --git a/extern/macports-legacy-support/src/fsgetpath.c b/extern/macports-legacy-support/src/fsgetpath.c new file mode 100644 index 000000000..733235b82 --- /dev/null +++ b/extern/macports-legacy-support/src/fsgetpath.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2019 + * from an example posted in Apple Developer Support + * https://forums.developer.apple.com/thread/103162 + * + * Permission to use, copy, modify, and 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. + */ + + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_FSGETPATH__ + + +#if 1 +/* SYS_fsgetpath is only available on 10.6 and up */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 +/* implement using a syscall available macOS 10.6 to 10.12 */ +/* this should be thoroughly vetted as a syscall, but is private API */ +#include +#include +#include +#include +ssize_t fsgetpath(char * buf, size_t buflen, fsid_t * fsid, uint64_t obj_id) { + return (ssize_t)syscall(SYS_fsgetpath, buf, (size_t)buflen, fsid, (uint64_t)obj_id); +} +#endif +#endif + +#if 0 +/* implement with a compatability function that presently compiles on 10.6 and over */ +/* this may be better (see linked post above) but it's hard to thoroughly test it. */ +/* this may also be able to be expanded to cover 10.4 and 10.5 if we can workaround ATTR_CMN_FULLPATH */ +#include +#include +#include +#include +#include +#include + +ssize_t fsgetpath(char * buf, size_t buflen, fsid_t * fsid, uint64_t obj_id) { + char volfsPath[64]; // 8 for `/.vol//\0`, 10 for `fsid->val[0]`, 20 for `obj_id`, rounded up for paranoia + + snprintf(volfsPath, sizeof(volfsPath), "/.vol/%ld/%llu", (long) fsid->val[0], (unsigned long long) obj_id); + + struct { + uint32_t length; + attrreference_t pathRef; + char buffer[MAXPATHLEN]; + } __attribute__((aligned(4), packed)) attrBuf; + + struct attrlist attrList; + memset(&attrList, 0, sizeof(attrList)); + attrList.bitmapcount = ATTR_BIT_MAP_COUNT; + attrList.commonattr = ATTR_CMN_FULLPATH; + + int success = getattrlist(volfsPath, &attrList, &attrBuf, sizeof(attrBuf), 0) == 0; + if ( ! success ) { + return -1; + } + if (attrBuf.pathRef.attr_length > buflen) { + errno = ENOSPC; + return -1; + } + strlcpy(buf, ((const char *) &attrBuf.pathRef) + attrBuf.pathRef.attr_dataoffset, buflen); + return attrBuf.pathRef.attr_length; +} +#endif + +#endif /* __MP_LEGACY_SUPPORT_FSGETPATH__ */ diff --git a/extern/macports-legacy-support/src/getdelim.c b/extern/macports-legacy-support/src/getdelim.c new file mode 100644 index 000000000..1b91b8ce4 --- /dev/null +++ b/extern/macports-legacy-support/src/getdelim.c @@ -0,0 +1,105 @@ + +/*- + * Copyright (c) 2011 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_GETLINE__ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getdelim.h" + +#include +#include +#include + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif +#ifndef SSIZE_MAX +# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif +#if !HAVE_FLOCKFILE +# undef flockfile +# define flockfile(x) ((void) 0) +#endif +#if !HAVE_FUNLOCKFILE +# undef funlockfile +# define funlockfile(x) ((void) 0) +#endif + +/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and + NUL-terminate it). *LINEPTR is a pointer returned from malloc (or + NULL), pointing to *N characters of space. It is realloc'ed as + necessary. Returns the number of characters read (not including + the null terminator), or -1 on error or EOF. */ + +ssize_t +getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) +{ + char *ptr, *eptr; + + + if (*buf == NULL || *bufsiz == 0) { + *bufsiz = BUFSIZ; + if ((*buf = malloc(*bufsiz)) == NULL) + return -1; + } + + for (ptr = *buf, eptr = *buf + *bufsiz;;) { + int c = fgetc(fp); + if (c == -1) { + if (feof(fp)) + return ptr == *buf ? -1 : ptr - *buf; + else + return -1; + } + *ptr++ = c; + if (c == delimiter) { + *ptr = '\0'; + return ptr - *buf; + } + if (ptr + 2 >= eptr) { + char *nbuf; + size_t nbufsiz = *bufsiz * 2; + ssize_t d = ptr - *buf; + if ((nbuf = realloc(*buf, nbufsiz)) == NULL) + return -1; + *buf = nbuf; + *bufsiz = nbufsiz; + eptr = nbuf + nbufsiz; + ptr = nbuf + d; + } + } +} + +#endif diff --git a/extern/macports-legacy-support/src/getdelim.h b/extern/macports-legacy-support/src/getdelim.h new file mode 100644 index 000000000..2dabee2ff --- /dev/null +++ b/extern/macports-legacy-support/src/getdelim.h @@ -0,0 +1,37 @@ + +/* + * Copyright (c) Ian F. Darwin 1986-1995. + * Software written by Ian F. Darwin and others; + * maintained 1995-present by Christos Zoulas and others. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Get size_t, FILE, ssize_t. And getdelim, if available. */ +# include +# include +# include + +#if !HAVE_DECL_GETDELIM +ssize_t getdelim(char **dst, size_t *len, int delimiter, FILE *fp); +#endif /* !HAVE_GETDELIM */ diff --git a/extern/macports-legacy-support/src/getentropy.c b/extern/macports-legacy-support/src/getentropy.c new file mode 100644 index 000000000..847745e47 --- /dev/null +++ b/extern/macports-legacy-support/src/getentropy.c @@ -0,0 +1,89 @@ + +/* + * Copyright (c) 2021 + * + * Permission to use, copy, modify, and 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. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_GETENTROPY__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void +_error(int doexit, int err, const char* fmt, ...) +{ + va_list ap; + + fflush(stdout); + fflush(stderr); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + if (err > 0) + fprintf(stderr, "\n %s (Errno %d)\n", strerror(err), err); + + if (doexit) { + fflush(stderr); + exit(1); + } +} + +static int +_randopen(const char* name) +{ + int fd = open(name, O_RDONLY); + if (fd < 0) { + _error(1, errno, "Cannot open system random number dev %s", name); + } + + return fd; +} + +int +getentropy(void* buf, size_t n) +{ + + static int fd = -1; + uint8_t* b = (uint8_t*)buf; + + if (fd < 0) + fd = _randopen("/dev/urandom"); + + while (n > 0) + { + ssize_t m = (read)(fd, b, n); + + if (m < 0) { + if (errno == EINTR) continue; + _error(1, errno, "Fatal read error while reading rand dev"); + } + b += m; + n -= m; + } + + return 0; +} + +#endif /* __MP_LEGACY_SUPPORT_GETENTROPY__ */ diff --git a/extern/macports-legacy-support/src/getline.c b/extern/macports-legacy-support/src/getline.c new file mode 100644 index 000000000..63a4cc275 --- /dev/null +++ b/extern/macports-legacy-support/src/getline.c @@ -0,0 +1,48 @@ + +/*- + * Copyright (c) 2011 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_GETLINE__ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getdelim.h" +#include "getline.h" + +ssize_t +getline(char **buf, size_t *bufsiz, FILE *fp) +{ + return getdelim(buf, bufsiz, '\n', fp); +} + +#endif /* __MP_LEGACY_SUPPORT_GETLINE__ */ diff --git a/extern/macports-legacy-support/src/getline.h b/extern/macports-legacy-support/src/getline.h new file mode 100644 index 000000000..9638afc9c --- /dev/null +++ b/extern/macports-legacy-support/src/getline.h @@ -0,0 +1,37 @@ + +/* + * Copyright (c) Ian F. Darwin 1986-1995. + * Software written by Ian F. Darwin and others; + * maintained 1995-present by Christos Zoulas and others. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Get size_t, FILE, ssize_t. And getline, if available. */ +# include +# include +# include + +#if !HAVE_DECL_GETLINE +ssize_t getline(char **dst, size_t *len, FILE *fp); +#endif /* !HAVE_GETLINE */ diff --git a/extern/macports-legacy-support/src/macports_legacy_atexit.c b/extern/macports-legacy-support/src/macports_legacy_atexit.c new file mode 100644 index 000000000..638542675 --- /dev/null +++ b/extern/macports-legacy-support/src/macports_legacy_atexit.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2022 + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* _tlv_atexit wrap */ +#if __MP_LEGACY_SUPPORT_ATEXIT_WRAP__ + +#include +#include + +/* signature from https://opensource.apple.com/source/dyld/dyld-852.2/src/threadLocalVariables.c.auto.html */ +void _tlv_atexit(void (*func)(void*), void* objAddr) { + void (*real__tlv_atexit)(void (*func)(void*), void* objAddr); + int (*real___cxa_thread_atexit)(void (*dtor)(void*), void* obj, void* dso_symbol); + + real__tlv_atexit = dlsym(RTLD_NEXT, "_tlv_atexit"); + if (real__tlv_atexit != NULL) { + /* _tlv_atexit exists in libSystem.B.dylib on 10.7 and later */ + real__tlv_atexit(func, objAddr); + return; + } + + real___cxa_thread_atexit = dlsym(RTLD_DEFAULT, "__cxa_thread_atexit"); + if (real___cxa_thread_atexit != NULL) { + /* __cxa_thread_atexit exists in + MacPorts provided libc++ on 10.6 and earlier + libSystem.B.dylib on 10.8 and later + MacPorts provided libstdc++ + + in all cases, third parameter (dso_handle) seems to be ignored + */ + real___cxa_thread_atexit(func, objAddr, NULL); + return; + } + + exit(EXIT_FAILURE); +} + +/* signature from https://github.com/llvm-mirror/libcxxabi/blob/master/src/cxa_thread_atexit.cpp */ +int __cxa_thread_atexit(void (*dtor)(void*), void* obj, void* dso_symbol) { + void (*real__tlv_atexit)(void (*func)(void*), void* objAddr); + int (*real___cxa_thread_atexit)(void (*dtor)(void*), void* obj, void* dso_symbol); + + real___cxa_thread_atexit = dlsym(RTLD_NEXT, "__cxa_thread_atexit"); + if (real___cxa_thread_atexit != NULL) { + /* __cxa_thread_atexit exists in + MacPorts provided libc++ on 10.6 and earlier + libSystem.B.dylib on 10.8 and later + MacPorts provided libstdc++ + */ + return real___cxa_thread_atexit(dtor, obj, dso_symbol); + } + + real__tlv_atexit = dlsym(RTLD_DEFAULT, "_tlv_atexit"); + if (real__tlv_atexit != NULL) { + /* _tlv_atexit exists in libSystem.B.dylib on 10.7 and later + + it seems to be common practice to ignore dso_symbol + */ + real__tlv_atexit(dtor, obj); + return 0; + } + + exit(EXIT_FAILURE); +} + +#endif /*__MP_LEGACY_SUPPORT_ATEXIT_WRAP__*/ diff --git a/extern/macports-legacy-support/src/macports_legacy_copyfile.c b/extern/macports-legacy-support/src/macports_legacy_copyfile.c new file mode 100644 index 000000000..bc5de25f6 --- /dev/null +++ b/extern/macports-legacy-support/src/macports_legacy_copyfile.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022 + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* copyfile and its associated functions wrap */ +#if __MP_LEGACY_SUPPORT_COPYFILE_WRAP__ + +#include +#include +#include + +#include + +int copyfile_state_get(copyfile_state_t s, uint32_t flag, void * dst) +{ + int (*real_copyfile_state_get)(copyfile_state_t s, uint32_t flag, void * dst); + int ret; + char *file_name; + int file_descriptor; + struct stat file_stat; + + real_copyfile_state_get = dlsym(RTLD_NEXT, "copyfile_state_get"); + if (real_copyfile_state_get == NULL) { + exit(EXIT_FAILURE); + } + + switch(flag) + { + case COPYFILE_STATE_COPIED: + /* since copyfile did not recored how many bytes were copied, return the size of the destination file */ + /* first check if the file descriptor has been set */ + ret = real_copyfile_state_get(s, COPYFILE_STATE_DST_FD, &file_descriptor); + if ( ret < 0 ) { + return ret; + } + if ( file_descriptor != -2 ) { + ret = fstat(file_descriptor, &file_stat); + return ret; + } else { + /* the file descriptor was not set, so check the file name */ + ret = real_copyfile_state_get(s, COPYFILE_STATE_DST_FILENAME, &file_name); + if ( ret < 0 ) { + return ret; + } + if ( file_name == NULL ) { + /* neither the file descriptor nor the file name has been set */ + return real_copyfile_state_get(s, flag, dst); + } + ret = stat(file_name, &file_stat); + } + *(off_t*)dst = file_stat.st_size; + return 0; + break; + case COPYFILE_STATE_STATUS_CB: + case COPYFILE_STATE_STATUS_CTX: + /* copyfile did not run the callback function, so return default (which is an error) */ + default: + return real_copyfile_state_get(s, flag, dst); + } + return 0; +} + +#endif /* __MP_LEGACY_SUPPORT_COPYFILE_WRAP__ */ diff --git a/extern/macports-legacy-support/src/macports_legacy_os_unfair_lock.c b/extern/macports-legacy-support/src/macports_legacy_os_unfair_lock.c new file mode 100644 index 000000000..62665079c --- /dev/null +++ b/extern/macports-legacy-support/src/macports_legacy_os_unfair_lock.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023 + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_OS_UNFAIR_LOCK__ + +#include + +void os_unfair_lock_lock(os_unfair_lock_t lock) { + return OSSpinLockLock(lock); +} + +bool os_unfair_lock_trylock(os_unfair_lock_t lock) { + return OSSpinLockTry(lock); +} + +void os_unfair_lock_unlock(os_unfair_lock_t lock) { + return OSSpinLockUnlock(lock); +} + +#endif /*__MP_LEGACY_SUPPORT_OS_UNFAIR_LOCK__*/ diff --git a/extern/macports-legacy-support/src/macports_legacy_realpath.c b/extern/macports-legacy-support/src/macports_legacy_realpath.c new file mode 100644 index 000000000..a7e656d7f --- /dev/null +++ b/extern/macports-legacy-support/src/macports_legacy_realpath.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019 + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* realpath wrap */ +#if __MP_LEGACY_SUPPORT_REALPATH_WRAP__ + +#include +#include +#include + +char *realpath(const char * __restrict stringsearch, char * __restrict buffer) +{ + char *(*real_realpath)(const char * __restrict, char * __restrict); +#if (__DARWIN_UNIX03 && !defined(_POSIX_C_SOURCE)) || defined(_DARWIN_C_SOURCE) || defined(_DARWIN_BETTER_REALPATH) + real_realpath = dlsym(RTLD_NEXT, "realpath$DARWIN_EXTSN"); +# else + real_realpath = dlsym(RTLD_NEXT, "realpath"); +#endif + if (real_realpath == NULL) { + exit(EXIT_FAILURE); + } + + if (buffer == NULL) { + char *myrealpathbuf = malloc(PATH_MAX); + if (myrealpathbuf != NULL) { + return(real_realpath(stringsearch, myrealpathbuf)); + } else { + return(NULL); + } + } else { + return(real_realpath(stringsearch, buffer)); + } +} + +/* compatibility function so code does not have to be recompiled */ +char *macports_legacy_realpath(const char * __restrict stringsearch, char * __restrict buffer) { return realpath(stringsearch, buffer); } + +#endif /*__MP_LEGACY_SUPPORT_REALPATH_WRAP__*/ diff --git a/extern/macports-legacy-support/src/macports_legacy_symbol_aliases.c b/extern/macports-legacy-support/src/macports_legacy_symbol_aliases.c new file mode 100644 index 000000000..2d2f23b0c --- /dev/null +++ b/extern/macports-legacy-support/src/macports_legacy_symbol_aliases.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024 + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_SYMBOL____bzero__ +#include +/* +The need for this function is highly limited. +The symbol `__bzero` does not exist prior to 10.6. +When the Rust stage0 compiler for 10.5 is built on newer machines, it bakes `__bzero` into librustc_driver-xxx.dylib. +This may be due to the fact that on newer machines, the `_bzero` symbol is an indirect reference to another symbol. +*/ +void __bzero(void *s, size_t n) { bzero(s, n); } +#endif /* __MP_LEGACY_SUPPORT_SYMBOL_ALIASES__ */ + +#if __MP_LEGACY_SUPPORT_SYMBOL__dirfd__ +#include +#include +#include +/* +The need for this function is highly limited. +Prior to 10.8, `dirfd` was a macro`. +The Rust compiler requires `dirfd` to be a library symbol. +*/ +#undef dirfd +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050 +#define __dd_fd dd_fd +#endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050 */ +int dirfd(DIR *dirp) +{ + if (dirp == NULL || dirp->__dd_fd < 0) + { + errno = EINVAL; + return -1; + } + else + return dirp->__dd_fd; +} +#endif /* __MP_LEGACY_SUPPORT_SYMBOL__dirfd__ */ + +#if __MP_LEGACY_SUPPORT_ATCALLS__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 +#include +/* +The need for this function is highly limited. +The Rust compiler requires `fstatat$INODE64` to be a library symbol. +*/ +int fstatat$INODE64(int dirfd, const char *pathname, struct stat64 *buf, int flags) { return fstatat64(dirfd, pathname, buf, flags); } +#endif /* __MP_LEGACY_SUPPORT_ATCALLS__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */ diff --git a/extern/macports-legacy-support/src/macports_legacy_sysconf.c b/extern/macports-legacy-support/src/macports_legacy_sysconf.c new file mode 100644 index 000000000..b7ca64185 --- /dev/null +++ b/extern/macports-legacy-support/src/macports_legacy_sysconf.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2019 + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" + +/* sysconf wrap */ +#if __MP_LEGACY_SUPPORT_SYSCONF_WRAP__ + +#include +#include + +#include +#include +#include + +/* emulate several commonly used but missing selectors from sysconf() on various OS versions */ + +long sysconf(int name) { + long (*real_sysconf)(int); + +#if __MP_LEGACY_SUPPORT_SYSCONF_WRAP_NEED_SC_NPROCESSORS_ONLN__ + if ( name == _SC_NPROCESSORS_ONLN ) { + + int nm[2]; + int ret; + size_t len = 4; + uint32_t count; + + nm[0] = CTL_HW; nm[1] = HW_AVAILCPU; + ret = sysctl(nm, 2, &count, &len, NULL, 0); + + if (ret < 0 || count < 1) { + /* try again with _SC_NPROCESSORS_CONF */ + return sysconf(_SC_NPROCESSORS_CONF); + } else { + return (long)count; + } + } +#endif + +#if __MP_LEGACY_SUPPORT_SYSCONF_WRAP_NEED_SC_NPROCESSORS_CONF__ + if ( name == _SC_NPROCESSORS_CONF ) { + + int nm[2]; + int ret; + size_t len = 4; + uint32_t count; + + nm[0] = CTL_HW; nm[1] = HW_NCPU; + ret = sysctl(nm, 2, &count, &len, NULL, 0); + + /* there has to be at least 1 processor */ + if (ret < 0 || count < 1) { count = 1; } + return (long)count; + } +#endif + +#if __MP_LEGACY_SUPPORT_SYSCONF_WRAP_NEED_SC_PHYS_PAGES__ + if ( name == _SC_PHYS_PAGES ) { + + /* the number of pages is the total memory / pagesize */ + uint64_t mem_size; + size_t len = sizeof(mem_size); + int pagesize = getpagesize(); + + sysctlbyname("hw.memsize", &mem_size, &len, NULL, 0); + + return (long)(mem_size/pagesize); + + } +#endif + + /* for any other values of "name", call the real sysconf() */ + real_sysconf = dlsym(RTLD_NEXT, "sysconf"); + if (real_sysconf == NULL) { + exit(EXIT_FAILURE); + } + return real_sysconf(name); +} + +/* compatibility function so code does not have to be recompiled */ +long macports_legacy_sysconf(int name) { return sysconf(name); } + +#endif /*__MP_LEGACY_SUPPORT_SYSCONF_WRAP__*/ diff --git a/extern/macports-legacy-support/src/memmem.c b/extern/macports-legacy-support/src/memmem.c new file mode 100644 index 000000000..592003c11 --- /dev/null +++ b/extern/macports-legacy-support/src/memmem.c @@ -0,0 +1,72 @@ + +/*- + * Copyright (c) 2005 Pascal Gloor + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_MEMMEM__ + +#include +#include + +#include "strnlen.h" + +/* + * Find the first occurrence of the byte string s in byte string l. + */ + +void * +memmem(const void *l, size_t l_len, const void *s, size_t s_len) +{ + register char *cur, *last; + const char *cl = (const char *)l; + const char *cs = (const char *)s; + + /* we need something to compare */ + if (l_len == 0 || s_len == 0) + return NULL; + + /* "s" must be smaller or equal to "l" */ + if (l_len < s_len) + return NULL; + + /* special case where s_len == 1 */ + if (s_len == 1) + return memchr(l, (int)*cs, l_len); + + /* the last position where its possible to find "s" in "l" */ + last = (char *)cl + l_len - s_len; + + for (cur = (char *)cl; cur <= last; cur++) + if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0) + return cur; + + return NULL; +} + +#endif /* __MP_LEGACY_SUPPORT_MEMMEM__ */ diff --git a/extern/macports-legacy-support/src/memstream.c b/extern/macports-legacy-support/src/memstream.c new file mode 100644 index 000000000..f52b55d26 --- /dev/null +++ b/extern/macports-legacy-support/src/memstream.c @@ -0,0 +1,180 @@ +/* memstream.c + * + * This file is licensed under the MIT license by + * + * Copyright (c) 2013 Ian Piumarta. + * + * Modifications for inclusion in macports-legacy-support + * Copyright (c) 2023 Dennis Camera. + * + * ---------------------------------------------------------------------------- + * + * OPEN_MEMSTREAM(3) BSD and Linux Library Functions OPEN_MEMSTREAM(3) + * + * SYNOPSIS + * FILE *open_memstream(char **bufp, size_t *sizep); + * + * DESCRIPTION + * The open_memstream() function opens a stream for writing to a buffer. + * The buffer is dynamically allocated (as with malloc(3)), and + * automatically grows as required. After closing the stream, the caller + * should free(3) this buffer. + * + * When the stream is closed (fclose(3)) or flushed (fflush(3)), the + * locations pointed to by bufp and sizep are updated to contain, + * respectively, a pointer to the buffer and the current size of the + * buffer. These values remain valid only as long as the caller performs + * no further output on the stream. If further output is performed, then + * the stream must again be flushed before trying to access these + * variables. + * + * A null byte is maintained at the end of the buffer. This byte is not + * included in the size value stored at sizep. + * + * The stream's file position can be changed with fseek(3) or fseeko(3). + * Moving the file position past the end of the data already written fills + * the intervening space with zeros. + * + * RETURN VALUE + * Upon successful completion open_memstream() returns a FILE pointer. + * Otherwise, NULL is returned and errno is set to indicate the error. + * + * CONFORMING TO + * POSIX.1-2008 + * + * ---------------------------------------------------------------------------- + */ + +/* MP support header */ +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_OPEN_MEMSTREAM__ + +#include "stdio.h" + +#include +#include +#include +#include +#include + +#define min(X, Y) (((X) < (Y)) ? (X) : (Y)) + +struct memstream +{ + int position; + int size; + int capacity; + char *contents; + char **ptr; + size_t *sizeloc; +}; + +#if MEMSTREAM_DEBUG + static void memstream_print(struct memstream *ms) + { + printf("memstream %p {", ms); + printf(" %i", ms->position); + printf(" %i", ms->size); + printf(" %i", ms->capacity); + printf(" %p", ms->contents); + printf(" }\n"); + } +# define memstream_info(ARGS) printf ARGS +#else +# define memstream_print(ms) +# define memstream_info(ARGS) +#endif + +#define memstream_check(MS) if (!(MS)->contents) { errno= ENOMEM; return -1; } + +static int memstream_grow(struct memstream *ms, int minsize) +{ + int newcap= ms->capacity * 2; memstream_check(ms); + while (newcap <= minsize) newcap *= 2; memstream_info(("grow %p to %i\n", ms, newcap)); + ms->contents= realloc(ms->contents, newcap); + if (!ms->contents) return -1; /* errno == ENOMEM */ + memset(ms->contents + ms->capacity, 0, newcap - ms->capacity); + ms->capacity= newcap; + *ms->ptr= ms->contents; /* size has not changed */ + return 0; +} + +static int memstream_read(void *cookie, char *buf, int count) +{ + struct memstream *ms= (struct memstream *)cookie; memstream_check(ms); + int n= min(ms->size - ms->position, count); memstream_info(("memstream_read %p %i\n", ms, count)); + if (n < 1) return 0; + memcpy(buf, ms->contents, n); + ms->position += n; memstream_print(ms); + return n; +} + +static int memstream_write(void *cookie, const char *buf, int count) +{ + struct memstream *ms= (struct memstream *)cookie; memstream_check(ms); + if (ms->capacity <= ms->position + count) + if (memstream_grow(ms, ms->position + count) < 0) /* errno == ENOMEM */ + return -1; + memcpy(ms->contents + ms->position, buf, count); memstream_info(("memstream_write %p %i\n", ms, count)); + ms->position += count; + if (ms->size < ms->position) *ms->sizeloc= ms->size= ms->position; memstream_print(ms); + assert(ms->size < ms->capacity); + assert(ms->contents[ms->size] == 0); + return count; +} + +static fpos_t memstream_seek(void *cookie, fpos_t offset, int whence) +{ + struct memstream *ms= (struct memstream *)cookie; + fpos_t pos= 0; memstream_check(ms); + memstream_info(("memstream_seek %p %i %i\n", ms, (int)offset, whence)); + switch (whence) { + case SEEK_SET: pos= offset; break; + case SEEK_CUR: pos= ms->position + offset; break; + case SEEK_END: pos= ms->size + offset; break; + default: errno= EINVAL; return -1; + } + if (pos >= ms->capacity) memstream_grow(ms, pos); + ms->position= pos; + if (ms->size < ms->position) *ms->sizeloc= ms->size= ms->position; memstream_print(ms); memstream_info(("=> %i\n", (int)pos)); + assert(ms->size < ms->capacity && ms->contents[ms->size] == 0); + return pos; +} + +static int memstream_close(void *cookie) +{ + struct memstream *ms= (struct memstream *)cookie; if (!ms->contents) { free(ms); errno= ENOMEM; return -1; } + ms->size= min(ms->size, ms->position); + *ms->ptr= ms->contents; + *ms->sizeloc= ms->size; assert(ms->size < ms->capacity); + ms->contents[ms->size]= 0; + free(ms); + return 0; +} + +FILE *open_memstream(char **ptr, size_t *sizeloc) +{ + if (ptr && sizeloc) { + struct memstream *ms= calloc(1, sizeof(struct memstream)); + FILE *fp= 0; if (!ms) return 0; /* errno == ENOMEM */ + ms->position= ms->size= 0; + ms->capacity= 4096; + ms->contents= calloc(ms->capacity, 1); if (!ms->contents) { free(ms); return 0; } /* errno == ENOMEM */ + ms->ptr= ptr; + ms->sizeloc= sizeloc; + memstream_print(ms); + fp= funopen(ms, memstream_read, memstream_write, memstream_seek, memstream_close); + if (!fp) { + free(ms->contents); + free(ms); + return 0; /* errno set by funopen */ + } + *ptr= ms->contents; + *sizeloc= ms->size; + return fp; + } + errno= EINVAL; + return 0; +} + +#endif /* __MP_LEGACY_SUPPORT_OPEN_MEMSTREAM__ */ diff --git a/extern/macports-legacy-support/src/pthread_setname_np.c b/extern/macports-legacy-support/src/pthread_setname_np.c new file mode 100644 index 000000000..383dfac58 --- /dev/null +++ b/extern/macports-legacy-support/src/pthread_setname_np.c @@ -0,0 +1,25 @@ +/* +Until such time as this behavior can be emulated, do nothing and return success. +* This is what the MacPorts SpiderMonkey does: + https://github.com/macports/macports-ports/commit/50cdf084768436a421e2c6d05e995d122bc93bca +* This is what the MacPorts LLVM does: + https://github.com/macports/macports-ports/blob/master/lang/llvm-14/files/0007-Threading-Only-call-pthread_setname_np-if-we-have-it.patch +* This is what upstream dav1d does: + https://code.videolan.org/videolan/dav1d/-/blob/87f9a81cd770e49394a45deca7a3df41243de00b/src/thread.h#L182 + vs + https://code.videolan.org/videolan/dav1d/-/blob/87f9a81cd770e49394a45deca7a3df41243de00b/src/thread.h#L182 +* This is what upstream Rust does: + https://github.com/rust-lang/rust/blob/100f12d17026fccfc5d80527b5976dd66b228b13/library/std/src/sys/unix/thread.rs#L137 + vs + https://github.com/rust-lang/rust/blob/100f12d17026fccfc5d80527b5976dd66b228b13/library/std/src/sys/unix/thread.rs#L199 +*/ + +/* MP support header */ +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_PTHREAD_SETNAME_NP__ + +int pthread_setname_np(const char *name) { + return 0; +} + +#endif /* __MP_LEGACY_SUPPORT_PTHREAD_SETNAME_NP__ */ diff --git a/extern/macports-legacy-support/src/sincos.c b/extern/macports-legacy-support/src/sincos.c new file mode 100644 index 000000000..903dedc9b --- /dev/null +++ b/extern/macports-legacy-support/src/sincos.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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. + */ + +/* MP support header */ +#include + +#if __MP_LEGACY_SUPPORT_COSSIN__ + +/* Following is borrowed from math.h on macOS 10.9+ */ + +/* __sincos and __sincosf were introduced in OSX 10.9 and iOS 7.0. When + targeting an older system, we simply split them up into discrete calls + to sin( ) and cos( ). */ +void __sincosf(float __x, float *__sinp, float *__cosp) { + *__sinp = sinf(__x); + *__cosp = cosf(__x); +} +void __sincos(double __x, double *__sinp, double *__cosp) { + *__sinp = sin(__x); + *__cosp = cos(__x); +} + +#endif /* __MP_LEGACY_SUPPORT_COSSIN__ */ diff --git a/extern/macports-legacy-support/src/strings.c b/extern/macports-legacy-support/src/strings.c new file mode 100644 index 000000000..ff408a9e8 --- /dev/null +++ b/extern/macports-legacy-support/src/strings.c @@ -0,0 +1,99 @@ + +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +// MP support header +#include "MacportsLegacySupport.h" + +#if __MP_LEGACY_SUPPORT_FFSL__ +int ffsl(long mask) +{ + int bit = 0; + if (mask != 0) { + for (bit = 1; !(mask & 1); bit++) { + mask = (unsigned long)mask >> 1; + } + } + return (bit); +} +#endif + +#if __MP_LEGACY_SUPPORT_FFSLL__ +int ffsll(long long mask) +{ + int bit = 0; + if (mask != 0) { + for (bit = 1; !(mask & 1); bit++) { + mask = (unsigned long long)mask >> 1; + } + } + return (bit); +} +#endif + +#if __MP_LEGACY_SUPPORT_FLS__ +int fls(int mask) +{ + int bit = 0; + if (mask != 0) { + for (bit = 1; mask != 1; bit++) { + mask = (unsigned int)mask >> 1; + } + } + return (bit); +} +#endif + +#if __MP_LEGACY_SUPPORT_FLSL__ +int flsl(long mask) +{ + int bit = 0; + if (mask != 0) { + for (bit = 1; mask != 1; bit++) { + mask = (unsigned long)mask >> 1; + } + } + return (bit); +} +#endif + +#if __MP_LEGACY_SUPPORT_FLSLL__ +int flsll(long long mask) +{ + int bit = 0; + if (mask != 0) { + for (bit = 1; mask != 1; bit++) { + mask = (unsigned long long)mask >> 1; + } + } + return (bit); +} +#endif diff --git a/extern/macports-legacy-support/src/strndup.c b/extern/macports-legacy-support/src/strndup.c new file mode 100644 index 000000000..08ac0653e --- /dev/null +++ b/extern/macports-legacy-support/src/strndup.c @@ -0,0 +1,66 @@ + +/* + * Copyright (c) 1995 - 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_STRNDUP__ + +#ifndef HAVE_STRNDUP + +#include +#include +#include + +#include "strnlen.h" + +char * +strndup (const char *old, size_t sz) +{ + size_t len = strnlen (old, sz); + char *t = malloc(len + 1); + + if (t != NULL) { + memcpy (t, old, len); + t[len] = '\0'; + } + return t; +} + +#endif /* HAVE_STRNDUP */ + +#endif /* __MP_LEGACY_SUPPORT_STRDUP__ */ diff --git a/extern/macports-legacy-support/src/strndup.h b/extern/macports-legacy-support/src/strndup.h new file mode 100644 index 000000000..1dc09c5d5 --- /dev/null +++ b/extern/macports-legacy-support/src/strndup.h @@ -0,0 +1,41 @@ + +/* + * Copyright (c) 1995 - 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +#ifndef HAVE_STRNDUP +#define HAVE_STRNDUP + +char *strndup(const char *s, size_t n); + +#endif /* HAVE_STRNDUP */ diff --git a/extern/macports-legacy-support/src/strnlen.c b/extern/macports-legacy-support/src/strnlen.c new file mode 100644 index 000000000..f64352e41 --- /dev/null +++ b/extern/macports-legacy-support/src/strnlen.c @@ -0,0 +1,58 @@ + +/* + * Copyright (c) 1995 - 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_STRNLEN__ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "strnlen.h" + +/* Find the length of STRING, but scan at most MAXLEN characters. + If no '\0' terminator is found in that many characters, return MAXLEN. */ + +size_t +strnlen (const char *s, size_t len) +{ + size_t i; + + for(i = 0; i < len && s[i]; i++) + ; + return i; +} + +#endif diff --git a/extern/macports-legacy-support/src/strnlen.h b/extern/macports-legacy-support/src/strnlen.h new file mode 100644 index 000000000..09f0be4c6 --- /dev/null +++ b/extern/macports-legacy-support/src/strnlen.h @@ -0,0 +1,46 @@ + +/* + * Copyright (c) 1995 - 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef STRNLEN_H +#define STRNLEN_H + +/* Get strnlen declaration, if available. */ +#include + +/* Find the length (number of bytes) of STRING, but scan at most + MAXLEN bytes. If no '\0' terminator is found in that many bytes, + return MAXLEN. */ +extern size_t strnlen(const char *s, size_t len); + +#endif /* STRNLEN_H */ diff --git a/extern/macports-legacy-support/src/time.c b/extern/macports-legacy-support/src/time.c new file mode 100644 index 000000000..ec3885c5b --- /dev/null +++ b/extern/macports-legacy-support/src/time.c @@ -0,0 +1,147 @@ + +/* + * Copyright (c) 2018 Chris Jones + * + * Permission to use, copy, modify, and 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 "time.h" + +#if __MP_LEGACY_SUPPORT_GETTIME__ + +#include +#include +#include + +#include +#include +#include +#include + +#define BILLION 1000000000L +#define MILLION 1000000L +#define THOUSAND 1000L + +int clock_gettime( clockid_t clk_id, struct timespec *ts ) +{ + int ret = -1; + if ( ts ) + { + if ( CLOCK_REALTIME == clk_id ) + { + struct timeval tv; + ret = gettimeofday(&tv, NULL); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; + } + else if ( CLOCK_MONOTONIC == clk_id ) + { + struct timeval boottime; + size_t boottime_len = sizeof(boottime); + ret = sysctlbyname("kern.boottime", &boottime, &boottime_len, NULL, 0); + if (ret != KERN_SUCCESS) { return ret; } + struct timeval tv; + ret = gettimeofday(&tv, NULL); + timersub(&tv, &boottime, &tv); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; + ret = 0; + } + else if ( CLOCK_PROCESS_CPUTIME_ID == clk_id ) + { + struct rusage ru; + ret = getrusage(RUSAGE_SELF, &ru); + timeradd(&ru.ru_utime, &ru.ru_stime, &ru.ru_utime); + ts->tv_sec = ru.ru_utime.tv_sec; + ts->tv_nsec = ru.ru_utime.tv_usec * 1000; + } + else if ( CLOCK_THREAD_CPUTIME_ID == clk_id ) + { + mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT; + thread_basic_info_data_t info; + + thread_port_t thread = mach_thread_self(); + ret = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t) &info, &count); + mach_port_deallocate(mach_task_self(), thread); + + time_value_add(&info.user_time, &info.system_time); + ts->tv_sec = info.user_time.seconds; + ts->tv_nsec = info.user_time.microseconds * 1000; + } + else if ( CLOCK_MONOTONIC_RAW == clk_id || + CLOCK_MONOTONIC_RAW_APPROX == clk_id || + CLOCK_UPTIME_RAW == clk_id || + CLOCK_UPTIME_RAW_APPROX == clk_id ) + { + static mach_timebase_info_data_t timebase; + if ( 0 == timebase.numer || 0 == timebase.denom ) { + const kern_return_t kr = mach_timebase_info( &timebase ); + if ( kr != KERN_SUCCESS ) { return kr; } + } + uint64_t tdiff = mach_absolute_time() * ( timebase.numer / timebase.denom ); + ts->tv_sec = tdiff / BILLION; + ts->tv_nsec = tdiff % BILLION; + ret = 0; + } + } + return ret; +} + +int clock_getres( clockid_t clk_id, struct timespec *ts ) +{ + int ret = -1; + if ( ts ) + { + if ( CLOCK_REALTIME == clk_id || + CLOCK_MONOTONIC == clk_id || + CLOCK_PROCESS_CPUTIME_ID == clk_id || + CLOCK_THREAD_CPUTIME_ID == clk_id) + { + // return 1us precision + ts->tv_sec = 0; + ts->tv_nsec = THOUSAND; + ret = 0; + } + else if ( CLOCK_MONOTONIC_RAW == clk_id || + CLOCK_MONOTONIC_RAW_APPROX == clk_id || + CLOCK_UPTIME_RAW == clk_id || + CLOCK_UPTIME_RAW_APPROX == clk_id ) + { + // return 1ns precision + ts->tv_sec = 0; + ts->tv_nsec = 1; + ret = 0; + } + } + return ret; +} + +#endif + +#if __MP_LEGACY_SUPPORT_TIMESPEC_GET__ + +int timespec_get(struct timespec *ts, int base) +{ + switch (base) { + case TIME_UTC: + if (clock_gettime(CLOCK_REALTIME, ts) == -1) { + return 0; + } + return base; + + default: + return 0; + } +} + +#endif diff --git a/extern/macports-legacy-support/src/wcpcpy_family.c b/extern/macports-legacy-support/src/wcpcpy_family.c new file mode 100644 index 000000000..4f4ca00d6 --- /dev/null +++ b/extern/macports-legacy-support/src/wcpcpy_family.c @@ -0,0 +1,37 @@ + +/* + * Copyright (c) 2018 Christian Cornelssen + * + * Permission to use, copy, modify, and 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. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_WCPCPY__ + +#include + +wchar_t *wcpncpy(wchar_t *__restrict d, const wchar_t *__restrict s, size_t n) +{ + wint_t c; + while (n && (c = *s)) --n, *d++ = c, ++s; + return wmemset(d, 0, n); +} + +wchar_t *wcpcpy(wchar_t *__restrict d, const wchar_t *__restrict s) +{ + while ((*d = *s)) ++d, ++s; + return d; +} + +#endif /* __MP_LEGACY_SUPPORT_WCPCPY__ */ diff --git a/extern/macports-legacy-support/src/wcscasecmp_family.c b/extern/macports-legacy-support/src/wcscasecmp_family.c new file mode 100644 index 000000000..52fe63d27 --- /dev/null +++ b/extern/macports-legacy-support/src/wcscasecmp_family.c @@ -0,0 +1,65 @@ + +/* + * Copyright (c) 2018 Christian Cornelssen + * + * Permission to use, copy, modify, and 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. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_WCSCASECMP__ + +#include +#include +#include + +#include +#include +#if WCHAR_MAX > INT_MAX +/* Caution: multiple argument evaluations */ +#define _MP_WCDIFFSIGN(a, b) (((b) < (a)) - ((a) < (b))) +#else +#define _MP_WCDIFFSIGN(a, b) ((int)(a) - (int)(b)) +#endif + +int wcsncasecmp_l(const wchar_t *l, const wchar_t *r, size_t n, locale_t locale) +{ + wint_t lc, rc; + int d = 0; + while (!d && n) { + lc = *l++; rc = *r++; --n; + if (!(lc && rc)) n = 0; + if (lc == rc) continue; + lc = towlower_l(lc, locale); + rc = towlower_l(rc, locale); + d = _MP_WCDIFFSIGN(lc, rc); + } + return d; +} + +int wcsncasecmp(const wchar_t *l, const wchar_t *r, size_t n) +{ + return wcsncasecmp_l(l, r, n, 0); +} + +int wcscasecmp_l(const wchar_t *l, const wchar_t *r, locale_t locale) +{ + return wcsncasecmp_l(l, r, -1, locale); +} + +int wcscasecmp(const wchar_t *l, const wchar_t *r) +{ + return wcsncasecmp_l(l, r, -1, 0); +} + +#endif /* __MP_LEGACY_SUPPORT_WCSCASECMP__ */ diff --git a/extern/macports-legacy-support/src/wcsdup.c b/extern/macports-legacy-support/src/wcsdup.c new file mode 100644 index 000000000..eaf144379 --- /dev/null +++ b/extern/macports-legacy-support/src/wcsdup.c @@ -0,0 +1,49 @@ + +/*- + * Copyright (c) 2005 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_WCSDUP__ + +#include +#include +#include + +wchar_t * +wcsdup(const wchar_t *s) +{ + wchar_t *copy; + size_t len; + + len = wcslen(s) + 1; + if ((copy = malloc(len * sizeof(wchar_t))) == NULL) + return (NULL); + return (wmemcpy(copy, s, len)); +} + +#endif /* __MP_LEGACY_SUPPORT_WCSDUP__ */ + diff --git a/extern/macports-legacy-support/src/wcsnlen.c b/extern/macports-legacy-support/src/wcsnlen.c new file mode 100644 index 000000000..c42af19a8 --- /dev/null +++ b/extern/macports-legacy-support/src/wcsnlen.c @@ -0,0 +1,44 @@ +/* + * Adapted for MacportsLegacySupport from: + * https://git.musl-libc.org/cgit/musl/tree/src/string/wcsnlen.c + * License text (excerpt below): + * https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT + * + * musl as a whole is licensed under the following standard MIT license: + * + * Copyright © 2005-2014 Rich Felker, et al. + * + * 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. + */ + +// MP support header +#include "MacportsLegacySupport.h" +#if __MP_LEGACY_SUPPORT_WCSNLEN__ + +#include + +size_t wcsnlen(const wchar_t *s, size_t n) +{ + const wchar_t *z = wmemchr(s, 0, n); + if (z) n = z-s; + return n; +} + +#endif /* __MP_LEGACY_SUPPORT_WCSNLEN__ */