mirror of https://gitee.com/openkylin/linux.git
[ICSK] compat: Introduce inet_csk_compat_[gs]etsockopt
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d1d47beef8
commit
dec73ff029
|
@ -331,4 +331,9 @@ extern int inet_csk_ctl_sock_create(struct socket **sock,
|
|||
unsigned short family,
|
||||
unsigned short type,
|
||||
unsigned char protocol);
|
||||
|
||||
extern int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
extern int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
#endif /* _INET_CONNECTION_SOCK_H */
|
||||
|
|
|
@ -522,14 +522,10 @@ EXPORT_SYMBOL_GPL(dccp_setsockopt);
|
|||
int compat_dccp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
{
|
||||
if (level != SOL_DCCP) {
|
||||
if (inet_csk(sk)->icsk_af_ops->compat_setsockopt)
|
||||
return inet_csk(sk)->icsk_af_ops->compat_setsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
else
|
||||
return inet_csk(sk)->icsk_af_ops->setsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
}
|
||||
if (level != SOL_DCCP)
|
||||
return inet_csk_compat_setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
|
||||
return do_dccp_setsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(compat_dccp_setsockopt);
|
||||
|
@ -619,14 +615,9 @@ EXPORT_SYMBOL_GPL(dccp_getsockopt);
|
|||
int compat_dccp_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen)
|
||||
{
|
||||
if (level != SOL_DCCP) {
|
||||
if (inet_csk(sk)->icsk_af_ops->compat_setsockopt)
|
||||
return inet_csk(sk)->icsk_af_ops->compat_getsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
else
|
||||
return inet_csk(sk)->icsk_af_ops->getsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
}
|
||||
if (level != SOL_DCCP)
|
||||
return inet_csk_compat_getsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return do_dccp_getsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(compat_dccp_getsockopt);
|
||||
|
|
|
@ -667,3 +667,33 @@ int inet_csk_ctl_sock_create(struct socket **sock, unsigned short family,
|
|||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(inet_csk_ctl_sock_create);
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen)
|
||||
{
|
||||
const struct inet_csk *icsk = inet_csk(sk);
|
||||
|
||||
if (icsk->icsk_af_ops->compat_getsockopt != NULL)
|
||||
return icsk->icsk_af_ops->compat_getsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return icsk->icsk_af_ops->getsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(inet_csk_compat_getsockopt);
|
||||
|
||||
int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
{
|
||||
const struct inet_csk *icsk = inet_csk(sk);
|
||||
|
||||
if (icsk->icsk_af_ops->compat_setsockopt != NULL)
|
||||
return icsk->icsk_af_ops->compat_setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return icsk->icsk_af_ops->setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(inet_csk_compat_setsockopt);
|
||||
#endif
|
||||
|
|
|
@ -1882,16 +1882,9 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
|||
int compat_tcp_setsockopt(struct sock *sk, int level,
|
||||
int optname, char __user *optval, int optlen)
|
||||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
if (level != SOL_TCP) {
|
||||
if (icsk->icsk_af_ops->compat_setsockopt)
|
||||
return icsk->icsk_af_ops->compat_setsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
else
|
||||
return icsk->icsk_af_ops->setsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
}
|
||||
if (level != SOL_TCP)
|
||||
return inet_csk_compat_setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return do_tcp_setsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
#endif
|
||||
|
@ -2061,16 +2054,9 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
|||
int compat_tcp_getsockopt(struct sock *sk, int level,
|
||||
int optname, char __user *optval, int __user *optlen)
|
||||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
if (level != SOL_TCP) {
|
||||
if (icsk->icsk_af_ops->compat_getsockopt)
|
||||
return icsk->icsk_af_ops->compat_getsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
else
|
||||
return icsk->icsk_af_ops->getsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
}
|
||||
if (level != SOL_TCP)
|
||||
return inet_csk_compat_getsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return do_tcp_getsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue