Program Listing for File linux_socket.hpp
↰ Return to documentation for file (include/input/linux/socket/linux_socket.hpp)
#pragma once
#include "IPC_SHARE_MEM.hpp"
#include <string>
#include <sys/socket.h>
namespace PDJE_LINUX {
class PDJE_Socket {
private:
struct {
int socket_fd = -1;
int client_fd = -1;
pid_t rt_pid = -1;
std::string socket_path =
"/tmp/pdje_input_module_libevdev_socket_path.sock";
} importants;
int
OpenClientWithSudo(const std::string &exec_path, const std::string &arg);
int
CloseClient();
template <typename T, int MEM_PROT_FLAG>
int
Send_IPCMEM_ToRT(const IPCSharedMem<T, MEM_PROT_FLAG> &shared_IPC_mem);
public:
int
SocketOpen(const std::string &exec_path);
void
SocketClose();
int
QueryClient(const std::string &query, std::string &result);
PDJE_Socket() = default;
~PDJE_Socket() = default;
};
template <typename T, int MEM_PROT_FLAG>
int
PDJE_Socket::Send_IPCMEM_ToRT(
const IPCSharedMem<T, MEM_PROT_FLAG> &shared_IPC_mem)
{
struct msghdr msg = { 0 };
// data trans
struct iovec iov = { .iov_base =
(void *)"F", // 실제 payload 데이터 (필수는 아님)
.iov_len = 1 };
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
// end dummy data trans
char cmsgbuf[CMSG_SPACE(sizeof(int))]; // ancillary buffer
msg.msg_control = cmsgbuf;
msg.msg_controllen = sizeof(cmsgbuf);
struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
memcpy(CMSG_DATA(cmsg), &shared_IPC_mem.FD, sizeof(int));
return sendmsg(importants.client_fd, &msg, 0);
}
}; // namespace PDJE_LINUX