mlibc: more networking sysdeps and fixes

This commit is contained in:
Matheus
2026-05-12 22:21:34 -03:00
parent c9bd223fcb
commit 03e6033653
+119 -37
View File
@@ -258,8 +258,17 @@ index ed0c463..8df2580 100644
} }
unsigned int if_nametoindex(const char *name) { unsigned int if_nametoindex(const char *name) {
diff --git mlibc-clean/options/rtld/x86_64/runtime.S mlibc-workdir/options/rtld/x86_64/runtime.S
index ba9a520..b958ef3 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/generic.cpp mlibc-workdir/sysdeps/astral/generic/generic.cpp diff --git mlibc-clean/sysdeps/astral/generic/generic.cpp mlibc-workdir/sysdeps/astral/generic/generic.cpp
index 3b04372..a4b934a 100644 index 3b04372..e8ef8d5 100644
--- mlibc-clean/sysdeps/astral/generic/generic.cpp --- mlibc-clean/sysdeps/astral/generic/generic.cpp
+++ mlibc-workdir/sysdeps/astral/generic/generic.cpp +++ mlibc-workdir/sysdeps/astral/generic/generic.cpp
@@ -1,7 +1,9 @@ @@ -1,7 +1,9 @@
@@ -272,7 +281,7 @@ index 3b04372..a4b934a 100644
#include <astral/syscall.h> #include <astral/syscall.h>
#include <astral/archctl.h> #include <astral/archctl.h>
#include <string.h> #include <string.h>
@@ -11,8 +13,20 @@ @@ -11,8 +13,29 @@
#include <sys/select.h> #include <sys/select.h>
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h> #include <sys/stat.h>
@@ -290,10 +299,19 @@ index 3b04372..a4b934a 100644
+ short flags; + short flags;
+ int mtu; + int mtu;
+} astral_net_info_t; +} astral_net_info_t;
+
+typedef struct {
+ struct ifaddrs ifa;
+ unsigned int if_index;
+ char if_name[IFNAMSIZ];
+ struct sockaddr addr;
+ struct sockaddr broadaddr;
+ struct sockaddr netmask;
+} astral_ifaddrs_t;
namespace mlibc { namespace mlibc {
int Sysdeps<SetGroups>::operator()(size_t size, const gid_t *list) { int Sysdeps<SetGroups>::operator()(size_t size, const gid_t *list) {
@@ -31,14 +45,214 @@ namespace mlibc { @@ -31,14 +54,276 @@ namespace mlibc {
return 0; return 0;
} }
@@ -390,7 +408,6 @@ index 3b04372..a4b934a 100644
+ } + }
+ +
+#ifndef MLIBC_BUILDING_RTLD +#ifndef MLIBC_BUILDING_RTLD
+ // XXX this might leak memory in case of an error.
+ int Sysdeps<Getifaddrs>::operator()(struct ifaddrs **out) { + int Sysdeps<Getifaddrs>::operator()(struct ifaddrs **out) {
+ struct ifaddrs *list = nullptr; + struct ifaddrs *list = nullptr;
+ +
@@ -416,6 +433,9 @@ index 3b04372..a4b934a 100644
+ if(!S_ISCHR(st.st_mode) || major(st.st_rdev) != 10) + if(!S_ISCHR(st.st_mode) || major(st.st_rdev) != 10)
+ continue; + continue;
+ +
+ if(strlen(dent.d_name) >= IFNAMSIZ)
+ continue;
+
+ int fd; + int fd;
+ error = sysdep<Openat>(dirfd, dent.d_name, 0, 0, &fd); + error = sysdep<Openat>(dirfd, dent.d_name, 0, 0, &fd);
+ if(error) + if(error)
@@ -429,35 +449,39 @@ index 3b04372..a4b934a 100644
+ continue; + continue;
+ } + }
+ +
+ struct ifaddrs *next = (struct ifaddrs *)calloc(1, sizeof(struct ifaddrs)); + astral_ifaddrs_t *next = (astral_ifaddrs_t *)calloc(1, sizeof(*next));
+ __ensure(next); + if(!next) {
+ sysdep<Close>(fd);
+ error = ENOMEM;
+ goto leave;
+ }
+ +
+ next->ifa_next = list; + next->ifa.ifa_next = list;
+ next->if_index = minor(st.st_rdev) + 1;
+ +
+ next->ifa_name = strdup(dent.d_name); + strcpy(next->if_name, dent.d_name);
+ __ensure(next->ifa_name); + next->ifa.ifa_name = next->if_name;
+ +
+ next->ifa_flags = net_info.flags; + next->ifa.ifa_flags = net_info.flags;
+ +
+ next->ifa_addr = (struct sockaddr *)malloc(sizeof(struct sockaddr)); + if(net_info.addr.sa_family) {
+ __ensure(next->ifa_addr); + memcpy(&next->addr, &net_info.addr, sizeof(next->addr));
+ memcpy(next->ifa_addr, &net_info.addr, sizeof(struct sockaddr)); + next->ifa.ifa_addr = &next->addr;
+ }
+ +
+ if(net_info.netmask.sa_family) { + if(net_info.netmask.sa_family) {
+ next->ifa_netmask = (struct sockaddr *)malloc(sizeof(struct sockaddr)); + memcpy(&next->netmask, &net_info.netmask, sizeof(next->netmask));
+ __ensure(next->ifa_netmask); + next->ifa.ifa_netmask = &next->netmask;
+ memcpy(next->ifa_netmask, &net_info.netmask, sizeof(struct sockaddr));
+ } + }
+ +
+ if(net_info.broadaddr.sa_family) { + if(net_info.broadaddr.sa_family) {
+ next->ifa_broadaddr = (struct sockaddr *)malloc(sizeof(struct sockaddr)); + memcpy(&next->broadaddr, &net_info.broadaddr, sizeof(next->broadaddr));
+ __ensure(next->ifa_broadaddr); + next->ifa.ifa_broadaddr = &next->broadaddr;
+ memcpy(next->ifa_broadaddr, &net_info.broadaddr, sizeof(struct sockaddr));
+ } + }
+ +
+ next->ifa_data = nullptr; + next->ifa.ifa_data = nullptr;
+ +
+ list = next; + list = &next->ifa;
+ sysdep<Close>(fd); + sysdep<Close>(fd);
+ } + }
+ +
@@ -465,10 +489,57 @@ index 3b04372..a4b934a 100644
+ +
+leave: +leave:
+ sysdep<Close>(dirfd); + sysdep<Close>(dirfd);
+ if(error)
+ freeifaddrs(list);
+ return error;
+ }
+
+ int Sysdeps<IfIndextoname>::operator()(unsigned int index, char *name) {
+ if(!index || !name)
+ return EINVAL;
+
+ struct ifaddrs *ifaddrs;
+ if(int e = sysdep<Getifaddrs>(&ifaddrs); e)
+ return e;
+
+ int error = ENXIO;
+ for(struct ifaddrs *it = ifaddrs; it; it = it->ifa_next) {
+ astral_ifaddrs_t *entry = (astral_ifaddrs_t *)it;
+ if(entry->if_index != index)
+ continue;
+
+ strcpy(name, entry->if_name);
+ error = 0;
+ break;
+ }
+
+ freeifaddrs(ifaddrs);
+ return error;
+ }
+
+ int Sysdeps<IfNametoindex>::operator()(const char *name, unsigned int *ret) {
+ if(!name)
+ return EINVAL;
+
+ struct ifaddrs *ifaddrs;
+ if(int e = sysdep<Getifaddrs>(&ifaddrs); e)
+ return e;
+
+ int error = ENXIO;
+ for(struct ifaddrs *it = ifaddrs; it; it = it->ifa_next) {
+ astral_ifaddrs_t *entry = (astral_ifaddrs_t *)it;
+ if(strcmp(entry->if_name, name))
+ continue;
+
+ *ret = entry->if_index;
+ error = 0;
+ break;
+ }
+
+ freeifaddrs(ifaddrs);
+ return error; + return error;
+ } + }
+ +
+ // XXX extremely leaky.
+ int Sysdeps<IfNameindex>::operator()(struct if_nameindex **out) { + int Sysdeps<IfNameindex>::operator()(struct if_nameindex **out) {
+ struct ifaddrs *ifaddrs; + struct ifaddrs *ifaddrs;
+ if(int e = sysdep<Getifaddrs>(&ifaddrs); e) + if(int e = sysdep<Getifaddrs>(&ifaddrs); e)
@@ -482,24 +553,33 @@ index 3b04372..a4b934a 100644
+ } + }
+ +
+ struct if_nameindex *arr = (struct if_nameindex *)malloc(sizeof(struct if_nameindex) * (count + 1)); + struct if_nameindex *arr = (struct if_nameindex *)malloc(sizeof(struct if_nameindex) * (count + 1));
+ if(!arr) + if(!arr) {
+ freeifaddrs(ifaddrs);
+ return ENOMEM; + return ENOMEM;
+ }
+ +
+ int i = 0; + int i = 0;
+ while(ifaddrs) { + for(struct ifaddrs *it = ifaddrs; it; it = it->ifa_next) {
+ arr[i].if_index = i + 1; + astral_ifaddrs_t *entry = (astral_ifaddrs_t *)it;
+ arr[i].if_name = strdup(ifaddrs->ifa_name); +
+ __ensure(arr[i].if_name); + arr[i].if_index = entry->if_index;
+ arr[i].if_name = strdup(entry->if_name);
+ if(!arr[i].if_name) {
+ for(int j = 0; j < i; ++j)
+ free(arr[j].if_name);
+ free(arr);
+ freeifaddrs(ifaddrs);
+ return ENOMEM;
+ }
+ +
+ ++i; + ++i;
+
+ ifaddrs = ifaddrs->ifa_next;
+ } + }
+ +
+ arr[count].if_index = 0; + arr[count].if_index = 0;
+ arr[count].if_name = nullptr; + arr[count].if_name = nullptr;
+ +
+ *out = arr; + *out = arr;
+ freeifaddrs(ifaddrs);
+ +
return 0; return 0;
} }
@@ -513,7 +593,7 @@ index 3b04372..a4b934a 100644
int Sysdeps<InetConfigured>::operator()(bool *ipv4, bool *ipv6) { 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 // there is no ipv6 support in the kernel currently and no way of checking for configured interfaces
@@ -47,6 +261,71 @@ namespace mlibc { @@ -47,6 +332,71 @@ namespace mlibc {
return 0; return 0;
} }
@@ -585,7 +665,7 @@ index 3b04372..a4b934a 100644
int Sysdeps<Readv>::operator()(int fd, const struct iovec *iovs, int iovc, ssize_t *bytes_read) { int Sysdeps<Readv>::operator()(int fd, const struct iovec *iovs, int iovc, ssize_t *bytes_read) {
long r; long r;
int error = syscall(SYSCALL_READV, &r, fd, (uint64_t)iovs, iovc); int error = syscall(SYSCALL_READV, &r, fd, (uint64_t)iovs, iovc);
@@ -489,6 +768,7 @@ namespace mlibc { @@ -489,6 +839,7 @@ namespace mlibc {
int Sysdeps<SetSockopt>::operator()(int fd, int layer, int number, const void *buffer, socklen_t size) { int Sysdeps<SetSockopt>::operator()(int fd, int layer, int number, const void *buffer, socklen_t size) {
long ret; long ret;
@@ -593,7 +673,7 @@ index 3b04372..a4b934a 100644
return syscall(SYSCALL_SETSOCKOPT, &ret, fd, layer, number, (uint64_t)buffer, size); return syscall(SYSCALL_SETSOCKOPT, &ret, fd, layer, number, (uint64_t)buffer, size);
} }
@@ -562,6 +842,16 @@ namespace mlibc { @@ -562,6 +913,16 @@ namespace mlibc {
return sysdep<Ioctl>(fd, TCSETS, (void *)attr, &res); return sysdep<Ioctl>(fd, TCSETS, (void *)attr, &res);
} }
@@ -610,7 +690,7 @@ index 3b04372..a4b934a 100644
int Sysdeps<Poll>::operator()(struct pollfd *fds, nfds_t count, int timeout, int *num_events) { int Sysdeps<Poll>::operator()(struct pollfd *fds, nfds_t count, int timeout, int *num_events) {
long ret; long ret;
long error = syscall(SYSCALL_POLL, &ret, (uint64_t)fds, count, timeout); long error = syscall(SYSCALL_POLL, &ret, (uint64_t)fds, count, timeout);
@@ -932,4 +1222,13 @@ namespace mlibc { @@ -932,4 +1293,13 @@ namespace mlibc {
*nanos = ts.tv_nsec; *nanos = ts.tv_nsec;
return err; return err;
} }
@@ -663,10 +743,10 @@ index a6c4067..f1e0b65 100644
#ifndef __MLIBC_ABI_ONLY #ifndef __MLIBC_ABI_ONLY
diff --git mlibc-clean/sysdeps/astral/include/mlibc/sysdeps.hpp mlibc-workdir/sysdeps/astral/include/mlibc/sysdeps.hpp diff --git mlibc-clean/sysdeps/astral/include/mlibc/sysdeps.hpp mlibc-workdir/sysdeps/astral/include/mlibc/sysdeps.hpp
index ce91084..e7e9b6d 100644 index ce91084..8af97e2 100644
--- mlibc-clean/sysdeps/astral/include/mlibc/sysdeps.hpp --- mlibc-clean/sysdeps/astral/include/mlibc/sysdeps.hpp
+++ mlibc-workdir/sysdeps/astral/include/mlibc/sysdeps.hpp +++ mlibc-workdir/sysdeps/astral/include/mlibc/sysdeps.hpp
@@ -7,8 +7,25 @@ namespace mlibc { @@ -7,8 +7,27 @@ namespace mlibc {
struct AstralSysdepTags : struct AstralSysdepTags :
SetGroups, SetGroups,
GetGroups, GetGroups,
@@ -680,6 +760,8 @@ index ce91084..e7e9b6d 100644
+ Llistxattr, + Llistxattr,
+ Flistxattr, + Flistxattr,
+ Getifaddrs, + Getifaddrs,
+ IfIndextoname,
+ IfNametoindex,
+ IfNameindex, + IfNameindex,
GetSockopt, GetSockopt,
InetConfigured, InetConfigured,
@@ -692,7 +774,7 @@ index ce91084..e7e9b6d 100644
Readv, Readv,
Writev, Writev,
Sysinfo, Sysinfo,
@@ -85,6 +102,8 @@ struct AstralSysdepTags : @@ -85,6 +104,8 @@ struct AstralSysdepTags :
Sleep, Sleep,
Tcgetattr, Tcgetattr,
Tcsetattr, Tcsetattr,
@@ -701,7 +783,7 @@ index ce91084..e7e9b6d 100644
Poll, Poll,
Ppoll, Ppoll,
Pselect, Pselect,
@@ -135,6 +154,7 @@ struct AstralSysdepTags : @@ -135,6 +156,7 @@ struct AstralSysdepTags :
VmUnmap, VmUnmap,
Isatty, Isatty,
ClockGet, ClockGet,