@@ -669,6 +669,8 @@ static ssize_t unix_stream_splice_read(struct socket *, loff_t *ppos,
669669 unsigned int flags );
670670static int unix_dgram_sendmsg (struct socket * , struct msghdr * , size_t );
671671static int unix_dgram_recvmsg (struct socket * , struct msghdr * , size_t , int );
672+ static int unix_read_sock (struct sock * sk , read_descriptor_t * desc ,
673+ sk_read_actor_t recv_actor );
672674static int unix_dgram_connect (struct socket * , struct sockaddr * ,
673675 int , int );
674676static int unix_seqpacket_sendmsg (struct socket * , struct msghdr * , size_t );
@@ -746,6 +748,7 @@ static const struct proto_ops unix_dgram_ops = {
746748 .listen = sock_no_listen ,
747749 .shutdown = unix_shutdown ,
748750 .sendmsg = unix_dgram_sendmsg ,
751+ .read_sock = unix_read_sock ,
749752 .recvmsg = unix_dgram_recvmsg ,
750753 .mmap = sock_no_mmap ,
751754 .sendpage = sock_no_sendpage ,
@@ -2188,6 +2191,40 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
21882191 return err ;
21892192}
21902193
2194+ static int unix_read_sock (struct sock * sk , read_descriptor_t * desc ,
2195+ sk_read_actor_t recv_actor )
2196+ {
2197+ int copied = 0 ;
2198+
2199+ while (1 ) {
2200+ struct unix_sock * u = unix_sk (sk );
2201+ struct sk_buff * skb ;
2202+ int used , err ;
2203+
2204+ mutex_lock (& u -> iolock );
2205+ skb = skb_recv_datagram (sk , 0 , 1 , & err );
2206+ mutex_unlock (& u -> iolock );
2207+ if (!skb )
2208+ return err ;
2209+
2210+ used = recv_actor (desc , skb , 0 , skb -> len );
2211+ if (used <= 0 ) {
2212+ if (!copied )
2213+ copied = used ;
2214+ kfree_skb (skb );
2215+ break ;
2216+ } else if (used <= skb -> len ) {
2217+ copied += used ;
2218+ }
2219+
2220+ kfree_skb (skb );
2221+ if (!desc -> count )
2222+ break ;
2223+ }
2224+
2225+ return copied ;
2226+ }
2227+
21912228/*
21922229 * Sleep until more data has arrived. But check for races..
21932230 */
0 commit comments