Compare commits

...

4 Commits

Author SHA1 Message Date
Bananymous 11174bfa14 BuildSystem: Rename toolchain -> x86_64-pc-banan_os 2025-06-03 23:02:10 +03:00
Bananymous 84b1f3990c LibC: Fix getnameinfo
How was i doing everything so wrong :D
2025-06-03 16:36:39 +03:00
Bananymous 943069b2a3 Kernel: Socket EPIPE and send SIGPIPE on write after hang up 2025-06-03 10:24:44 +03:00
Bananymous e305698e6b Kernel: Fix epoll EPOLLHUP and EPOLLERR reporting 2025-06-03 10:23:53 +03:00
8 changed files with 54 additions and 27 deletions

View File

@ -136,7 +136,7 @@ namespace Kernel
auto& listen = listen_it->value;
{
uint32_t listen_mask = EPOLLERR | EPOLLHUP;
uint32_t listen_mask = EPOLLHUP | EPOLLERR;
for (size_t fd = 0; fd < listen.events.size(); fd++)
if (listen.has_fd(fd))
listen_mask |= listen.events[fd].events;
@ -170,7 +170,7 @@ namespace Kernel
continue;
auto& listen_event = listen.events[fd];
const auto new_events = listen_event.events & events;
const auto new_events = (listen_event.events | EPOLLHUP | EPOLLERR) & events;
if (new_events == 0)
continue;

View File

@ -439,6 +439,8 @@ namespace Kernel
LockGuard _(m_mutex);
const bool hungup_before = has_hungup_impl();
auto& header = buffer.as<const TCPHeader>();
dprintln_if(DEBUG_TCP, "receiving {} {8b}", (uint8_t)m_state, header.flags);
dprintln_if(DEBUG_TCP, " {}", (uint32_t)header.ack_number);
@ -609,6 +611,9 @@ namespace Kernel
}
}
if (!hungup_before && has_hungup_impl())
epoll_notify(EPOLLHUP);
m_thread_blocker.unblock();
}
@ -690,9 +695,12 @@ namespace Kernel
auto target_address_len = m_connection_info->address_len;
if (auto ret = m_network_layer.sendto(*this, {}, target_address, target_address_len); ret.is_error())
dwarnln("{}", ret.error());
const bool hungup_before = has_hungup_impl();
m_state = m_next_state;
if (m_state == State::Established)
m_has_connected = true;
if (!hungup_before && has_hungup_impl())
epoll_notify(EPOLLHUP);
continue;
}

View File

@ -476,14 +476,25 @@ namespace Kernel
LockGuard _(inode->m_mutex);
if (is_nonblock && !inode->can_write())
return BAN::Error::from_errno(EWOULDBLOCK);
const auto check_errors =
[&inode, is_nonblock]() -> BAN::ErrorOr<void>
{
if (inode->has_hungup())
{
Thread::current().add_signal(SIGPIPE);
return BAN::Error::from_errno(EPIPE);
}
if (is_nonblock && !inode->can_write())
return BAN::Error::from_errno(EWOULDBLOCK);
return {};
};
TRY(check_errors());
size_t total_sent = 0;
while (total_sent < buffer.size())
{
if (is_nonblock && !inode->can_write())
return total_sent;
TRY(check_errors());
const size_t nsend = TRY(inode->sendto(buffer.slice(total_sent), address, address_len));
if (nsend == 0)
return 0;

View File

@ -8,28 +8,28 @@ if [[ -z $BANAN_ROOT_DIR ]]; then
fi
if [[ -z $BANAN_ARCH ]]; then
export BANAN_ARCH=x86_64
export BANAN_ARCH='x86_64'
fi
export BANAN_TOOLCHAIN_DIR=$BANAN_ROOT_DIR/toolchain
export BANAN_TOOLCHAIN_PREFIX=$BANAN_TOOLCHAIN_DIR/local
export BANAN_TOOLCHAIN_TRIPLE=$BANAN_ARCH-banan_os
export BANAN_TOOLCHAIN_DIR="$BANAN_ROOT_DIR/toolchain"
export BANAN_TOOLCHAIN_PREFIX="$BANAN_TOOLCHAIN_DIR/local"
export BANAN_TOOLCHAIN_TRIPLE="$BANAN_ARCH-pc-banan_os"
export BANAN_BUILD_DIR=$BANAN_ROOT_DIR/build
export BANAN_BUILD_DIR="$BANAN_ROOT_DIR/build"
export BANAN_PORT_DIR=$BANAN_ROOT_DIR/ports
export BANAN_PORT_DIR="$BANAN_ROOT_DIR/ports"
export BANAN_SYSROOT=$BANAN_BUILD_DIR/sysroot
export BANAN_SYSROOT_TAR=$BANAN_SYSROOT.tar
export BANAN_SYSROOT="$BANAN_BUILD_DIR/sysroot"
export BANAN_SYSROOT_TAR="$BANAN_SYSROOT.tar"
export BANAN_DISK_IMAGE_PATH=$BANAN_BUILD_DIR/banan-os.img
export BANAN_DISK_IMAGE_PATH="$BANAN_BUILD_DIR/banan-os.img"
if [[ -z $BANAN_UEFI_BOOT ]]; then
export BANAN_UEFI_BOOT=0
fi
if [[ -z $BANAN_BOOTLOADER ]]; then
export BANAN_BOOTLOADER="BANAN"
export BANAN_BOOTLOADER='BANAN'
fi
export BANAN_CMAKE=$BANAN_TOOLCHAIN_PREFIX/bin/cmake
export BANAN_CMAKE="$BANAN_TOOLCHAIN_PREFIX/bin/cmake"

View File

@ -30,8 +30,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}/bin/${BANAN_ARCH}-banan_os-g++)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}/bin/${BANAN_ARCH}-pc-banan_os-g++)
set(CMAKE_CXX_COMPILER_WORKS True)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}/bin/${BANAN_ARCH}-banan_os-gcc)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}/bin/${BANAN_ARCH}-pc-banan_os-gcc)
set(CMAKE_C_COMPILER_WORKS True)

View File

@ -166,7 +166,8 @@ build_grub () {
--target="$BANAN_ARCH" \
--prefix="$BANAN_TOOLCHAIN_PREFIX" \
--with-platform="efi" \
--disable-werror
--disable-werror \
CFLAGS=--std=gnu11
make $MAKE_JOBS
make install

View File

@ -12,12 +12,12 @@ diff -ruN gcc-12.2.0/config.sub gcc-12.2.0-banan_os/config.sub
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
diff -ruN gcc-12.2.0/fixincludes/mkfixinc.sh gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh
--- gcc-12.2.0/fixincludes/mkfixinc.sh 2022-08-19 11:09:52.160657095 +0300
+++ gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh 2024-09-03 23:09:34.461106020 +0300
+++ gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh 2025-06-03 18:08:13.366965577 +0300
@@ -11,6 +11,7 @@
# Check for special fix rules for particular targets
case $machine in
+ *-banan_os* | \
+ *-*-banan_os* | \
i?86-*-cygwin* | \
i?86-*-mingw32* | \
x86_64-*-mingw32* | \

View File

@ -154,24 +154,31 @@ int getnameinfo(const struct sockaddr* __restrict sa, socklen_t salen, char* __r
switch (sa->sa_family)
{
case AF_INET:
{
if (salen < static_cast<socklen_t>(sizeof(sockaddr_in)))
return EAI_FAMILY;
if (service && snprintf(service, servicelen, "%d", reinterpret_cast<sockaddr_in*>(service)->sin_port) < 0)
const sockaddr_in* sa_in = reinterpret_cast<const sockaddr_in*>(sa);
if (node && !inet_ntop(sa_in->sin_family, &sa_in->sin_addr, node, nodelen))
return EAI_SYSTEM;
if (service && snprintf(service, servicelen, "%d", sa_in->sin_port) < 0)
return EAI_SYSTEM;
break;
}
case AF_INET6:
{
if (salen < static_cast<socklen_t>(sizeof(sockaddr_in6)))
return EAI_FAMILY;
if (service && snprintf(service, servicelen, "%d", reinterpret_cast<sockaddr_in6*>(service)->sin6_port) < 0)
const sockaddr_in6* sa_in6 = reinterpret_cast<const sockaddr_in6*>(sa);
if (node && !inet_ntop(sa_in6->sin6_family, &sa_in6->sin6_addr, node, nodelen))
return EAI_SYSTEM;
if (service && snprintf(service, servicelen, "%d", sa_in6->sin6_port) < 0)
return EAI_SYSTEM;
break;
}
default:
return EAI_FAIL;
}
if (node && inet_ntop(sa->sa_family, sa, node, nodelen) == nullptr)
return EAI_SYSTEM;
return 0;
}