diff options
author | dchagin <dchagin@FreeBSD.org> | 2009-05-16 18:42:18 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2009-05-16 18:42:18 +0000 |
commit | bc4e3c1f6d89b977ecd4d226f0cd88dccd1e70a9 (patch) | |
tree | ca69c2e6c186a75c9cd48b6b0ffe4e094819c375 | |
parent | 1dee801328a72f344fa9b1a40ff1bf1a2cffccf8 (diff) | |
download | FreeBSD-src-bc4e3c1f6d89b977ecd4d226f0cd88dccd1e70a9.zip FreeBSD-src-bc4e3c1f6d89b977ecd4d226f0cd88dccd1e70a9.tar.gz |
Emulate SO_PEERCRED socket option.
Temporarily use 0 for pid member as the FreeBSD does not cache remote
UNIX domain socket peer pid.
PR: kern/102956
Reviewed by: rwatson
Approved by: kib (mentor)
MFC after: 1 month
-rw-r--r-- | sys/compat/linux/linux_socket.c | 21 | ||||
-rw-r--r-- | sys/compat/linux/linux_socket.h | 6 |
2 files changed, 26 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index bb2090c..da7d829 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -1354,7 +1354,9 @@ linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) } */ bsd_args; l_timeval linux_tv; struct timeval tv; - socklen_t tv_len; + socklen_t tv_len, xulen; + struct xucred xu; + struct l_ucred lxu; int error, name; bsd_args.s = args->s; @@ -1377,6 +1379,23 @@ linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) sizeof(linux_tv))); /* NOTREACHED */ break; + case LOCAL_PEERCRED: + if (args->optlen != sizeof(lxu)) + return (EINVAL); + xulen = sizeof(xu); + error = kern_getsockopt(td, args->s, bsd_args.level, + name, &xu, UIO_SYSSPACE, &xulen); + if (error) + return (error); + /* + * XXX Use 0 for pid as the FreeBSD does not cache peer pid. + */ + lxu.pid = 0; + lxu.uid = xu.cr_uid; + lxu.gid = xu.cr_gid; + return (copyout(&lxu, PTRIN(args->optval), sizeof(lxu))); + /* NOTREACHED */ + break; default: break; } diff --git a/sys/compat/linux/linux_socket.h b/sys/compat/linux/linux_socket.h index 9257a7d..311b1524 100644 --- a/sys/compat/linux/linux_socket.h +++ b/sys/compat/linux/linux_socket.h @@ -90,4 +90,10 @@ #define LINUX_AF_APPLETALK 5 #define LINUX_AF_INET6 10 +struct l_ucred { + uint32_t pid; + uint32_t uid; + uint32_t gid; +}; + #endif /* _LINUX_SOCKET_H_ */ |