On Mon, 2006-08-07 at 16:20 -0700, Stephen Hemminger wrote: > On Mon, 07 Aug 2006 16:00:29 -0700 > Sridhar Samudrala <[EMAIL PROTECTED]> wrote: > > > Dave, > > > > Could you consider this for inclusion into 2.6.19 tree? > > > > Thanks > > Sridhar > > > > This patch implements wrapper functions that provide a convenient way to > > access the sockets API for in-kernel users like sunrpc, cifs & ocfs2 etc > > and any future users. > > > > Signed-off-by: Sridhar Samudrala <[EMAIL PROTECTED]> > > Acked-by: James Morris <[EMAIL PROTECTED]> > > > > --- > > > > include/linux/net.h | 19 +++++++++ > > net/socket.c | 113 > > +++++++++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 132 insertions(+), 0 deletions(-) > > > > diff --git a/include/linux/net.h b/include/linux/net.h > > index b20c53c..19da2c0 100644 > > --- a/include/linux/net.h > > +++ b/include/linux/net.h > > @@ -208,6 +208,25 @@ extern int kernel_recvmsg(struct > > struct kvec *vec, size_t num, > > size_t len, int flags); > > > > +extern int kernel_bind(struct socket *sock, struct sockaddr *addr, > > + int addrlen); > > +extern int kernel_listen(struct socket *sock, int backlog); > > +extern int kernel_accept(struct socket *sock, struct socket **newsock, > > + int flags); > > +extern int kernel_connect(struct socket *sock, struct sockaddr *addr, > > + int addrlen, int flags); > > +extern int kernel_getsockname(struct socket *sock, struct sockaddr *addr, > > + int *addrlen); > > +extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr, > > + int *addrlen); > > +extern int kernel_getsockopt(struct socket *sock, int level, int optname, > > + char *optval, int *optlen); > > +extern int kernel_setsockopt(struct socket *sock, int level, int optname, > > + char *optval, int optlen); > > +extern int kernel_sendpage(struct socket *sock, struct page *page, int > > offset, > > + size_t size, int flags); > > +extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long > > arg); > > + > > #ifndef CONFIG_SMP > > #define SOCKOPS_WRAPPED(name) name > > #define SOCKOPS_WRAP(name, fam) > > diff --git a/net/socket.c b/net/socket.c > > index b4848ce..0c9d01d 100644 > > --- a/net/socket.c > > +++ b/net/socket.c > > @@ -2160,6 +2160,109 @@ static long compat_sock_ioctl(struct fil > > } > > #endif > > > > +int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen) > > +{ > > + return sock->ops->bind(sock, addr, addrlen); > > +} > > + > > +int kernel_listen(struct socket *sock, int backlog) > > +{ > > + return sock->ops->listen(sock, backlog); > > +} > > + > > +int kernel_accept(struct socket *sock, struct socket **newsock, int flags) > > +{ > > + struct sock *sk = sock->sk; > > + int err; > > + > > + err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol, > > + newsock); > > + if (err < 0) > > + goto done; > > + > > + err = sock->ops->accept(sock, *newsock, flags); > > + if (err < 0) { > > + sock_release(*newsock); > > + goto done; > > + } > > + > > + (*newsock)->ops = sock->ops; > > + > > +done: > > + return err; > > +} > > + > > +int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, > > + int flags) > > +{ > > + return sock->ops->connect(sock, addr, addrlen, flags); > > +} > > + > > +int kernel_getsockname(struct socket *sock, struct sockaddr *addr, > > + int *addrlen) > > +{ > > + return sock->ops->getname(sock, addr, addrlen, 0); > > +} > > + > > +int kernel_getpeername(struct socket *sock, struct sockaddr *addr, > > + int *addrlen) > > +{ > > + return sock->ops->getname(sock, addr, addrlen, 1); > > +} > > + > > +int kernel_getsockopt(struct socket *sock, int level, int optname, > > + char *optval, int *optlen) > > +{ > > + mm_segment_t oldfs = get_fs(); > > + int err; > > + > > + set_fs(KERNEL_DS); > > + if (level == SOL_SOCKET) > > + err = sock_getsockopt(sock, level, optname, optval, optlen); > > + else > > + err = sock->ops->getsockopt(sock, level, optname, optval, > > + optlen); > > + set_fs(oldfs); > > + return err; > > +} > > + > > +int kernel_setsockopt(struct socket *sock, int level, int optname, > > + char *optval, int optlen) > > +{ > > + mm_segment_t oldfs = get_fs(); > > + int err; > > + > > + set_fs(KERNEL_DS); > > + if (level == SOL_SOCKET) > > + err = sock_setsockopt(sock, level, optname, optval, optlen); > > + else > > + err = sock->ops->setsockopt(sock, level, optname, optval, > > + optlen); > > + set_fs(oldfs); > > + return err; > > +} > > + > > +int kernel_sendpage(struct socket *sock, struct page *page, int offset, > > + size_t size, int flags) > > +{ > > + if (sock->ops->sendpage) > > + return sock->ops->sendpage(sock, page, offset, size, flags); > > + > > + return sock_no_sendpage(sock, page, offset, size, flags); > > +} > > + > > +int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg) > > +{ > > + mm_segment_t oldfs = get_fs(); > > + int err; > > + > > + set_fs(KERNEL_DS); > > + err = sock->ops->ioctl(sock, cmd, arg); > > + set_fs(oldfs); > > + > > + return err; > > +} > > + > > /* ABI emulation layers need these two */ > > EXPORT_SYMBOL(move_addr_to_kernel); > > EXPORT_SYMBOL(move_addr_to_user); > > @@ -2176,3 +2279,13 @@ EXPORT_SYMBOL(sock_wake_async); > > EXPORT_SYMBOL(sockfd_lookup); > > EXPORT_SYMBOL(kernel_sendmsg); > > EXPORT_SYMBOL(kernel_recvmsg); > > +EXPORT_SYMBOL(kernel_bind); > > +EXPORT_SYMBOL(kernel_listen); > > +EXPORT_SYMBOL(kernel_accept); > > +EXPORT_SYMBOL(kernel_connect); > > +EXPORT_SYMBOL(kernel_getsockname); > > +EXPORT_SYMBOL(kernel_getpeername); > > +EXPORT_SYMBOL(kernel_getsockopt); > > +EXPORT_SYMBOL(kernel_setsockopt); > > +EXPORT_SYMBOL(kernel_sendpage); > > +EXPORT_SYMBOL(kernel_sock_ioctl); > > Please consider EXPORT_SYMBOL_GPL because this interface would be a obvious > target for binary modules writers to use.
I used EXPORT_SYMBOL() just to be consistent with the existing kernel_sendmsg() and kernel_recvmsg(). I am OK with changing them to EXPORT_SYMBOL_GPL(). Dave, I will send an updated version if you are OK with it. Thanks Sridhar - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html