+static void recvcmsg(struct socket *sk, struct msghdr *msg)
+{
+ struct cmsghdr *cmsg;
+ struct ucred *cred;
+
+ for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg))
+ {
+ if((cmsg->cmsg_level == SOL_SOCKET) && (cmsg->cmsg_type == SCM_CREDENTIALS))
+ {
+ if(sk->ucred.pid == 0)
+ {
+ cred = (struct ucred *)CMSG_DATA(cmsg);
+ memcpy(&sk->ucred, cred, sizeof(*cred));
+ }
+ }
+ }
+}
+