Code to get peer pid on a few more platforms

This commit is contained in:
Kovid Goyal
2024-04-15 19:14:29 +05:30
parent 5b587060a4
commit e531791f79

22
glfw/wl_init.c vendored
View File

@@ -633,21 +633,25 @@ GLFWAPI GLFWColorScheme glfwGetCurrentSystemColorTheme(void) {
return glfw_current_system_color_theme(); return glfw_current_system_color_theme();
} }
#ifdef __linux__
static pid_t static pid_t
get_socket_peer_pid(int fd) { get_socket_peer_pid(int fd) {
#ifdef __linux__
struct ucred ucred; struct ucred ucred;
socklen_t len = sizeof(struct ucred); socklen_t len = sizeof(struct ucred);
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1) { return (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1) ? -1 : ucred.pid;
perror("getsockopt failed"); #elif defined(LOCAL_PEERCRED) && defined(XUCRED_VERSION)
return -1; struct xucred peercred;
} socklen_t peercredlen = sizeof(peercred);
return ucred.pid; return (getsockopt(c->fd, LOCAL_PEERCRED, 1, (void *)&peercred, &peercredlen) == 0 && peercred.cr_version == XUCRED_VERSION) ? peercred.cr_pid : -1;
} #elif defined(LOCAL_PEERPID)
pid_t pid;
socklen_t pid_size = sizeof(pid);
return getsockopt(client, SOL_LOCAL, LOCAL_PEERPID, &pid, &pid_size) == -1 ? -1 : pid;
#else #else
static pid_t errno = ENOSYS;
get_socket_peer_pid(int fd) { return -1; } return -1;
#endif #endif
}
GLFWAPI pid_t glfwWaylandCompositorPID(void) { GLFWAPI pid_t glfwWaylandCompositorPID(void) {
if (!_glfw.wl.display) return -1; if (!_glfw.wl.display) return -1;