ports: bump mlibc/frigg

This commit is contained in:
Matheus
2026-08-19 19:46:44 -03:00
parent 280f68b339
commit 017a08a793
8 changed files with 53 additions and 274 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ typedef struct {
typedef struct {
void *address;
unsigned long flags;
int flags;
void (*restorer)(void);
sigset_t mask;
} sigaction_t;
+5 -5
View File
@@ -1,5 +1,5 @@
diff --git frigg-clean/include/frg/formatting.hpp frigg-workdir/include/frg/formatting.hpp
index a5de22c6..04c44d9c 100644
index a6c89d39..f066c03c 100644
--- frigg-clean/include/frg/formatting.hpp
+++ frigg-workdir/include/frg/formatting.hpp
@@ -341,7 +341,9 @@ namespace _fmt_basics {
@@ -12,7 +12,7 @@ index a5de22c6..04c44d9c 100644
+ locale_options<Char> locale_opts = {}) {
using P = frg::FormatterPolicy<Char>;
auto textLength = [](int i, unsigned base = 10, bool ignoreSign = false) {
auto textLength = [](int i, int base = 10, bool ignoreSign = false) {
@@ -353,14 +355,20 @@ namespace _fmt_basics {
return length;
};
@@ -98,10 +98,10 @@ index a5de22c6..04c44d9c 100644
#endif /* __STDC_HOSTED__ */
};
diff --git frigg-clean/include/frg/printf.hpp frigg-workdir/include/frg/printf.hpp
index 259c3b61..f0263130 100644
index bce5e241..c4558f85 100644
--- frigg-clean/include/frg/printf.hpp
+++ frigg-workdir/include/frg/printf.hpp
@@ -983,7 +983,8 @@ void do_printf_floats(S &sink, Char t, format_options opts,
@@ -991,7 +991,8 @@ void do_printf_floats(S &sink, Char t, format_options opts,
sink, pop_arg<long double>(vsp, &opts),
opts.minimum_width, opts.precision,
Char(opts.fill_zeros ? '0' : ' '), opts.left_justify, opts.alt_conversion,
@@ -111,7 +111,7 @@ index 259c3b61..f0263130 100644
break;
}
#endif
@@ -992,7 +993,8 @@ void do_printf_floats(S &sink, Char t, format_options opts,
@@ -1000,7 +1001,8 @@ void do_printf_floats(S &sink, Char t, format_options opts,
sink, pop_arg<double>(vsp, &opts),
opts.minimum_width, opts.precision,
Char(opts.fill_zeros ? '0' : ' '), opts.left_justify, opts.alt_conversion, use_capitals,
+40 -260
View File
@@ -52,185 +52,19 @@ index ccb37257..3dfa27af 100644
file->__status_bits |= __MLIBC_ERROR_BIT;
}
-
diff --git mlibc-clean/options/internal/generic/global-config.cpp mlibc-workdir/options/internal/generic/global-config.cpp
index 3b7b8627..3d86e7a4 100644
--- mlibc-clean/options/internal/generic/global-config.cpp
+++ mlibc-workdir/options/internal/generic/global-config.cpp
@@ -1,9 +1,15 @@
#include <stdlib.h>
-#include <string.h>
+#include <mlibc/allocator.hpp>
#include <mlibc/global-config.hpp>
namespace mlibc {
+namespace {
+
+constinit mlibc::lazy_eternal<GlobalConfig> globalConfigInstance;
+
+} // namespace
+
struct GlobalConfigGuard {
GlobalConfigGuard();
};
@@ -12,7 +18,7 @@ GlobalConfigGuard guard;
GlobalConfigGuard::GlobalConfigGuard() {
// Force the config to be created during initialization of libc.so.
- mlibc::globalConfig();
+ globalConfigInstance.get();
}
static bool envEnabled(const char *env) {
@@ -29,4 +35,8 @@ GlobalConfig::GlobalConfig() {
debugMonetaryLengths = envEnabled("MLIBC_DEBUG_MONETARY_LENGTHS");
}
+const GlobalConfig &globalConfig() {
+ return globalConfigInstance.get();
+}
+
} // namespace mlibc
diff --git mlibc-clean/options/internal/include/mlibc/allocator.hpp mlibc-workdir/options/internal/include/mlibc/allocator.hpp
index 852620a5..7f1aa89f 100644
index a8890506..e8c74a66 100644
--- mlibc-clean/options/internal/include/mlibc/allocator.hpp
+++ mlibc-workdir/options/internal/include/mlibc/allocator.hpp
@@ -3,6 +3,7 @@
@@ -11,6 +11,8 @@
#include <mlibc/lock.hpp>
#include <bits/ensure.h>
+#include <frg/manual_box.hpp>
#include <frg/slab.hpp>
#include <internal-config.h>
@@ -13,6 +14,8 @@ public:
struct VirtualAllocator {
public:
+ static constexpr size_t num_buckets = 14;
+
uintptr_t map(size_t length);
void unmap(uintptr_t address, size_t length);
+
+ static constexpr size_t num_buckets = 14;
};
typedef frg::slab_pool<VirtualAllocator, FutexLock> MemoryPool;
@@ -35,4 +38,34 @@ MemoryAllocator &getAllocator();
#endif // !MLIBC_DEBUG_ALLOCATOR
+namespace mlibc {
+
+template <typename T>
+struct lazy_eternal {
+ constexpr lazy_eternal() = default;
+
+ template <typename Self>
+ auto &get(this Self &&self) {
+ if (__atomic_load_n(&self.initialized_, __ATOMIC_ACQUIRE))
+ return *self.box_.get();
+
+ {
+ frg::unique_lock lock{self.lock_};
+ if (!__atomic_load_n(&self.initialized_, __ATOMIC_RELAXED)) {
+ self.box_.initialize();
+ __atomic_store_n(&self.initialized_, 1, __ATOMIC_RELEASE);
+ }
+ }
+
+ return *self.box_.get();
+ }
+
+private:
+ mutable uint32_t initialized_ = 0;
+ mutable FutexLock lock_;
+ mutable frg::manual_box<T> box_;
+};
+
+} // namespace mlibc
+
#endif // MLIBC_FRIGG_ALLOC
diff --git mlibc-clean/options/internal/include/mlibc/global-config.hpp mlibc-workdir/options/internal/include/mlibc/global-config.hpp
index 0235c541..3fad411a 100644
--- mlibc-clean/options/internal/include/mlibc/global-config.hpp
+++ mlibc-workdir/options/internal/include/mlibc/global-config.hpp
@@ -14,11 +14,8 @@ struct GlobalConfig {
bool debugMonetaryLengths;
};
-inline const GlobalConfig &globalConfig() {
- static GlobalConfig cached;
- return cached;
-}
+const GlobalConfig &globalConfig();
-}
+} // namespace mlibc
#endif // MLIBC_GLOBAL_CONFIG
diff --git mlibc-clean/options/internal/include/mlibc/lock.hpp mlibc-workdir/options/internal/include/mlibc/lock.hpp
index f4477411..ab446678 100644
--- mlibc-clean/options/internal/include/mlibc/lock.hpp
+++ mlibc-workdir/options/internal/include/mlibc/lock.hpp
@@ -14,7 +14,7 @@
template<bool Recursive>
struct alignas(4) FutexLockImpl {
- FutexLockImpl() : _state{0}, _recursion{0} { }
+ constexpr FutexLockImpl() : _state{0}, _recursion{0} { }
FutexLockImpl(const FutexLockImpl &) = delete;
diff --git mlibc-clean/options/internal/include/mlibc/sysdep-signatures.hpp mlibc-workdir/options/internal/include/mlibc/sysdep-signatures.hpp
index d639e43c..694021ac 100644
--- mlibc-clean/options/internal/include/mlibc/sysdep-signatures.hpp
+++ mlibc-workdir/options/internal/include/mlibc/sysdep-signatures.hpp
@@ -23,6 +23,10 @@
#include <mlibc/sysdep-tags.hpp>
+#if __MLIBC_POSIX_OPTION
+#include <net/if.h>
+#endif
+
namespace mlibc {
template<typename Tag>
@@ -156,6 +160,7 @@ SYSDEP_FUNC(Linkat, int olddirfd, const char *old_path, int newdirfd, const char
SYSDEP_FUNC(Symlink, const char *target_path, const char *link_path);
SYSDEP_FUNC(Symlinkat, const char *target_path, int dirfd, const char *link_path);
SYSDEP_FUNC(Renameat, int olddirfd, const char *old_path, int newdirfd, const char *new_path);
+SYSDEP_FUNC(Renameat2, int olddirfd, const char *old_path, int newdirfd, const char *new_path, unsigned int flags);
SYSDEP_FUNC(Fcntl, int fd, int request, va_list args, int *result);
SYSDEP_FUNC(Ttyname, int fd, char *buf, size_t size);
SYSDEP_FUNC(Fadvise, int fd, off_t offset, off_t length, int advice);
@@ -235,6 +240,7 @@ SYSDEP_FUNC(SetRegid, gid_t rgid, gid_t egid);
SYSDEP_FUNC(GetLoginR, char *name, size_t name_len);
SYSDEP_FUNC(IfIndextoname, unsigned int index, char *name);
SYSDEP_FUNC(IfNametoindex, const char *name, unsigned int *ret);
+SYSDEP_FUNC(IfNameindex, struct if_nameindex **ret);
SYSDEP_FUNC(Ptsname, int fd, char *buffer, size_t length);
SYSDEP_FUNC(Unlockpt, int fd);
SYSDEP_FUNC(ThreadSetname, void *tcb, const char *name);
diff --git mlibc-clean/options/internal/include/mlibc/sysdep-tags.hpp mlibc-workdir/options/internal/include/mlibc/sysdep-tags.hpp
index 17cf4222..01941c14 100644
--- mlibc-clean/options/internal/include/mlibc/sysdep-tags.hpp
+++ mlibc-workdir/options/internal/include/mlibc/sysdep-tags.hpp
@@ -316,6 +316,8 @@ struct Symlink {};
struct Symlinkat {};
// int sys_renameat(int olddirfd, const char *old_path, int newdirfd, const char *new_path);
struct Renameat {};
+// int sys_renameat2(int olddirfd, const char *old_path, int newdirfd, const char *new_path, unsigned int flags);
+struct Renameat2 {};
// int sys_fcntl(int fd, int request, va_list args, int *result);
struct Fcntl {};
// int sys_ttyname(int fd, char *buf, size_t size);
@@ -476,6 +478,8 @@ struct GetLoginR {};
struct IfIndextoname {};
// int sys_if_nametoindex(const char *name, unsigned int *ret);
struct IfNametoindex {};
+// int sys_if_nameindex(struct if_nameindex **ret);
+struct IfNameindex {};
// int sys_ptsname(int fd, char *buffer, size_t length);
struct Ptsname {};
// int sys_unlockpt(int fd);
diff --git mlibc-clean/options/linux/generic/malloc.cpp mlibc-workdir/options/linux/generic/malloc.cpp
index 065de6c1..10c73955 100644
--- mlibc-clean/options/linux/generic/malloc.cpp
@@ -266,61 +100,6 @@ index 55a567aa..d1d77873 100644
opts
);
diff --git mlibc-clean/options/posix/generic/net-if.cpp mlibc-workdir/options/posix/generic/net-if.cpp
index ed0c463c..8df25802 100644
--- mlibc-clean/options/posix/generic/net-if.cpp
+++ mlibc-workdir/options/posix/generic/net-if.cpp
@@ -6,8 +6,13 @@
#include <mlibc/all-sysdeps.hpp>
#include <mlibc/debug.hpp>
-void if_freenameindex(struct if_nameindex *) {
- mlibc::infoLogger() << "mlibc: if_freenameindex is a no-op" << frg::endlog;
+void if_freenameindex(struct if_nameindex *index) {
+ if(!index)
+ return;
+
+ for(struct if_nameindex *it = index; it->if_index || it->if_name; ++it)
+ free(it->if_name);
+ free(index);
}
char *if_indextoname(unsigned int index, char *name) {
@@ -20,9 +25,13 @@ char *if_indextoname(unsigned int index, char *name) {
}
struct if_nameindex *if_nameindex(void) {
- mlibc::infoLogger() << "mlibc: if_nameindex() is a no-op" << frg::endlog;
- errno = ENOSYS;
- return nullptr;
+ struct if_nameindex *ret = nullptr;
+ if(int e = mlibc::sysdep_or_enosys<IfNameindex>(&ret); e) {
+ errno = e;
+ return nullptr;
+ }
+
+ return ret;
}
unsigned int if_nametoindex(const char *name) {
diff --git mlibc-clean/options/posix/generic/posix_stdio.cpp mlibc-workdir/options/posix/generic/posix_stdio.cpp
index ab4f784e..ba663bb2 100644
--- mlibc-clean/options/posix/generic/posix_stdio.cpp
+++ mlibc-workdir/options/posix/generic/posix_stdio.cpp
@@ -233,7 +233,10 @@ int renameat(int olddirfd, const char *old_path, int newdirfd, const char *new_p
return 0;
}
-int renameat2(int, const char *, int, const char *, unsigned int) {
- __ensure(!"Not implemented");
- __builtin_unreachable();
+int renameat2(int olddirfd, const char *old_path, int newdirfd, const char *new_path, unsigned int flags) {
+ if(int e = mlibc::sysdep_or_enosys<Renameat2>(olddirfd, old_path, newdirfd, new_path, flags); e) {
+ errno = e;
+ return -1;
+ }
+ return 0;
}
diff --git mlibc-clean/options/posix/include/bits/posix/posix_stdio.h mlibc-workdir/options/posix/include/bits/posix/posix_stdio.h
index f0d6edd1..ab57b6b1 100644
--- mlibc-clean/options/posix/include/bits/posix/posix_stdio.h
@@ -338,15 +117,6 @@ index f0d6edd1..ab57b6b1 100644
#endif /* _MLIBC_POSIX_STDIO_H */
-
diff --git mlibc-clean/options/rtld/x86_64/runtime.S mlibc-workdir/options/rtld/x86_64/runtime.S
index ba9a5208..b958ef33 100644
--- mlibc-clean/options/rtld/x86_64/runtime.S
+++ mlibc-workdir/options/rtld/x86_64/runtime.S
@@ -60,4 +60,3 @@ pltRelocateStub:
jmp *%r11
.section .note.GNU-stack,"",%progbits
-
diff --git mlibc-clean/sysdeps/astral/generic/astral.cpp mlibc-workdir/sysdeps/astral/generic/astral.cpp
index a86353f3..3e1a18c2 100644
--- mlibc-clean/sysdeps/astral/generic/astral.cpp
@@ -379,7 +149,7 @@ index a86353f3..3e1a18c2 100644
return error ? -1 : ret;
}
diff --git mlibc-clean/sysdeps/astral/generic/generic.cpp mlibc-workdir/sysdeps/astral/generic/generic.cpp
index 3b043726..ec94347e 100644
index 3b043726..84bec4d3 100644
--- mlibc-clean/sysdeps/astral/generic/generic.cpp
+++ mlibc-workdir/sysdeps/astral/generic/generic.cpp
@@ -1,9 +1,12 @@
@@ -446,7 +216,7 @@ index 3b043726..ec94347e 100644
int Sysdeps<SetGroups>::operator()(size_t size, const gid_t *list) {
(void)size;
(void)list;
@@ -31,15 +74,324 @@ namespace mlibc {
@@ -31,15 +74,333 @@ namespace mlibc {
return 0;
}
@@ -576,9 +346,9 @@ index 3b043726..ec94347e 100644
+ int Sysdeps<GetCurrentStackInfo>::operator()(void **stack_base, size_t *stack_size) {
+ *stack_size = 1024 * 1024 * 4;
+ *stack_base = (void *)(0x0000800000000000 - *stack_size);
return 0;
}
+ return 0;
+ }
+
+#ifndef MLIBC_BUILDING_RTLD
+ int Sysdeps<Getifaddrs>::operator()(struct ifaddrs **out) {
+ struct ifaddrs *list = nullptr;
@@ -755,6 +525,15 @@ index 3b043726..ec94347e 100644
+
+ return 0;
+ }
+
+ void Sysdeps<IfFreeNameindex>::operator()(struct if_nameindex *ifn) {
+ if(!ifn)
+ return;
+
+ for(auto it = ifn; it->if_index || it->if_name; ++it)
+ free(it->if_name);
+ free(ifn);
+ }
+#endif
+
+ int Sysdeps<EventfdCreate>::operator()(unsigned int initval, int flags, int *fd) {
@@ -764,9 +543,9 @@ index 3b043726..ec94347e 100644
+ return error;
+
+ *fd = ret;
+ return 0;
+ }
+
return 0;
}
+ int Sysdeps<GetSockopt>::operator()(int fd, int layer, int number,
+ void *__restrict buffer, socklen_t *__restrict size) {
+ long ret;
@@ -776,7 +555,7 @@ index 3b043726..ec94347e 100644
int Sysdeps<InetConfigured>::operator()(bool *ipv4, bool *ipv6) {
// there is no ipv6 support in the kernel currently and no way of checking for configured interfaces
*ipv4 = true;
@@ -47,6 +399,71 @@ namespace mlibc {
@@ -47,6 +408,71 @@ namespace mlibc {
return 0;
}
@@ -848,7 +627,7 @@ index 3b043726..ec94347e 100644
int Sysdeps<Readv>::operator()(int fd, const struct iovec *iovs, int iovc, ssize_t *bytes_read) {
long r;
int error = syscall(SYSCALL_READV, &r, fd, (uint64_t)iovs, iovc);
@@ -86,6 +503,11 @@ namespace mlibc {
@@ -86,6 +512,11 @@ namespace mlibc {
return e;
}
@@ -860,7 +639,7 @@ index 3b043726..ec94347e 100644
int Sysdeps<Shutdown>::operator()(int sockfd, int how) {
long ret;
return syscall(SYSCALL_SHUTDOWN, &ret, sockfd, how);
@@ -487,8 +909,15 @@ namespace mlibc {
@@ -487,8 +918,15 @@ namespace mlibc {
return err;
}
@@ -876,7 +655,7 @@ index 3b043726..ec94347e 100644
return syscall(SYSCALL_SETSOCKOPT, &ret, fd, layer, number, (uint64_t)buffer, size);
}
@@ -511,6 +940,11 @@ namespace mlibc {
@@ -511,6 +949,11 @@ namespace mlibc {
return err;
}
@@ -888,7 +667,7 @@ index 3b043726..ec94347e 100644
int Sysdeps<Renameat>::operator()(int olddirfd, const char *old_path, int newdirfd, const char *new_path) {
long ret;
return syscall(SYSCALL_RENAMEAT, &ret, olddirfd, (uint64_t)old_path, newdirfd, (uint64_t)new_path);
@@ -562,6 +996,16 @@ namespace mlibc {
@@ -562,6 +1005,16 @@ namespace mlibc {
return sysdep<Ioctl>(fd, TCSETS, (void *)attr, &res);
}
@@ -905,7 +684,7 @@ index 3b043726..ec94347e 100644
int Sysdeps<Poll>::operator()(struct pollfd *fds, nfds_t count, int timeout, int *num_events) {
long ret;
long error = syscall(SYSCALL_POLL, &ret, (uint64_t)fds, count, timeout);
@@ -932,4 +1376,13 @@ namespace mlibc {
@@ -932,4 +1385,13 @@ namespace mlibc {
*nanos = ts.tv_nsec;
return err;
}
@@ -1026,10 +805,10 @@ index 00000000..0c70df32
+
+#endif /* _ASTRAL_SYSCTL_H */
diff --git mlibc-clean/sysdeps/astral/include/mlibc/sysdeps.hpp mlibc-workdir/sysdeps/astral/include/mlibc/sysdeps.hpp
index ce910847..3e78eee2 100644
index 17f52e51..3527edbe 100644
--- mlibc-clean/sysdeps/astral/include/mlibc/sysdeps.hpp
+++ mlibc-workdir/sysdeps/astral/include/mlibc/sysdeps.hpp
@@ -5,10 +5,33 @@
@@ -5,10 +5,34 @@
namespace mlibc {
struct AstralSysdepTags :
@@ -1052,6 +831,7 @@ index ce910847..3e78eee2 100644
+ IfIndextoname,
+ IfNametoindex,
+ IfNameindex,
+ IfFreeNameindex,
GetSockopt,
InetConfigured,
+ Unlockpt,
@@ -1063,7 +843,7 @@ index ce910847..3e78eee2 100644
Readv,
Writev,
Sysinfo,
@@ -66,6 +89,7 @@ struct AstralSysdepTags :
@@ -66,6 +90,7 @@ struct AstralSysdepTags :
SetSid,
FutexTid,
GetTid,
@@ -1071,7 +851,7 @@ index ce910847..3e78eee2 100644
ThreadExit,
Clone,
Listen,
@@ -77,6 +101,7 @@ struct AstralSysdepTags :
@@ -77,6 +102,7 @@ struct AstralSysdepTags :
Bind,
Socket,
Renameat,
@@ -1079,7 +859,7 @@ index ce910847..3e78eee2 100644
Rename,
Utimensat,
Fchownat,
@@ -85,6 +110,8 @@ struct AstralSysdepTags :
@@ -85,6 +111,8 @@ struct AstralSysdepTags :
Sleep,
Tcgetattr,
Tcsetattr,
@@ -1088,7 +868,7 @@ index ce910847..3e78eee2 100644
Poll,
Ppoll,
Pselect,
@@ -135,7 +162,11 @@ struct AstralSysdepTags :
@@ -135,7 +163,11 @@ struct AstralSysdepTags :
VmUnmap,
Isatty,
ClockGet,
@@ -1102,10 +882,10 @@ index ce910847..3e78eee2 100644
template<typename Tag>
diff --git mlibc-clean/sysdeps/astral/meson.build mlibc-workdir/sysdeps/astral/meson.build
index 43dd6b0d..3e01e87d 100644
index a8b162e1..0c066104 100644
--- mlibc-clean/sysdeps/astral/meson.build
+++ mlibc-workdir/sysdeps/astral/meson.build
@@ -86,6 +86,7 @@ if not no_headers
@@ -89,6 +89,7 @@ if not no_headers
install_headers(
'include/astral/syscall.h',
'include/astral/archctl.h',
@@ -1142,10 +922,10 @@ index 00000000..0b3a1581
+ return 0;
+}
diff --git mlibc-clean/tests/meson.build mlibc-workdir/tests/meson.build
index 9c5bcd72..8b2b95e1 100644
index b2785998..16c5159b 100644
--- mlibc-clean/tests/meson.build
+++ mlibc-workdir/tests/meson.build
@@ -170,6 +170,7 @@ all_test_cases = [
@@ -186,6 +186,7 @@ all_test_cases = [
'glibc/rpmatch',
'glibc/strverscmp',
'glibc/memmem',
+1 -2
View File
@@ -1,6 +1,6 @@
name=frigg
from_source=frigg
revision=3
revision=4
hostdeps="xgcc xbinutils pkgconfig"
imagedeps="meson ninja-build build-essential"
@@ -15,4 +15,3 @@ build() {
package() {
DESTDIR=${dest_dir} ninja install
}
+1 -1
View File
@@ -1,6 +1,6 @@
name=mlibc
from_source=mlibc
revision=12
revision=13
hostdeps="xgcc xbinutils pkgconfig"
builddeps="freestnd-c-hdrs freestnd-cxx-hdrs frigg libsmarter"
imagedeps="meson ninja-build git build-essential binutils"
+1 -1
View File
@@ -1,6 +1,6 @@
name=mlibc-headers
from_source=mlibc
revision=6
revision=7
imagedeps="ninja-build meson build-essential rsync"
builddeps="linux-headers"
+2 -2
View File
@@ -1,5 +1,5 @@
name=frigg
version=65db297ebd6db09e86fe737175631a872d81c39b
version=81c88917f54f90c67ea14cbd52534a9d2a1eae13
source_method=tarball
tarball_url="https://github.com/managarm/frigg/archive/${version}.tar.gz"
tarball_sha512=ce01814c42f9c7a48c615d101756f3d0f53ed047bfbcab46856ea179770fb6035729c18cbc420d403d0fc168b8c20cc055b92f29b631f5260da80c4eabfbe90c
tarball_sha512=718f3105383ef2e8e76c7e0f528f5822215d25b77eb34d889eacfe9cb26f255f5b9516bcc8d686c22a65047a5ea31240b683d7ef2d65b1ad15a9953232752463
+2 -2
View File
@@ -1,5 +1,5 @@
name=mlibc
version=8f1959ede7a39c8c00c95a0cf513c164e6b8ff41
version=1388414fe6d4907d54b3c47333e0e592fa34d31b
source_method=tarball
tarball_url="https://github.com/managarm/mlibc/archive/${version}.tar.gz"
tarball_sha512="59719899e659cee97382b35ec7e390b0fc1b570d8728b9036cc4b1c9e37372dd2ae60b417b874ddad3fcd6cd509c583fcd8c0f93964f0f82b8d168761e2c12ce"
tarball_sha512="56ebeb86e116a868d94c30cb95ae10df15896ad82d6e9594120abbd4b6fa832c0e8581df4401adb20f036b23091917d8fa8ac8395df815b403313953efe5cde3"