<div dir="ltr"><p dir="ltr"><br>
29.07.2015 23:49 пользователь &quot;Pavel Emelyanov&quot; &lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt; написал:<br>
&gt;<br>
&gt; On 07/29/2015 11:24 PM, Andrey Vagin wrote:<br>
&gt;<br>
&gt; Does it pass?</p><p>No, it doesn&#39;t. We don&#39;t restore data in a socket.</p><p dir="ltr">
&gt;<br>
&gt; &gt; v2: add SOCK_NONBLOCK<br>
&gt; &gt; Signed-off-by: Andrey Vagin &lt;<a href="mailto:avagin@openvz.org" target="_blank">avagin@openvz.org</a>&gt;<br>
&gt; &gt; ---<br>
&gt; &gt;  test/zdtm.sh                              |  1 +<br>
&gt; &gt;  test/zdtm/live/static/Makefile            |  1 +<br>
&gt; &gt;  test/zdtm/live/static/socket_close_data.c | 43 +++++++++++++++++++++++++++++++<br>
&gt; &gt;  3 files changed, 45 insertions(+)<br>
&gt; &gt;  create mode 100644 test/zdtm/live/static/socket_close_data.c<br>
&gt; &gt;<br>
&gt; &gt; diff --git a/test/zdtm.sh b/test/zdtm.sh<br>
&gt; &gt; index e7c0e6f..6666ac9 100755<br>
&gt; &gt; --- a/test/zdtm.sh<br>
&gt; &gt; +++ b/test/zdtm.sh<br>
&gt; &gt; @@ -86,6 +86,7 @@ generate_test_list()<br>
&gt; &gt;               static/sock_filter<br>
&gt; &gt;               static/socket6_udp<br>
&gt; &gt;               static/socket_udplite<br>
&gt; &gt; +             static/socket_close_data<br>
&gt; &gt;               static/selfexe00<br>
&gt; &gt;               static/link10<br>
&gt; &gt;               static/unlink_fstat00<br>
&gt; &gt; diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile<br>
&gt; &gt; index 8e98ac8..b901296 100644<br>
&gt; &gt; --- a/test/zdtm/live/static/Makefile<br>
&gt; &gt; +++ b/test/zdtm/live/static/Makefile<br>
&gt; &gt; @@ -33,6 +33,7 @@ TST_NOFILE  =                               \<br>
&gt; &gt;               socket6_udp                     \<br>
&gt; &gt;               socket_udplite                  \<br>
&gt; &gt;               socket_aio                      \<br>
&gt; &gt; +             socket_close_data               \<br>
&gt; &gt;               packet_sock                     \<br>
&gt; &gt;               packet_sock_mmap                \<br>
&gt; &gt;               sock_filter                     \<br>
&gt; &gt; diff --git a/test/zdtm/live/static/socket_close_data.c b/test/zdtm/live/static/socket_close_data.c<br>
&gt; &gt; new file mode 100644<br>
&gt; &gt; index 0000000..a23eff6<br>
&gt; &gt; --- /dev/null<br>
&gt; &gt; +++ b/test/zdtm/live/static/socket_close_data.c<br>
&gt; &gt; @@ -0,0 +1,43 @@<br>
&gt; &gt; +#include &lt;errno.h&gt;<br>
&gt; &gt; +#include &lt;stdlib.h&gt;<br>
&gt; &gt; +#include &lt;string.h&gt;<br>
&gt; &gt; +#include &lt;sys/types.h&gt;<br>
&gt; &gt; +#include &lt;sys/socket.h&gt;<br>
&gt; &gt; +<br>
&gt; &gt; +#include &quot;zdtmtst.h&quot;<br>
&gt; &gt; +<br>
&gt; &gt; +const char *test_doc = &quot;Check one end of socketpair with data&quot;;<br>
&gt; &gt; +const char *test_author      = &quot;Andrew Vagin &lt;<a href="mailto:avagin@openvz.org" target="_blank">avagin@openvz.org</a>&quot;;<br>
&gt; &gt; +<br>
&gt; &gt; +#define MSG &quot;hello&quot;<br>
&gt; &gt; +int main(int argc, char **argv)<br>
&gt; &gt; +{<br>
&gt; &gt; +     int sks[2], ret;<br>
&gt; &gt; +     char buf[1024];<br>
&gt; &gt; +<br>
&gt; &gt; +     test_init(argc, argv);<br>
&gt; &gt; +<br>
&gt; &gt; +     if (socketpair(PF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0, sks) &lt; 0) {<br>
&gt; &gt; +             err(&quot;socketpair&quot;);<br>
&gt; &gt; +             return 1;<br>
&gt; &gt; +     }<br>
&gt; &gt; +<br>
&gt; &gt; +     if (write(sks[1], MSG, sizeof(MSG)) != sizeof(MSG)) {<br>
&gt; &gt; +             err(&quot;write&quot;);<br>
&gt; &gt; +             return 1;<br>
&gt; &gt; +     }<br>
&gt; &gt; +     close(sks[1]);<br>
&gt; &gt; +<br>
&gt; &gt; +     test_daemon();<br>
&gt; &gt; +     test_waitsig();<br>
&gt; &gt; +<br>
&gt; &gt; +     ret = read(sks[0], buf, sizeof(MSG));<br>
&gt; &gt; +     buf[ret &gt; 0 ? ret : 0] = 0;<br>
&gt; &gt; +     if (ret != sizeof(MSG)) {<br>
&gt; &gt; +             fail(&quot;%d: %s&quot;, ret, buf);<br>
&gt; &gt; +             return 1;<br>
&gt; &gt; +     }<br>
&gt; &gt; +<br>
&gt; &gt; +     pass();<br>
&gt; &gt; +     return 0;<br>
&gt; &gt; +}<br>
&gt; &gt;<br>
&gt;<br>
</p>
</div>