diff --git a/repos/ports/include/noux_session/noux_session.h b/repos/ports/include/noux_session/noux_session.h index 810645ad4..fdae49a54 100644 --- a/repos/ports/include/noux_session/noux_session.h +++ b/repos/ports/include/noux_session/noux_session.h @@ -85,6 +85,7 @@ namespace Noux { SYSCALL_UTIMES, SYSCALL_SYNC, SYSCALL_KILL, + SYSCALL_GETDTABLESIZE, SYSCALL_INVALID = -1 }; @@ -134,6 +135,7 @@ namespace Noux { NOUX_DECL_SYSCALL_NAME(UTIMES) NOUX_DECL_SYSCALL_NAME(SYNC) NOUX_DECL_SYSCALL_NAME(KILL) + NOUX_DECL_SYSCALL_NAME(GETDTABLESIZE) case SYSCALL_INVALID: return 0; } return 0; diff --git a/repos/ports/include/noux_session/sysio.h b/repos/ports/include/noux_session/sysio.h index 693ee32cb..f63c73409 100644 --- a/repos/ports/include/noux_session/sysio.h +++ b/repos/ports/include/noux_session/sysio.h @@ -459,6 +459,8 @@ namespace Noux { SYSIO_DECL(sync, { }, { }); SYSIO_DECL(kill, { int pid; Signal sig; }, { }); + + SYSIO_DECL(getdtablesize, { }, { int n; }); }; }; }; diff --git a/repos/ports/src/lib/libc_noux/plugin.cc b/repos/ports/src/lib/libc_noux/plugin.cc index f9997bc8c..d27c8f810 100644 --- a/repos/ports/src/lib/libc_noux/plugin.cc +++ b/repos/ports/src/lib/libc_noux/plugin.cc @@ -227,6 +227,21 @@ extern "C" struct passwd *getpwuid(uid_t uid) } +extern "C" int getdtablesize() +{ + if (!noux_syscall(Noux::Session::SYSCALL_GETDTABLESIZE)) { + PWRN("getdtablesize syscall failed"); + errno = ENOSYS; + return -1; + } + + int n = sysio()->getdtablesize_out.n; + if (verbose) + PDBG("%d", n); + return n; +} + + extern "C" uid_t getgid() { sysio()->userinfo_in.request = Noux::Sysio::USERINFO_GET_GID; diff --git a/repos/ports/src/noux/main.cc b/repos/ports/src/noux/main.cc index 41ddccc32..c80697e90 100644 --- a/repos/ports/src/noux/main.cc +++ b/repos/ports/src/noux/main.cc @@ -864,6 +864,14 @@ bool Noux::Child::syscall(Noux::Session::Syscall sc) break; } + case SYSCALL_GETDTABLESIZE: + { + _sysio->getdtablesize_out.n = + Noux::File_descriptor_registry::MAX_FILE_DESCRIPTORS; + result = true; + break; + } + case SYSCALL_SOCKET: case SYSCALL_GETSOCKOPT: case SYSCALL_SETSOCKOPT: