client: Implement get_peer for FreeBSD

This commit is contained in:
Kenny Levinsen 2020-08-01 00:31:16 +00:00
parent e129536a08
commit 2f54beb5fe
2 changed files with 21 additions and 2 deletions

View file

@ -17,8 +17,8 @@
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
#include <sys/consio.h> #include <sys/consio.h>
#include <sys/kbio.h> #include <sys/kbio.h>
#define TTY0 "/dev/ttyv0" #define TTY0 "/dev/ttyv0"
#define TTYF "/dev/ttyv%d" #define TTYF "/dev/ttyv%d"
#define K_ON K_XLATE #define K_ON K_XLATE
#define K_OFF K_CODE #define K_OFF K_CODE
#define FRSIG SIGIO #define FRSIG SIGIO

View file

@ -9,6 +9,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#if defined(__FreeBSD__)
#include <sys/ucred.h>
#include <sys/un.h>
#endif
#include "client.h" #include "client.h"
#include "log.h" #include "log.h"
#include "poller.h" #include "poller.h"
@ -18,6 +23,7 @@
#include "terminal.h" #include "terminal.h"
static int get_peer(int fd, pid_t *pid, uid_t *uid, gid_t *gid) { static int get_peer(int fd, pid_t *pid, uid_t *uid, gid_t *gid) {
#if defined(__linux__)
struct ucred cred; struct ucred cred;
socklen_t len = sizeof cred; socklen_t len = sizeof cred;
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) == -1) { if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) == -1) {
@ -27,6 +33,19 @@ static int get_peer(int fd, pid_t *pid, uid_t *uid, gid_t *gid) {
*uid = cred.uid; *uid = cred.uid;
*gid = cred.gid; *gid = cred.gid;
return 0; return 0;
#elif defined(__FreeBSD__)
struct xucred cred;
socklen_t len = sizeof cred;
if (getsockopt(fd, SOL_SOCKET, LOCAL_PEERCRED, &cred, &len) == -1) {
return -1;
}
*pid = -1;
*uid = cred.cr_uid;
*gid = cred.cr_ngroups > 0 ? cred.cr_groups[0] : -1;
return 0;
#else
return -1;
#endif
} }
struct client *client_create(struct server *server, int client_fd) { struct client *client_create(struct server *server, int client_fd) {