Compare commits
4 Commits
4c0b7d44b4
...
11174bfa14
Author | SHA1 | Date |
---|---|---|
|
11174bfa14 | |
|
84b1f3990c | |
|
943069b2a3 | |
|
e305698e6b |
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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* | \
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue