linux-user: add SO_PEERCRED support for getsockopt

Signed-off-by: Akos PASZTORY <akos.pasztory@gmail.com>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
Akos PASZTORY 2011-11-14 15:09:49 +02:00 committed by Riku Voipio
parent 50171d4207
commit 583359a689
2 changed files with 39 additions and 1 deletions

View File

@ -1530,9 +1530,41 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
case TARGET_SO_LINGER:
case TARGET_SO_RCVTIMEO:
case TARGET_SO_SNDTIMEO:
case TARGET_SO_PEERCRED:
case TARGET_SO_PEERNAME:
goto unimplemented;
case TARGET_SO_PEERCRED: {
struct ucred cr;
socklen_t crlen;
struct target_ucred *tcr;
if (get_user_u32(len, optlen)) {
return -TARGET_EFAULT;
}
if (len < 0) {
return -TARGET_EINVAL;
}
crlen = sizeof(cr);
ret = get_errno(getsockopt(sockfd, level, SO_PEERCRED,
&cr, &crlen));
if (ret < 0) {
return ret;
}
if (len > crlen) {
len = crlen;
}
if (!lock_user_struct(VERIFY_WRITE, tcr, optval_addr, 0)) {
return -TARGET_EFAULT;
}
__put_user(cr.pid, &tcr->pid);
__put_user(cr.uid, &tcr->uid);
__put_user(cr.gid, &tcr->gid);
unlock_user_struct(tcr, optval_addr, 1);
if (put_user_u32(len, optlen)) {
return -TARGET_EFAULT;
}
break;
}
/* Options with 'int' argument. */
case TARGET_SO_DEBUG:
optname = SO_DEBUG;

View File

@ -2336,3 +2336,9 @@ struct target_rlimit64 {
uint64_t rlim_cur;
uint64_t rlim_max;
};
struct target_ucred {
uint32_t pid;
uint32_t uid;
uint32_t gid;
};