diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index efb5e1c7bd698..aac4017a0d845 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -329,6 +329,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.unistd.geteuid libc.src.unistd.getpid libc.src.unistd.getppid + libc.src.unistd.getsid libc.src.unistd.gettid libc.src.unistd.getuid libc.src.unistd.isatty diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index a9ba0c257755b..6b006f0ecca89 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -326,6 +326,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.unistd.geteuid libc.src.unistd.getpid libc.src.unistd.getppid + libc.src.unistd.getsid libc.src.unistd.gettid libc.src.unistd.getuid libc.src.unistd.isatty diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index a4f6671a59789..35661004663c9 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -328,6 +328,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.unistd.geteuid libc.src.unistd.getpid libc.src.unistd.getppid + libc.src.unistd.getsid libc.src.unistd.gettid libc.src.unistd.getuid libc.src.unistd.isatty diff --git a/libc/include/unistd.yaml b/libc/include/unistd.yaml index d04d46bd5c002..051e92b006741 100644 --- a/libc/include/unistd.yaml +++ b/libc/include/unistd.yaml @@ -161,6 +161,12 @@ functions: return_type: int arguments: - type: void + - name: getsid + standards: + - POSIX + return_type: pid_t + arguments: + - type: pid_t - name: gettid standards: - Linux diff --git a/libc/src/unistd/CMakeLists.txt b/libc/src/unistd/CMakeLists.txt index fb563ec4ecfd9..b1a1716aa85c6 100644 --- a/libc/src/unistd/CMakeLists.txt +++ b/libc/src/unistd/CMakeLists.txt @@ -125,6 +125,13 @@ add_entrypoint_object( .${LIBC_TARGET_OS}.getppid ) +add_entrypoint_object( + getsid + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.getsid +) + add_entrypoint_object( geteuid ALIAS diff --git a/libc/src/unistd/getsid.h b/libc/src/unistd/getsid.h new file mode 100644 index 0000000000000..e788b5dc4fba0 --- /dev/null +++ b/libc/src/unistd/getsid.h @@ -0,0 +1,21 @@ +//===-- Implementation header for getsid ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_UNISTD_GETSID_H +#define LLVM_LIBC_SRC_UNISTD_GETSID_H + +#include "hdr/types/pid_t.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +pid_t getsid(pid_t); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_UNISTD_GETSID_H diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt index afdc595d0b26f..368593a3bb7b5 100644 --- a/libc/src/unistd/linux/CMakeLists.txt +++ b/libc/src/unistd/linux/CMakeLists.txt @@ -235,6 +235,19 @@ add_entrypoint_object( libc.src.__support.OSUtil.osutil ) +add_entrypoint_object( + getsid + SRCS + getsid.cpp + HDRS + ../getsid.h + DEPENDS + libc.hdr.types.pid_t + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil + libc.src.errno.errno +) + add_entrypoint_object( getuid SRCS diff --git a/libc/src/unistd/linux/getsid.cpp b/libc/src/unistd/linux/getsid.cpp new file mode 100644 index 0000000000000..5977c5bf10e94 --- /dev/null +++ b/libc/src/unistd/linux/getsid.cpp @@ -0,0 +1,29 @@ +//===-- Linux implementation of getsid-------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/unistd/getsid.h" + +#include "hdr/types/pid_t.h" +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" +#include "src/__support/macros/config.h" +#include "src/errno/libc_errno.h" +#include // For syscall numbers. + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(pid_t, getsid, (pid_t pid)) { + pid_t ret = LIBC_NAMESPACE::syscall_impl(SYS_getsid, pid); + if (ret < 0) { + libc_errno = static_cast(-ret); + return -1; + } + return ret; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/src/unistd/CMakeLists.txt b/libc/test/src/unistd/CMakeLists.txt index 665cb367ba4fd..d1f3050e6cccf 100644 --- a/libc/test/src/unistd/CMakeLists.txt +++ b/libc/test/src/unistd/CMakeLists.txt @@ -394,6 +394,16 @@ add_libc_unittest( libc.src.unistd.getppid ) +add_libc_unittest( + getsid_test + SUITE + libc_unistd_unittests + SRCS + getsid_test.cpp + DEPENDS + libc.src.unistd.getsid +) + add_libc_unittest( getuid_test SUITE diff --git a/libc/test/src/unistd/getsid_test.cpp b/libc/test/src/unistd/getsid_test.cpp new file mode 100644 index 0000000000000..b3e8d54b14dcb --- /dev/null +++ b/libc/test/src/unistd/getsid_test.cpp @@ -0,0 +1,21 @@ +//===-- Unittests for getsid ----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/errno/libc_errno.h" +#include "src/unistd/getsid.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcGetPidTest, GetCurrSID) { + pid_t sid = LIBC_NAMESPACE::getsid(0); + ASSERT_NE(sid, -1); + ASSERT_ERRNO_SUCCESS(); + + pid_t nonexist_sid = LIBC_NAMESPACE::getsid(-1); + ASSERT_EQ(nonexist_sid, -1); + ASSERT_ERRNO_FAILURE(); +}