From b5f54d4153dba430f92c8f4e6fe729b31793964a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 27 Jul 2020 18:42:10 +0200 Subject: [PATCH] Kernel+LibC: Add sys$set_process_name() for changing the process name --- Kernel/API/Syscall.h | 3 ++- Kernel/Process.cpp | 12 ++++++++++++ Kernel/Process.h | 1 + Libraries/LibC/unistd.cpp | 6 ++++++ Libraries/LibC/unistd.h | 1 + 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 8412971bf65..91cd72b9607 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -192,7 +192,8 @@ namespace Kernel { __ENUMERATE_SYSCALL(minherit) \ __ENUMERATE_SYSCALL(sendfd) \ __ENUMERATE_SYSCALL(recvfd) \ - __ENUMERATE_SYSCALL(sysconf) + __ENUMERATE_SYSCALL(sysconf) \ + __ENUMERATE_SYSCALL(set_process_name) namespace Syscall { diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 9fb82f20a58..0d4f1110e90 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -4489,6 +4489,18 @@ int Process::sys$get_process_name(char* buffer, int buffer_size) return 0; } +int Process::sys$set_process_name(const char* user_name, size_t user_name_length) +{ + REQUIRE_PROMISE(proc); + if (user_name_length > 256) + return -ENAMETOOLONG; + auto name = validate_and_copy_string_from_user(user_name, user_name_length); + if (name.is_null()) + return -EFAULT; + m_name = move(name); + return 0; +} + // We don't use the flag yet, but we could use it for distinguishing // random source like Linux, unlike the OpenBSD equivalent. However, if we // do, we should be able of the caveats that Linux has dealt with. diff --git a/Kernel/Process.h b/Kernel/Process.h index ebec0c73ead..4aa172dc983 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -185,6 +185,7 @@ public: int sys$sync(); int sys$beep(); int sys$get_process_name(char* buffer, int buffer_size); + int sys$set_process_name(const char* user_name, size_t user_name_length); int sys$watch_file(const char* path, size_t path_length); int sys$dbgputch(u8); int sys$dbgputstr(const u8*, int length); diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index 76c0427031d..1bebaf90327 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -683,6 +683,12 @@ int get_process_name(char* buffer, int buffer_size) __RETURN_WITH_ERRNO(rc, rc, -1); } +int set_process_name(const char* name, size_t name_length) +{ + int rc = syscall(SC_set_process_name, name, name_length); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + int chroot(const char* path) { return chroot_with_mount_flags(path, -1); diff --git a/Libraries/LibC/unistd.h b/Libraries/LibC/unistd.h index 58360189757..b496bbdaa59 100644 --- a/Libraries/LibC/unistd.h +++ b/Libraries/LibC/unistd.h @@ -55,6 +55,7 @@ __BEGIN_DECLS extern char** environ; int get_process_name(char* buffer, int buffer_size); +int set_process_name(const char* name, size_t name_length); void dump_backtrace(); int fsync(int fd); void sysbeep();