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:
parent
50171d4207
commit
583359a689
|
@ -1530,9 +1530,41 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
|
||||||
case TARGET_SO_LINGER:
|
case TARGET_SO_LINGER:
|
||||||
case TARGET_SO_RCVTIMEO:
|
case TARGET_SO_RCVTIMEO:
|
||||||
case TARGET_SO_SNDTIMEO:
|
case TARGET_SO_SNDTIMEO:
|
||||||
case TARGET_SO_PEERCRED:
|
|
||||||
case TARGET_SO_PEERNAME:
|
case TARGET_SO_PEERNAME:
|
||||||
goto unimplemented;
|
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. */
|
/* Options with 'int' argument. */
|
||||||
case TARGET_SO_DEBUG:
|
case TARGET_SO_DEBUG:
|
||||||
optname = SO_DEBUG;
|
optname = SO_DEBUG;
|
||||||
|
|
|
@ -2336,3 +2336,9 @@ struct target_rlimit64 {
|
||||||
uint64_t rlim_cur;
|
uint64_t rlim_cur;
|
||||||
uint64_t rlim_max;
|
uint64_t rlim_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct target_ucred {
|
||||||
|
uint32_t pid;
|
||||||
|
uint32_t uid;
|
||||||
|
uint32_t gid;
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue