From 0eab759168b28530140bc52ff7e4275c863bd146 Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Thu, 27 Apr 2023 11:29:31 +0900 Subject: [PATCH] daemon/socket: Get client pid from fd Signed-off-by: Sangchul Lee --- src/daemon/espp_service_socket.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/daemon/espp_service_socket.c b/src/daemon/espp_service_socket.c index 924c844..335e02d 100644 --- a/src/daemon/espp_service_socket.c +++ b/src/daemon/espp_service_socket.c @@ -16,6 +16,7 @@ #include "espp_service_priv.h" #include +#define __USE_GNU /* define for ucred in socket.h */ #include #include #include @@ -37,6 +38,7 @@ do { \ typedef struct { espp_service_s *svc; int fd; + unsigned int pid; } work_thread_userdata_s; static int __event_ret_msg_handling(int fd, espp_service_s *svc) @@ -152,6 +154,23 @@ exit: pthread_exit(NULL); } +static unsigned int get_pid_from_fd(int fd) +{ + struct ucred cred; + socklen_t len = (socklen_t)sizeof(struct ucred); + char str_error[MAX_ERROR_LEN] = {'\0',}; + + if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) < 0) { + strerror_r(errno, str_error, sizeof(str_error)); + LOG_ERROR("failed to getsockopt(), err: %s", str_error); + return 0; + } + + LOG_INFO("fd[%d] pid[%u]", fd, cred.pid); + + return cred.pid; +} + static void *__listen_thread_func(void *data) { espp_service_s *svc = (espp_service_s *)data; @@ -201,6 +220,7 @@ static void *__listen_thread_func(void *data) userdata = g_new0(work_thread_userdata_s, 1); userdata->svc = svc; userdata->fd = client_fd; + userdata->pid = get_pid_from_fd(client_fd); if (pthread_create(&work_thread_id, &attr, (void *)__work_thread_func, (void *)userdata)) { LOG_ERROR("failed to pthread_create(), client_fd[%d]", client_fd); -- 2.7.4