summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2009-05-16 18:42:18 +0000
committerdchagin <dchagin@FreeBSD.org>2009-05-16 18:42:18 +0000
commitbc4e3c1f6d89b977ecd4d226f0cd88dccd1e70a9 (patch)
treeca69c2e6c186a75c9cd48b6b0ffe4e094819c375 /sys/compat
parent1dee801328a72f344fa9b1a40ff1bf1a2cffccf8 (diff)
downloadFreeBSD-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
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/linux/linux_socket.c21
-rw-r--r--sys/compat/linux/linux_socket.h6
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_ */
OpenPOWER on IntegriCloud