|
@@ -784,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
copied += used;
|
|
|
len -= used;
|
|
|
|
|
|
- if (used + offset < skb->len)
|
|
|
- continue;
|
|
|
-
|
|
|
if (!(flags & MSG_PEEK)) {
|
|
|
sk_eat_skb(sk, skb, 0);
|
|
|
*seq = 0;
|
|
|
}
|
|
|
+
|
|
|
+ /* For non stream protcols we get one packet per recvmsg call */
|
|
|
+ if (sk->sk_type != SOCK_STREAM)
|
|
|
+ goto copy_uaddr;
|
|
|
+
|
|
|
+ /* Partial read */
|
|
|
+ if (used + offset < skb->len)
|
|
|
+ continue;
|
|
|
} while (len > 0);
|
|
|
|
|
|
- /*
|
|
|
- * According to UNIX98, msg_name/msg_namelen are ignored
|
|
|
- * on connected socket. -ANK
|
|
|
- * But... af_llc still doesn't have separate sets of methods for
|
|
|
- * SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will
|
|
|
- * eventually fix this tho :-) -acme
|
|
|
- */
|
|
|
- if (sk->sk_type == SOCK_DGRAM)
|
|
|
- goto copy_uaddr;
|
|
|
out:
|
|
|
release_sock(sk);
|
|
|
return copied;
|