DELETED .github/workflows/dragonflybsd.yml Index: .github/workflows/dragonflybsd.yml ================================================================== --- .github/workflows/dragonflybsd.yml +++ .github/workflows/dragonflybsd.yml @@ -1,25 +0,0 @@ -name: dragonflybsd -on: [push, pull_request] -jobs: - tests: - runs-on: macos-12 - strategy: - matrix: - configure_flags: - - - - --disable-shared - - --with-tls=gnutls - steps: - - uses: actions/checkout@v3 - - uses: vmactions/dragonflybsd-vm@v0 - with: - usesh: true - copyback: false - prepare: | - pkg install -y autoconf automake gnutls llvm pkgconf - run: | - ./autogen.sh - ./configure OBJC=clang ${{ matrix.configure_flags }} - make -j4 - make check - make install DELETED .github/workflows/freebsd.yml Index: .github/workflows/freebsd.yml ================================================================== --- .github/workflows/freebsd.yml +++ .github/workflows/freebsd.yml @@ -1,25 +0,0 @@ -name: freebsd -on: [push, pull_request] -jobs: - tests: - runs-on: macos-12 - strategy: - matrix: - configure_flags: - - - - --disable-shared - - --with-tls=gnutls - steps: - - uses: actions/checkout@v3 - - uses: vmactions/freebsd-vm@v0 - with: - usesh: true - copyback: false - prepare: | - pkg install -y autoconf automake gnutls pkgconf - run: | - ./autogen.sh - ./configure OBJC=clang ${{ matrix.configure_flags }} - make -j4 - make check - make install DELETED .github/workflows/netbsd-gcc.yml Index: .github/workflows/netbsd-gcc.yml ================================================================== --- .github/workflows/netbsd-gcc.yml +++ .github/workflows/netbsd-gcc.yml @@ -1,25 +0,0 @@ -name: netbsd-gcc -on: [push, pull_request] -jobs: - tests: - runs-on: macos-12 - strategy: - matrix: - configure_flags: - - - - --disable-shared - - --with-tls=gnutls - steps: - - uses: actions/checkout@v3 - - uses: vmactions/netbsd-vm@v0 - with: - usesh: true - copyback: false - prepare: | - pkg_add autoconf automake gnutls pkgconf - run: | - ./autogen.sh - ./configure OBJC=gcc ${{ matrix.configure_flags }} - make -j4 - make check - make install DELETED .github/workflows/netbsd.yml Index: .github/workflows/netbsd.yml ================================================================== --- .github/workflows/netbsd.yml +++ .github/workflows/netbsd.yml @@ -1,25 +0,0 @@ -name: netbsd -on: [push, pull_request] -jobs: - tests: - runs-on: macos-12 - strategy: - matrix: - configure_flags: - - - - --disable-shared - - --with-tls=gnutls - steps: - - uses: actions/checkout@v3 - - uses: vmactions/netbsd-vm@v0 - with: - usesh: true - copyback: false - prepare: | - pkg_add autoconf automake clang gnutls pkgconf - run: | - ./autogen.sh - ./configure OBJC=clang ${{ matrix.configure_flags }} - make -j4 - make check - make install DELETED .github/workflows/openbsd.yml Index: .github/workflows/openbsd.yml ================================================================== --- .github/workflows/openbsd.yml +++ .github/workflows/openbsd.yml @@ -1,25 +0,0 @@ -name: openbsd -on: [push, pull_request] -jobs: - tests: - runs-on: macos-12 - strategy: - matrix: - configure_flags: - - - - --disable-shared - - --with-tls=gnutls - steps: - - uses: actions/checkout@v3 - - uses: vmactions/openbsd-vm@v0 - with: - usesh: true - copyback: false - prepare: | - pkg_add autoconf-2.71 automake-1.16.5 gnutls pkgconf - run: | - ./autogen.sh - ./configure OBJC=clang ${{ matrix.configure_flags }} - make -j4 - make check - make install Index: README.md ================================================================== --- README.md +++ README.md @@ -79,23 +79,26 @@

Installation

ObjFW packages are available for various operating systems and can be installed as following: - Operating System | Command - -----------------|--------------------------------------------- - Alpine Linux | `doas apk add objfw` - CRUX | `sudo prt-get depinst objfw` - Fedora | `sudo dnf install objfw` - FreeBSD | `sudo pkg install objfw` - Haiku | `pkgman install objfw` - Haiku (gcc2h) | `pkgman install objfw_x86` - macOS (Homebrew) | `brew install objfw` - macOS (pkgsrc) | `cd $PKGSRCDIR/devel/objfw && make install` - NetBSD | `cd /usr/pkgsrc/devel/objfw && make install` - OpenBSD | `doas pkg_add objfw` - OpenIndiana | `sudo pkg install developer/objfw` + Operating System | Command + ---------------------------|--------------------------------------------- + Alpine Linux | `doas apk add objfw` + CRUX | `sudo prt-get depinst objfw` + Fedora | `sudo dnf install objfw` + FreeBSD | `sudo pkg install objfw` + Haiku | `pkgman install objfw` + Haiku (gcc2h) | `pkgman install objfw_x86` + macOS (Homebrew) | `brew install objfw` + macOS (pkgsrc) | `cd $PKGSRCDIR/devel/objfw && make install` + NetBSD | `cd /usr/pkgsrc/devel/objfw && make install` + OpenBSD | `doas pkg_add objfw` + OpenIndiana | `sudo pkg install developer/objfw` + Windows (MSYS2/MINGW32) | `pacman -S mingw-w64-i686-objfw` + Windows (MSYS2/CLANG64) | `pacman -S mingw-w64-clang-x86_64-objfw` + Windows (MSYS2/CLANGARM64) | `pacman -S mingw-w64-clang-aarch64-objfw` If your operating system is not listed, you can build ObjFW from source. @@ -385,20 +388,18 @@ If you have any questions about ObjFW or would like to talk to other ObjFW users, the following venues are available: * The [forum](https://objfw.nil.im/forum) * A [Matrix room](https://matrix.to/#/%23objfw:nil.im) + * A [Discord room](https://objfw.nil.im/discord), bridged to the Matrix + room above + * A [Telegram room](https://t.me/objfw), bridged to the Matrix room above + * A [Slack room](https://objfw.nil.im/slack), bridged to the Matrix room + above * An IRC channel named `#objfw` on `irc.oftc.net` ([Web chat](https://webchat.oftc.net/?channels=%23objfw)), bridged to the Matrix room above - * A [Slack channel](https://objfw.nil.im/slack), bridged to the Matrix room - above - * A [Discord channel](https://objfw.nil.im/discord), bridged to the Matrix - room above - * A [Telegram room](https://t.me/objfw), bridged to the Matrix room above - * A [Gitter room](https://gitter.im/ObjFW/ObjFW), bridged to the Matrix room - above Please don't hesitate to join any or all of those!

Donating

Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -1,14 +1,13 @@ -AC_INIT(ObjFW, 1.1dev, js@nil.im, objfw, https://objfw.nil.im/) +AC_INIT(ObjFW, 1.0.4, js@nil.im, objfw, https://objfw.nil.im/) AC_CONFIG_SRCDIR(src) AC_CONFIG_AUX_DIR(build-aux) AC_CONFIG_MACRO_DIR(build-aux/m4) AC_DEFINE(OBJFW_VERSION_MAJOR, 1, [The major version of ObjFW]) -AC_DEFINE(OBJFW_VERSION_MINOR, 1, [The minor version of ObjFW]) -dnl This may only be set to 1.1 once 1.1 is released -AC_SUBST(BUNDLE_VERSION, 1.0.0) +AC_DEFINE(OBJFW_VERSION_MINOR, 0, [The minor version of ObjFW]) +AC_SUBST(BUNDLE_VERSION, 1.0.4) AC_SUBST(BUNDLE_SHORT_VERSION, 1.0) for i in configure.ac build-aux/m4/*; do AS_IF([test $i -nt configure], [ AC_MSG_ERROR([$i is newer than configure! Run ./autogen.sh!]) @@ -476,29 +475,25 @@ esac objc_runtime="ObjFW runtime" AC_CHECK_HEADER(objc/objc.h) AC_MSG_CHECKING(which Objective C runtime to use) -AC_ARG_ENABLE(runtime, - AS_HELP_STRING([--enable-runtime], [use the included runtime])) AC_ARG_ENABLE(seluid24, AS_HELP_STRING([--enable-seluid24], [use 24 bit instead of 16 bit for selector UIDs])) -AS_IF([test x"$enable_runtime" != x"yes"], [ - AS_IF([test x"$ac_cv_header_objc_objc_h" = x"yes"], [ - AC_EGREP_CPP(egrep_cpp_yes, [ - #import - - #ifdef OBJC_BOOL_DEFINED - egrep_cpp_yes - #endif - ], [ - objc_runtime="Apple runtime" - ], [ - dnl We don't want the GNU runtime - : - ]) +AS_IF([test x"$ac_cv_header_objc_objc_h" = x"yes"], [ + AC_EGREP_CPP(egrep_cpp_yes, [ + #import + + #ifdef OBJC_BOOL_DEFINED + egrep_cpp_yes + #endif + ], [ + objc_runtime="Apple runtime" + ], [ + dnl We don't want the GNU runtime + : ]) ]) AC_MSG_RESULT($objc_runtime) case "$objc_runtime" in @@ -1380,10 +1375,21 @@ esac AC_CHECK_HEADER(sys/socket.h, [ AC_DEFINE(OF_HAVE_SYS_SOCKET_H, 1, [Whether we have sys/socket.h]) + ]) + AC_CHECK_MEMBERS([struct sockaddr.sa_len], [], [], [ + #ifdef OF_HAVE_SYS_TYPES_H + # include + #endif + #ifdef OF_HAVE_SYS_SOCKET_H + # include + #endif + #ifdef _WIN32 + # include + #endif ]) AC_CHECK_TYPE([struct sockaddr_storage], [ AC_DEFINE(OF_HAVE_SOCKADDR_STORAGE, 1, [Whether we have struct sockaddr_storage]) ], [], [ @@ -1459,12 +1465,10 @@ #ifdef AF_INET6 egrep_cpp_yes #endif ], [ AC_DEFINE(OF_HAVE_IPV6, 1, [Whether we have IPv6]) - - AC_CHECK_FUNCS(inet6_getscopeid) ]) ], [ dnl Work around a bug in autoconf 2.61 that creates a broken dnl configure if this branch is empty. : @@ -2005,11 +2009,11 @@ AS_IF([test x"$GOBJC" = x"yes"], [ OBJCFLAGS="$OBJCFLAGS -Wwrite-strings -Wpointer-arith" AC_ARG_ENABLE(werror, AS_HELP_STRING([--disable-werror], [do not build with -Werror])) - AS_IF([test x"$enable_werror" != x"no"], [ + AS_IF([test x"$enable_werror" = x"yes"], [ OBJCFLAGS="$OBJCFLAGS -Werror" ]) old_OBJCFLAGS="$OBJCFLAGS" OBJCFLAGS="$OBJCFLAGS -Werror" ADDED misc/keys.asc Index: misc/keys.asc ================================================================== --- misc/keys.asc +++ misc/keys.asc @@ -0,0 +1,174 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=21Qx +-----END PGP PUBLIC KEY BLOCK----- Index: src/OFDate.m ================================================================== --- src/OFDate.m +++ src/OFDate.m @@ -316,11 +316,11 @@ mutex = [[OFMutex alloc] init]; atexit(releaseMutex); #endif #ifdef OF_WINDOWS - if ((module = LoadLibrary("msvcrt.dll")) != NULL) + if ((module = GetModuleHandle("msvcrt.dll")) != NULL) _mktime64FuncPtr = (__time64_t (*)(struct tm *)) GetProcAddress(module, "_mktime64"); #endif } Index: src/OFFileIRIHandler.m ================================================================== --- src/OFFileIRIHandler.m +++ src/OFFileIRIHandler.m @@ -642,15 +642,15 @@ readdirMutex = [[OFMutex alloc] init]; atexit(releaseReaddirMutex); #endif #ifdef OF_WINDOWS - if ((module = LoadLibrary("msvcrt.dll")) != NULL) + if ((module = GetModuleHandle("msvcrt.dll")) != NULL) _wutime64FuncPtr = (int (*)(const wchar_t *, struct __utimbuf64 *))GetProcAddress(module, "_wutime64"); - if ((module = LoadLibrary("kernel32.dll")) != NULL) { + if ((module = GetModuleHandleA("kernel32.dll")) != NULL) { createSymbolicLinkWFuncPtr = (WINAPI BOOLEAN (*)(LPCWSTR, LPCWSTR, DWORD)) GetProcAddress(module, "CreateSymbolicLinkW"); createHardLinkWFuncPtr = (WINAPI BOOLEAN (*)(LPCWSTR, LPCWSTR, Index: src/OFSocket.h ================================================================== --- src/OFSocket.h +++ src/OFSocket.h @@ -288,11 +288,11 @@ /** * @brief Converts the specified @ref OFSocketAddress to a string. * * @param address The address to convert to a string - * @return The address as an IP string, without the port + * @return The address as a string, without the port */ extern OFString *_Nonnull OFSocketAddressString( const OFSocketAddress *_Nonnull address); /** Index: src/OFSocket.m ================================================================== --- src/OFSocket.m +++ src/OFSocket.m @@ -965,11 +965,11 @@ static OFString * appleTalkString(const OFSocketAddress *address) { const struct sockaddr_at *addrAT = &address->sockaddr.at; - return [OFString stringWithFormat: @"%d.%d", + return [OFString stringWithFormat: @"%" PRIu8 ".%" PRIu8, OFFromBigEndian16(addrAT->sat_net), addrAT->sat_node]; } OFString * OFSocketAddressString(const OFSocketAddress *address) Index: src/platform/POSIX/OFSystemInfo+NetworkInterfaces.m ================================================================== --- src/platform/POSIX/OFSystemInfo+NetworkInterfaces.m +++ src/platform/POSIX/OFSystemInfo+NetworkInterfaces.m @@ -225,13 +225,16 @@ # if defined(OF_HAVE_IPV6) && defined(HAVE_IF_NAMETOINDEX) if (address.sockaddr.in6.sin6_family == AF_INET6 && address.sockaddr.in6.sin6_addr.s6_addr[0] == 0xFE && (address.sockaddr.in6.sin6_addr.s6_addr[1] & 0xC0) == 0x80) { -# if defined(HAVE_INET6_GETSCOPEID) - inet6_getscopeid(&address.sockaddr.in6, - INET6_IS_ADDR_LINKLOCAL); +# if defined(__KAME__) +# define addr6 address.sockaddr.in6.sin6_addr.s6_addr + address.sockaddr.in6.sin6_scope_id = + (addr6[2] << 8) | addr6[3]; + addr6[2] = addr6[3] = 0; +# undef addr6 # elif defined(HAVE_IF_NAMETOINDEX) address.sockaddr.in6.sin6_scope_id = if_nametoindex( [name cStringWithEncoding: encoding]); # endif @@ -239,15 +242,18 @@ # endif [addresses addItem: &address]; next: -# ifdef _SIZEOF_ADDR_IFREQ - buffer += _SIZEOF_ADDR_IFREQ(*current); -# else - buffer += sizeof(struct ifreq); -# endif +# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + if (current->ifr_addr.sa_len > sizeof(struct sockaddr)) + buffer += sizeof(struct ifreq) - + sizeof(struct sockaddr) + + current->ifr_addr.sa_len; + else +# endif + buffer += sizeof(struct ifreq); } } @finally { free(ifrs); closesocket(sock); } Index: src/platform/Windows/OFSystemInfo+NetworkInterfaces.m ================================================================== --- src/platform/Windows/OFSystemInfo+NetworkInterfaces.m +++ src/platform/Windows/OFSystemInfo+NetworkInterfaces.m @@ -36,11 +36,11 @@ static void init(void) { HMODULE module; - if ((module = LoadLibrary("iphlpapi.dll")) != NULL) + if ((module = GetModuleHandle("iphlpapi.dll")) != NULL) GetAdaptersAddressesFuncPtr = (WINAPI ULONG (*)(ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG)) GetProcAddress(module, "GetAdaptersAddresses"); } @@ -47,11 +47,10 @@ static OFMutableDictionary OF_GENERIC(OFString *, OFNetworkInterface) * networkInterfacesFromGetAdaptersAddresses(void) { OFMutableDictionary *ret = [OFMutableDictionary dictionary]; - OFStringEncoding encoding = [OFLocale encoding]; ULONG adapterAddressesSize = sizeof(IP_ADAPTER_ADDRESSES); PIP_ADAPTER_ADDRESSES adapterAddresses; if ((adapterAddresses = malloc(adapterAddressesSize)) == NULL) return nil; @@ -79,12 +78,12 @@ iter != NULL; iter = iter->Next) { OFString *name; OFMutableDictionary *interface; OFNumber *index; - name = [OFString stringWithCString: iter->AdapterName - encoding: encoding]; + name = [OFString stringWithFormat: @"%lu", + iter->IfIndex]; if ((interface = [ret objectForKey: name]) == nil) { interface = [OFMutableDictionary dictionary]; [ret setObject: interface forKey: name]; } @@ -193,12 +192,11 @@ OFString *name, *IPString; OFNumber *index; OFSocketAddress IPv4Address; OFData *addresses; - name = [OFString stringWithCString: iter->AdapterName - encoding: encoding]; + name = [OFString stringWithFormat: @"%u", iter->Index]; if ((interface = [ret objectForKey: name]) == nil) { interface = [OFMutableDictionary dictionary]; [ret setObject: interface forKey: name]; } DELETED src/runtime/lookup-asm/lookup-asm-amd64-macho.S Index: src/runtime/lookup-asm/lookup-asm-amd64-macho.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-amd64-macho.S +++ src/runtime/lookup-asm/lookup-asm-amd64-macho.S @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2008-2023 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -.globl _objc_msg_lookup -.globl _objc_msg_lookup_stret -.globl _objc_msg_lookup_super -.globl _objc_msg_lookup_super_stret - -.section __TEXT, __text, regular, pure_instructions -.macro GENERATE_LOOKUP -$0: - testq %rdi, %rdi - jz returnNilMethod - - testb $$1, %dil - jnz LtaggedPointer_$0 - - movq (%rdi), %r8 - movq 64(%r8), %r8 - -Lmain_$0: - movq (%rsi), %rax - movzbl %ah, %ecx - movzbl %al, %edx -#ifdef OF_SELUID24 - shrl $$16, %eax - - movq (%r8,%rax,8), %r8 -#endif - movq (%r8,%rcx,8), %r8 - movq (%r8,%rdx,8), %rax - - testq %rax, %rax - jz $1 - - ret - -LtaggedPointer_$0: - movq _objc_taggedPointerSecret@GOTPCREL(%rip), %rax - xorq (%rax), %rdi - andb $$0xE, %dil - movzbl %dil, %r8d - - movq _objc_taggedPointerClasses@GOTPCREL(%rip), %rax - movq (%rax,%r8,4), %r8 - movq 64(%r8), %r8 - - jmp Lmain_$0 -.endmacro - -.macro GENERATE_LOOKUP_SUPER -$0: - movq %rdi, %r8 - movq (%rdi), %rdi - testq %rdi, %rdi - jz returnNilMethod - - movq 8(%r8), %r8 - movq 64(%r8), %r8 - jmp Lmain_$1 -.endmacro - -GENERATE_LOOKUP _objc_msg_lookup, _objc_methodNotFound -GENERATE_LOOKUP _objc_msg_lookup_stret, _objc_methodNotFound_stret -GENERATE_LOOKUP_SUPER _objc_msg_lookup_super, _objc_msg_lookup -GENERATE_LOOKUP_SUPER _objc_msg_lookup_super_stret, _objc_msg_lookup_stret - -returnNilMethod: - leaq nilMethod(%rip), %rax - ret - -nilMethod: - xorq %rax, %rax - ret Index: src/runtime/lookup-asm/lookup-asm.S ================================================================== --- src/runtime/lookup-asm/lookup-asm.S +++ src/runtime/lookup-asm/lookup-asm.S @@ -37,16 +37,12 @@ # elif defined(OF_SPARC64) # include "lookup-asm-sparc64-elf.S" # elif defined(OF_SPARC) # include "lookup-asm-sparc-elf.S" # endif -#elif defined(OF_MACH_O) -# if defined(OF_AMD64) -# include "lookup-asm-amd64-macho.S" -# endif #elif defined(OF_WINDOWS) # if defined(OF_AMD64) # include "lookup-asm-amd64-win64.S" # elif defined(OF_X86) # include "lookup-asm-x86-win32.S" # endif #endif Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -295,14 +295,10 @@ # if defined(OF_AMD64) || defined(OF_X86) || \ defined(OF_POWERPC64) || defined(OF_POWERPC) || \ defined(OF_ARM64) || defined(OF_ARM) || \ defined(OF_MIPS64_N64) || defined(OF_MIPS) || \ defined(OF_SPARC64) || defined(OF_SPARC) -# define OF_ASM_LOOKUP -# endif -#elif defined(OF_MACH_O) -# if defined(OF_AMD64) # define OF_ASM_LOOKUP # endif #elif defined(OF_WINDOWS) # if defined(OF_AMD64) || defined(OF_X86) # define OF_ASM_LOOKUP Index: tests/OFBlockTests.m ================================================================== --- tests/OFBlockTests.m +++ tests/OFBlockTests.m @@ -28,11 +28,11 @@ extern void *_NSConcreteGlobalBlock; extern void *_NSConcreteMallocBlock; #endif /* Clang on Win32 generates broken code that crashes for global blocks. */ -#if !defined(OF_WINDOWS) || !defined(OF_X86) || !defined(__clang__) +#if !defined(OF_WINDOWS) || !defined(__clang__) static void (^globalBlock)(void) = ^ {}; #endif static int (^returnStackBlock(void))(void) @@ -70,11 +70,11 @@ TEST(@"Class of stack block", (Class)&_NSConcreteStackBlock == objc_getClass("OFStackBlock") && [stackBlock isKindOfClass: [OFBlock class]]) -#if !defined(OF_WINDOWS) || !defined(OF_X86) || !defined(__clang__) +#if !defined(OF_WINDOWS) || !defined(__clang__) TEST(@"Class of global block", (Class)&_NSConcreteGlobalBlock == objc_getClass("OFGlobalBlock") && [globalBlock isKindOfClass: [OFBlock class]]) #endif @@ -91,11 +91,11 @@ TEST(@"Copying a stack block and using its copied variable", (voidBlock = returnStackBlock()) && voidBlock() == 43 && voidBlock() == 44 && voidBlock() == 45) -#if !defined(OF_WINDOWS) || !defined(OF_X86) || !defined(__clang__) +#if !defined(OF_WINDOWS) || !defined(__clang__) TEST(@"Copying a global block", (id)globalBlock == [[globalBlock copy] autorelease]) #endif #ifndef __clang_analyzer__ @@ -104,11 +104,11 @@ [mallocBlock retainCount] == 2) #endif TEST(@"Autorelease a stack block", R([stackBlock autorelease])) -#if !defined(OF_WINDOWS) || !defined(OF_X86) || !defined(__clang__) +#if !defined(OF_WINDOWS) || !defined(__clang__) TEST(@"Autorelease a global block", R([globalBlock autorelease])) #endif #ifndef __clang_analyzer__ TEST(@"Autorelease a malloc block", R([mallocBlock autorelease]))