@@ -946,6 +946,37 @@ TEST_F(tls, peek_and_splice)
946946 EXPECT_EQ (memcmp (mem_send , mem_recv , send_len ), 0 );
947947}
948948
949+ #define MAX_FRAGS 48
950+ TEST_F (tls , splice_short )
951+ {
952+ struct iovec sendchar_iov ;
953+ char read_buf [0x10000 ];
954+ char sendbuf [0x100 ];
955+ char sendchar = 'S' ;
956+ int pipefds [2 ];
957+ int i ;
958+
959+ sendchar_iov .iov_base = & sendchar ;
960+ sendchar_iov .iov_len = 1 ;
961+
962+ memset (sendbuf , 's' , sizeof (sendbuf ));
963+
964+ ASSERT_GE (pipe2 (pipefds , O_NONBLOCK ), 0 );
965+ ASSERT_GE (fcntl (pipefds [0 ], F_SETPIPE_SZ , (MAX_FRAGS + 1 ) * 0x1000 ), 0 );
966+
967+ for (i = 0 ; i < MAX_FRAGS ; i ++ )
968+ ASSERT_GE (vmsplice (pipefds [1 ], & sendchar_iov , 1 , 0 ), 0 );
969+
970+ ASSERT_EQ (write (pipefds [1 ], sendbuf , sizeof (sendbuf )), sizeof (sendbuf ));
971+
972+ EXPECT_EQ (splice (pipefds [0 ], NULL , self -> fd , NULL , MAX_FRAGS + 0x1000 , 0 ),
973+ MAX_FRAGS + sizeof (sendbuf ));
974+ EXPECT_EQ (recv (self -> cfd , read_buf , sizeof (read_buf ), 0 ), MAX_FRAGS + sizeof (sendbuf ));
975+ EXPECT_EQ (recv (self -> cfd , read_buf , sizeof (read_buf ), MSG_DONTWAIT ), -1 );
976+ EXPECT_EQ (errno , EAGAIN );
977+ }
978+ #undef MAX_FRAGS
979+
949980TEST_F (tls , recvmsg_single )
950981{
951982 char const * test_str = "test_recvmsg_single" ;
0 commit comments