diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td --- a/libc/config/linux/api.td +++ b/libc/config/linux/api.td @@ -269,7 +269,7 @@ } def UniStdAPI : PublicAPI<"unistd.h"> { - let Types = ["off_t", "size_t", "ssize_t"]; + let Types = ["off_t", "pid_t", "size_t", "ssize_t", "uid_t"]; } def SysResourceAPI : PublicAPI<"sys/resource.h"> { diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -132,6 +132,10 @@ libc.src.unistd.fchdir libc.src.unistd.fsync libc.src.unistd.ftruncate + libc.src.unistd.geteuid + libc.src.unistd.getpid + libc.src.unistd.getppid + libc.src.unistd.getuid libc.src.unistd.link libc.src.unistd.linkat libc.src.unistd.lseek diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -169,8 +169,10 @@ .llvm_libc_common_h .llvm-libc-macros.file_seek_macros .llvm-libc-macros.unistd_macros + .llvm-libc-types.pid_t .llvm-libc-types.size_t .llvm-libc-types.ssize_t + .llvm-libc-types.uid_t ) add_gen_header( diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -32,6 +32,7 @@ add_header(nlink_t HDR nlink_t.h) add_header(off_t HDR off_t.h) add_header(once_flag HDR once_flag.h DEPENDS .__futex_word) +add_header(pid_t HDR pid_t.h) add_header(pthread_attr_t HDR pthread_attr_t.h DEPENDS .size_t) add_header(pthread_key_t HDR pthread_key_t.h) add_header(pthread_mutex_t HDR pthread_mutex_t.h DEPENDS .__futex_word .__mutex_type) diff --git a/libc/include/llvm-libc-types/pid_t.h b/libc/include/llvm-libc-types/pid_t.h new file mode 100644 --- /dev/null +++ b/libc/include/llvm-libc-types/pid_t.h @@ -0,0 +1,14 @@ +//===-- Definition of pid_t type ------------------------------------------===// +// +// 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_TYPES_PID_t_H__ +#define __LLVM_LIBC_TYPES_PID_t_H__ + +typedef __INT32_TYPE__ pid_t; + +#endif // __LLVM_LIBC_TYPES_PID_t_H__ diff --git a/libc/spec/posix.td b/libc/spec/posix.td --- a/libc/spec/posix.td +++ b/libc/spec/posix.td @@ -23,6 +23,7 @@ def BlkCntT : NamedType<"blkcnt_t">; def NLinkT : NamedType<"nlink_t">; def TimeSpec : NamedType<"struct timespec">; +def PidT : NamedType<"pid_t">; def StatType : NamedType<"struct stat">; def StatTypePtr : PtrType; @@ -270,6 +271,8 @@ OffTType, SSizeTType, SizeTType, + PidT, + UidT, ], [], // Enumerations [ @@ -318,6 +321,81 @@ RetValSpec, [ArgSpec, ArgSpec] >, + FunctionSpec< + "geteuid", + RetValSpec, + [ArgSpec] + >, + FunctionSpec< + "getpid", + RetValSpec, + [ArgSpec] + >, + FunctionSpec< + "getppid", + RetValSpec, + [ArgSpec] + >, + FunctionSpec< + "getuid", + RetValSpec, + [ArgSpec] + >, + FunctionSpec< + "link", + RetValSpec, + [ArgSpec, ArgSpec] + >, + FunctionSpec< + "linkat", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "lseek", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "pread", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "pwrite", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "read", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "readlink", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "readlinkat", + RetValSpec, + [ArgSpec, ArgSpec, ArgSpec] + >, + FunctionSpec< + "rmdir", + RetValSpec, + [ArgSpec] + >, + FunctionSpec< + "getpid", + RetValSpec, + [ArgSpec] + >, + FunctionSpec< + "getppid", + RetValSpec, + [ArgSpec] + >, FunctionSpec< "link", RetValSpec, diff --git a/libc/src/unistd/CMakeLists.txt b/libc/src/unistd/CMakeLists.txt --- a/libc/src/unistd/CMakeLists.txt +++ b/libc/src/unistd/CMakeLists.txt @@ -65,6 +65,34 @@ .${LIBC_TARGET_OS}.ftruncate ) +add_entrypoint_object( + getpid + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.getpid +) + +add_entrypoint_object( + getppid + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.getppid +) + +add_entrypoint_object( + geteuid + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.geteuid +) + +add_entrypoint_object( + getuid + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.getuid +) + add_entrypoint_object( link ALIAS diff --git a/libc/src/unistd/geteuid.h b/libc/src/unistd/geteuid.h new file mode 100644 --- /dev/null +++ b/libc/src/unistd/geteuid.h @@ -0,0 +1,20 @@ +//===-- Implementation header for geteuid -----------------------*- 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_GETEUID_H +#define LLVM_LIBC_SRC_UNISTD_GETEUID_H + +#include + +namespace __llvm_libc { + +uid_t geteuid(); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_UNISTD_GETEUID_H diff --git a/libc/src/unistd/getpid.h b/libc/src/unistd/getpid.h new file mode 100644 --- /dev/null +++ b/libc/src/unistd/getpid.h @@ -0,0 +1,20 @@ +//===-- Implementation header for getpid ------------------------*- 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_GETPID_H +#define LLVM_LIBC_SRC_UNISTD_GETPID_H + +#include + +namespace __llvm_libc { + +pid_t getpid(); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_UNISTD_GETPID_H diff --git a/libc/src/unistd/getppid.h b/libc/src/unistd/getppid.h new file mode 100644 --- /dev/null +++ b/libc/src/unistd/getppid.h @@ -0,0 +1,20 @@ +//===-- Implementation header for getppid -----------------------*- 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_GETPPID_H +#define LLVM_LIBC_SRC_UNISTD_GETPPID_H + +#include + +namespace __llvm_libc { + +pid_t getppid(); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_UNISTD_GETPPID_H diff --git a/libc/src/unistd/getuid.h b/libc/src/unistd/getuid.h new file mode 100644 --- /dev/null +++ b/libc/src/unistd/getuid.h @@ -0,0 +1,20 @@ +//===-- Implementation header for getuid ------------------------*- 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_GETUID_H +#define LLVM_LIBC_SRC_UNISTD_GETUID_H + +#include + +namespace __llvm_libc { + +uid_t getuid(); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_UNISTD_GETUID_H diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt --- a/libc/src/unistd/linux/CMakeLists.txt +++ b/libc/src/unistd/linux/CMakeLists.txt @@ -116,6 +116,54 @@ libc.src.errno.errno ) +add_entrypoint_object( + geteuid + SRCS + geteuid.cpp + HDRS + ../geteuid.h + DEPENDS + libc.include.unistd + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil +) + +add_entrypoint_object( + getpid + SRCS + getpid.cpp + HDRS + ../getpid.h + DEPENDS + libc.include.unistd + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil +) + +add_entrypoint_object( + getppid + SRCS + getppid.cpp + HDRS + ../getppid.h + DEPENDS + libc.include.unistd + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil +) + +add_entrypoint_object( + getuid + SRCS + getuid.cpp + HDRS + ../getuid.h + DEPENDS + libc.include.unistd + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil +) + add_entrypoint_object( link SRCS diff --git a/libc/src/unistd/linux/geteuid.cpp b/libc/src/unistd/linux/geteuid.cpp new file mode 100644 --- /dev/null +++ b/libc/src/unistd/linux/geteuid.cpp @@ -0,0 +1,22 @@ +//===-- Linux implementation of geteuid -----------------------------------===// +// +// 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/geteuid.h" + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" + +#include // For syscall numbers. + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(uid_t, geteuid, ()) { + return __llvm_libc::syscall(SYS_geteuid); +} + +} // namespace __llvm_libc diff --git a/libc/src/unistd/linux/getpid.cpp b/libc/src/unistd/linux/getpid.cpp new file mode 100644 --- /dev/null +++ b/libc/src/unistd/linux/getpid.cpp @@ -0,0 +1,22 @@ +//===-- Linux implementation of getpid ------------------------------------===// +// +// 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/getpid.h" + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" + +#include // For syscall numbers. + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(pid_t, getpid, ()) { + return __llvm_libc::syscall(SYS_getpid); +} + +} // namespace __llvm_libc diff --git a/libc/src/unistd/linux/getppid.cpp b/libc/src/unistd/linux/getppid.cpp new file mode 100644 --- /dev/null +++ b/libc/src/unistd/linux/getppid.cpp @@ -0,0 +1,22 @@ +//===-- Linux implementation of getppid -----------------------------------===// +// +// 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/getppid.h" + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" + +#include // For syscall numbers. + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(pid_t, getppid, ()) { + return __llvm_libc::syscall(SYS_getppid); +} + +} // namespace __llvm_libc diff --git a/libc/src/unistd/linux/getuid.cpp b/libc/src/unistd/linux/getuid.cpp new file mode 100644 --- /dev/null +++ b/libc/src/unistd/linux/getuid.cpp @@ -0,0 +1,22 @@ +//===-- Linux implementation of getuid ------------------------------------===// +// +// 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/getuid.h" + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" + +#include // For syscall numbers. + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(uid_t, getuid, ()) { + return __llvm_libc::syscall(SYS_getuid); +} + +} // namespace __llvm_libc diff --git a/libc/test/src/unistd/CMakeLists.txt b/libc/test/src/unistd/CMakeLists.txt --- a/libc/test/src/unistd/CMakeLists.txt +++ b/libc/test/src/unistd/CMakeLists.txt @@ -321,3 +321,43 @@ libc.src.unistd.close libc.src.unistd.unlinkat ) + +add_libc_unittest( + getpid_test + SUITE + libc_unistd_unittests + SRCS + getpid_test.cpp + DEPENDS + libc.src.unistd.getpid +) + +add_libc_unittest( + getppid_test + SUITE + libc_unistd_unittests + SRCS + getppid_test.cpp + DEPENDS + libc.src.unistd.getppid +) + +add_libc_unittest( + getuid_test + SUITE + libc_unistd_unittests + SRCS + getuid_test.cpp + DEPENDS + libc.src.unistd.getuid +) + +add_libc_unittest( + geteuid_test + SUITE + libc_unistd_unittests + SRCS + geteuid_test.cpp + DEPENDS + libc.src.unistd.geteuid +) diff --git a/libc/test/src/unistd/geteuid_test.cpp b/libc/test/src/unistd/geteuid_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/src/unistd/geteuid_test.cpp @@ -0,0 +1,15 @@ +//===-- Unittests for geteuid ---------------------------------------------===// +// +// 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/geteuid.h" +#include "utils/UnitTest/Test.h" + +TEST(LlvmLibcGetEuidTest, SmokeTest) { + // geteuid always succeeds. So, we just call it as a smoke test. + __llvm_libc::geteuid(); +} diff --git a/libc/test/src/unistd/getpid_test.cpp b/libc/test/src/unistd/getpid_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/src/unistd/getpid_test.cpp @@ -0,0 +1,15 @@ +//===-- Unittests for getpid ----------------------------------------------===// +// +// 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/getpid.h" +#include "utils/UnitTest/Test.h" + +TEST(LlvmLibcGetPidTest, SmokeTest) { + // getpid always succeeds. So, we just call it as a smoke test. + __llvm_libc::getpid(); +} diff --git a/libc/test/src/unistd/getppid_test.cpp b/libc/test/src/unistd/getppid_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/src/unistd/getppid_test.cpp @@ -0,0 +1,15 @@ +//===-- Unittests for getppid ---------------------------------------------===// +// +// 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/getppid.h" +#include "utils/UnitTest/Test.h" + +TEST(LlvmLibcGetPpidTest, SmokeTest) { + // getppid always succeeds. So, we just call it as a smoke test. + __llvm_libc::getppid(); +} diff --git a/libc/test/src/unistd/getuid_test.cpp b/libc/test/src/unistd/getuid_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/src/unistd/getuid_test.cpp @@ -0,0 +1,15 @@ +//===-- Unittests for getuid ----------------------------------------------===// +// +// 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/getuid.h" +#include "utils/UnitTest/Test.h" + +TEST(LlvmLibcGetUidTest, SmokeTest) { + // getuid always succeeds. So, we just call it as a smoke test. + __llvm_libc::getuid(); +}