Message ID | 20200912224431.1428-14-luoyonggang@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | W32, W64 msys2/mingw patches | expand |
On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <thuth@redhat.com> wrote: > > On 13/09/2020 00.44, Yonggang Luo wrote: > > Fixes following tests on msys2/mingw > > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', > > tasn1, crypto], > > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', > > tasn1, crypto], > > 'test-io-channel-tls': ['io-channel-helpers.c', 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', > > tasn1, io, crypto]} > > These tests are failure with: > > ERROR test-crypto-tlscredsx509 - missing test plan > > ERROR test-crypto-tlssession - missing test plan > > ERROR test-io-channel-tls - missing test plan > > > > Because on win32 those test case are all disabled in the header > > > > Add qemu_socket_pair for cross platform support, convert file system > > handling functions to glib > > Add qemu_link function instead posix only link function. > > Use send ad recv from qemu that convert Windows Socks error > > to errno properly. > > > > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> > > --- > [...] > > +static int __stream_socketpair(struct addrinfo* addr_info, int sock[2]){ > > + SOCKET listener, client, server; > > + int opt = 1; > > + > > + listener = server = client = INVALID_SOCKET; > > + listener = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); > > + if (INVALID_SOCKET == listener) > > + goto fail; > > + > > + setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,(const char*)&opt, sizeof(opt)); > > + > > + if(SOCKET_ERROR == bind(listener, addr_info->ai_addr, addr_info->ai_addrlen)) > > + goto fail; > > + > > + if (SOCKET_ERROR == getsockname(listener, addr_info->ai_addr, (int*)&addr_info->ai_addrlen)) > > + goto fail; > > + > > + if(SOCKET_ERROR == listen(listener, 5)) > > + goto fail; > > + > > + client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); > > + > > + if (INVALID_SOCKET == client) > > + goto fail; > > + > > + if (SOCKET_ERROR == connect(client,addr_info->ai_addr,addr_info->ai_addrlen)) > > + goto fail; > > + > > + server = accept(listener, 0, 0); > > + > > + if (INVALID_SOCKET == server) > > + goto fail; > > + > > + closesocket(listener); > > + > > + sock[0] = client; > > + sock[1] = server; > > + > > + return 0; > > +fail: > > + if(INVALID_SOCKET!=listener) > > + closesocket(listener); > > + if (INVALID_SOCKET!=client) > > + closesocket(client); > > + return -1; > > +} > > + > > +static int __dgram_socketpair(struct addrinfo* addr_info, int sock[2]) > > +{ > > + SOCKET client, server; > > + struct addrinfo addr, *result = NULL; > > + const char* address; > > + int opt = 1; > > + > > + server = client = INVALID_SOCKET; > > + > > + server = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); > > + if (INVALID_SOCKET == server) > > + goto fail; > > + > > + setsockopt(server, SOL_SOCKET,SO_REUSEADDR, (const char*)&opt, sizeof(opt)); > > + > > + if(SOCKET_ERROR == bind(server, addr_info->ai_addr, addr_info->ai_addrlen)) > > + goto fail; > > + > > + if (SOCKET_ERROR == getsockname(server, addr_info->ai_addr, (int*)&addr_info->ai_addrlen)) > > + goto fail; > > + > > + client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); > > + if (INVALID_SOCKET == client) > > + goto fail; > > + > > + memset(&addr,0,sizeof(addr)); > > + addr.ai_family = addr_info->ai_family; > > + addr.ai_socktype = addr_info->ai_socktype; > > + addr.ai_protocol = addr_info->ai_protocol; > > + > > + if (AF_INET6==addr.ai_family) > > + address = "0:0:0:0:0:0:0:1"; > > + else > > + address = "127.0.0.1"; > > + > > + if (getaddrinfo(address, "0", &addr, &result)) > > + goto fail; > > + > > + setsockopt(client,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt)); > > + if(SOCKET_ERROR == bind(client, result->ai_addr, result->ai_addrlen)) > > + goto fail; > > + > > + if (SOCKET_ERROR == getsockname(client, result->ai_addr, (int*)&result->ai_addrlen)) > > + goto fail; > > + > > + if (SOCKET_ERROR == connect(server, result->ai_addr, result->ai_addrlen)) > > + goto fail; > > + > > + if (SOCKET_ERROR == connect(client, addr_info->ai_addr, addr_info->ai_addrlen)) > > + goto fail; > > + > > + freeaddrinfo(result); > > + sock[0] = client; > > + sock[1] = server; > > + return 0; > > + > > +fail: > > + if (INVALID_SOCKET!=client) > > + closesocket(client); > > + if (INVALID_SOCKET!=server) > > + closesocket(server); > > + if (result) > > + freeaddrinfo(result); > > + return -1; > > +} > > + > > +int qemu_socketpair(int family, int type, int protocol,int recv[2]){ > > + const char* address; > > + struct addrinfo addr_info,*p_addrinfo; > > + int result = -1; > > + > > + if (family == AF_UNIX) > > + { > > + family = AF_INET; > > + } > > + > > + memset(&addr_info, 0, sizeof(addr_info)); > > + addr_info.ai_family = family; > > + addr_info.ai_socktype = type; > > + addr_info.ai_protocol = protocol; > > + if (AF_INET6==family) > > + address = "0:0:0:0:0:0:0:1"; > > + else > > + address = "127.0.0.1"; > > + > > + if (0 == getaddrinfo(address, "0", &addr_info, &p_addrinfo)){ > > + if (SOCK_STREAM == type) > > + result = __stream_socketpair(p_addrinfo, recv); > > + else if(SOCK_DGRAM == type) > > + result = __dgram_socketpair(p_addrinfo, recv); > > + freeaddrinfo(p_addrinfo); > > + } > > + return result; > > +} > > Where do you've got this code from? It seems like this has been taken > from a 3rd party source? E.g.: > > https://blog.csdn.net/wufuhuai/article/details/79761889 > > What's the license of this new code? ... please clarify such details in The original code have no license information, neither copyleft nor copyright, what's your suggestion or rewrite it? > > the commit description. > > Thanks, > Thomas > -- 此致 礼 罗勇刚 Yours sincerely, Yonggang Luo <div dir="ltr"><br><br>On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <<a href="mailto:thuth@redhat.com">thuth@redhat.com</a>> wrote:<br>><br>> On 13/09/2020 00.44, Yonggang Luo wrote:<br>> > Fixes following tests on msys2/mingw<br>> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',<br>> > tasn1, crypto],<br>> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c',<br>> > tasn1, crypto],<br>> > 'test-io-channel-tls': ['io-channel-helpers.c', 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',<br>> > tasn1, io, crypto]}<br>> > These tests are failure with:<br>> > ERROR test-crypto-tlscredsx509 - missing test plan<br>> > ERROR test-crypto-tlssession - missing test plan<br>> > ERROR test-io-channel-tls - missing test plan<br>> ><br>> > Because on win32 those test case are all disabled in the header<br>> ><br>> > Add qemu_socket_pair for cross platform support, convert file system<br>> > handling functions to glib<br>> > Add qemu_link function instead posix only link function.<br>> > Use send ad recv from qemu that convert Windows Socks error<br>> > to errno properly.<br>> ><br>> > Signed-off-by: Yonggang Luo <<a href="mailto:luoyonggang@gmail.com">luoyonggang@gmail.com</a>><br>> > ---<br>> [...]<br>> > +static int __stream_socketpair(struct addrinfo* addr_info, int sock[2]){<br>> > + SOCKET listener, client, server;<br>> > + int opt = 1;<br>> > +<br>> > + listener = server = client = INVALID_SOCKET;<br>> > + listener = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol);<br>> > + if (INVALID_SOCKET == listener)<br>> > + goto fail;<br>> > +<br>> > + setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,(const char*)&opt, sizeof(opt));<br>> > +<br>> > + if(SOCKET_ERROR == bind(listener, addr_info->ai_addr, addr_info->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + if (SOCKET_ERROR == getsockname(listener, addr_info->ai_addr, (int*)&addr_info->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + if(SOCKET_ERROR == listen(listener, 5))<br>> > + goto fail;<br>> > +<br>> > + client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol);<br>> > +<br>> > + if (INVALID_SOCKET == client)<br>> > + goto fail;<br>> > +<br>> > + if (SOCKET_ERROR == connect(client,addr_info->ai_addr,addr_info->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + server = accept(listener, 0, 0);<br>> > +<br>> > + if (INVALID_SOCKET == server)<br>> > + goto fail;<br>> > +<br>> > + closesocket(listener);<br>> > +<br>> > + sock[0] = client;<br>> > + sock[1] = server;<br>> > +<br>> > + return 0;<br>> > +fail:<br>> > + if(INVALID_SOCKET!=listener)<br>> > + closesocket(listener);<br>> > + if (INVALID_SOCKET!=client)<br>> > + closesocket(client);<br>> > + return -1;<br>> > +}<br>> > +<br>> > +static int __dgram_socketpair(struct addrinfo* addr_info, int sock[2])<br>> > +{<br>> > + SOCKET client, server;<br>> > + struct addrinfo addr, *result = NULL;<br>> > + const char* address;<br>> > + int opt = 1;<br>> > +<br>> > + server = client = INVALID_SOCKET;<br>> > +<br>> > + server = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); <br>> > + if (INVALID_SOCKET == server)<br>> > + goto fail;<br>> > +<br>> > + setsockopt(server, SOL_SOCKET,SO_REUSEADDR, (const char*)&opt, sizeof(opt));<br>> > +<br>> > + if(SOCKET_ERROR == bind(server, addr_info->ai_addr, addr_info->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + if (SOCKET_ERROR == getsockname(server, addr_info->ai_addr, (int*)&addr_info->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol);<br>> > + if (INVALID_SOCKET == client)<br>> > + goto fail;<br>> > +<br>> > + memset(&addr,0,sizeof(addr));<br>> > + addr.ai_family = addr_info->ai_family;<br>> > + addr.ai_socktype = addr_info->ai_socktype;<br>> > + addr.ai_protocol = addr_info->ai_protocol;<br>> > +<br>> > + if (AF_INET6==addr.ai_family)<br>> > + address = "0:0:0:0:0:0:0:1";<br>> > + else<br>> > + address = "127.0.0.1";<br>> > +<br>> > + if (getaddrinfo(address, "0", &addr, &result))<br>> > + goto fail;<br>> > +<br>> > + setsockopt(client,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt));<br>> > + if(SOCKET_ERROR == bind(client, result->ai_addr, result->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + if (SOCKET_ERROR == getsockname(client, result->ai_addr, (int*)&result->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + if (SOCKET_ERROR == connect(server, result->ai_addr, result->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + if (SOCKET_ERROR == connect(client, addr_info->ai_addr, addr_info->ai_addrlen))<br>> > + goto fail;<br>> > +<br>> > + freeaddrinfo(result);<br>> > + sock[0] = client;<br>> > + sock[1] = server;<br>> > + return 0;<br>> > +<br>> > +fail:<br>> > + if (INVALID_SOCKET!=client)<br>> > + closesocket(client);<br>> > + if (INVALID_SOCKET!=server)<br>> > + closesocket(server);<br>> > + if (result)<br>> > + freeaddrinfo(result);<br>> > + return -1;<br>> > +}<br>> > +<br>> > +int qemu_socketpair(int family, int type, int protocol,int recv[2]){<br>> > + const char* address;<br>> > + struct addrinfo addr_info,*p_addrinfo;<br>> > + int result = -1;<br>> > +<br>> > + if (family == AF_UNIX)<br>> > + {<br>> > + family = AF_INET;<br>> > + }<br>> > +<br>> > + memset(&addr_info, 0, sizeof(addr_info));<br>> > + addr_info.ai_family = family;<br>> > + addr_info.ai_socktype = type;<br>> > + addr_info.ai_protocol = protocol;<br>> > + if (AF_INET6==family)<br>> > + address = "0:0:0:0:0:0:0:1";<br>> > + else<br>> > + address = "127.0.0.1";<br>> > +<br>> > + if (0 == getaddrinfo(address, "0", &addr_info, &p_addrinfo)){<br>> > + if (SOCK_STREAM == type)<br>> > + result = __stream_socketpair(p_addrinfo, recv);<br>> > + else if(SOCK_DGRAM == type)<br>> > + result = __dgram_socketpair(p_addrinfo, recv);<br>> > + freeaddrinfo(p_addrinfo);<br>> > + }<br>> > + return result;<br>> > +}<br>><br>> Where do you've got this code from? It seems like this has been taken<br>> from a 3rd party source? E.g.:<br>><br>> <a href="https://blog.csdn.net/wufuhuai/article/details/79761889">https://blog.csdn.net/wufuhuai/article/details/79761889</a><br>><br>> What's the license of this new code? ... please clarify such details in<br>The original code have no license information, neither copyleft nor copyright, what's your suggestion<div>or rewrite it?<br> <br>><br>> the commit description.<br>><br>> Thanks,<br>> Thomas<br>><br><br><br>--<br> 此致<br>礼<br>罗勇刚<br>Yours<br> sincerely,<br>Yonggang Luo</div></div>
On 14/09/2020 10.19, 罗勇刚(Yonggang Luo) wrote: > > > On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <thuth@redhat.com > <mailto:thuth@redhat.com>> wrote: >> >> On 13/09/2020 00.44, Yonggang Luo wrote: >> > Fixes following tests on msys2/mingw >> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', > 'pkix_asn1_tab.c', >> > tasn1, crypto], >> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', > 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', >> > tasn1, crypto], >> > 'test-io-channel-tls': ['io-channel-helpers.c', > 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', >> > tasn1, io, crypto]} >> > These tests are failure with: >> > ERROR test-crypto-tlscredsx509 - missing test plan >> > ERROR test-crypto-tlssession - missing test plan >> > ERROR test-io-channel-tls - missing test plan >> > >> > Because on win32 those test case are all disabled in the header >> > >> > Add qemu_socket_pair for cross platform support, convert file system >> > handling functions to glib >> > Add qemu_link function instead posix only link function. >> > Use send ad recv from qemu that convert Windows Socks error >> > to errno properly. >> > >> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com > <mailto:luoyonggang@gmail.com>> >> > --- [...] >> Where do you've got this code from? It seems like this has been taken >> from a 3rd party source? E.g.: >> >> https://blog.csdn.net/wufuhuai/article/details/79761889 >> >> What's the license of this new code? ... please clarify such details in >> the commit description. > > The original code have no license information, neither copyleft nor > copyright, what's your suggestion > or rewrite it? > You can not simply copy code without license information and submit this as if it was your own! Please never do that again! With your Signed-off-by line, you basically acknowledge that you've read and followed the Developer Certificate of Origin: https://developercertificate.org/ If you haven't done that yet, please do it now! And for this patch here, I don't think that it is acceptable without proper license information. Thomas
On Mon, Sep 14, 2020 at 7:07 PM Thomas Huth <thuth@redhat.com> wrote: > > On 14/09/2020 10.19, 罗勇刚(Yonggang Luo) wrote: > > > > > > On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <thuth@redhat.com > > <mailto:thuth@redhat.com>> wrote: > >> > >> On 13/09/2020 00.44, Yonggang Luo wrote: > >> > Fixes following tests on msys2/mingw > >> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', > > 'pkix_asn1_tab.c', > >> > tasn1, crypto], > >> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', > > 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', > >> > tasn1, crypto], > >> > 'test-io-channel-tls': ['io-channel-helpers.c', > > 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', > >> > tasn1, io, crypto]} > >> > These tests are failure with: > >> > ERROR test-crypto-tlscredsx509 - missing test plan > >> > ERROR test-crypto-tlssession - missing test plan > >> > ERROR test-io-channel-tls - missing test plan > >> > > >> > Because on win32 those test case are all disabled in the header > >> > > >> > Add qemu_socket_pair for cross platform support, convert file system > >> > handling functions to glib > >> > Add qemu_link function instead posix only link function. > >> > Use send ad recv from qemu that convert Windows Socks error > >> > to errno properly. > >> > > >> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com > > <mailto:luoyonggang@gmail.com>> > >> > --- > [...] > >> Where do you've got this code from? It seems like this has been taken > >> from a 3rd party source? E.g.: > >> > >> https://blog.csdn.net/wufuhuai/article/details/79761889 > >> > >> What's the license of this new code? ... please clarify such details in > >> the commit description. > > > > The original code have no license information, neither copyleft nor > > copyright, what's your suggestion > > or rewrite it? > > > > You can not simply copy code without license information and submit this > as if it was your own! Please never do that again! > With your Signed-off-by line, you basically acknowledge that you've read > and followed the Developer Certificate of Origin: > > https://developercertificate.org/ > > If you haven't done that yet, please do it now! > > And for this patch here, I don't think that it is acceptable without > proper license information. > > Thomas > See that, How about using https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file to act as socketpair? and it's cross-platform, I don't need to add platform-dependent codes. -- 此致 礼 罗勇刚 Yours sincerely, Yonggang Luo <div dir="ltr"><br><br>On Mon, Sep 14, 2020 at 7:07 PM Thomas Huth <<a href="mailto:thuth@redhat.com">thuth@redhat.com</a>> wrote:<br>><br>> On 14/09/2020 10.19, 罗勇刚(Yonggang Luo) wrote:<br>> ><br>> ><br>> > On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <<a href="mailto:thuth@redhat.com">thuth@redhat.com</a><br>> > <mailto:<a href="mailto:thuth@redhat.com">thuth@redhat.com</a>>> wrote:<br>> >><br>> >> On 13/09/2020 00.44, Yonggang Luo wrote:<br>> >> > Fixes following tests on msys2/mingw<br>> >> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c',<br>> > 'pkix_asn1_tab.c',<br>> >> > tasn1, crypto],<br>> >> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c',<br>> > 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c',<br>> >> > tasn1, crypto],<br>> >> > 'test-io-channel-tls': ['io-channel-helpers.c',<br>> > 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',<br>> >> > tasn1, io, crypto]}<br>> >> > These tests are failure with:<br>> >> > ERROR test-crypto-tlscredsx509 - missing test plan<br>> >> > ERROR test-crypto-tlssession - missing test plan<br>> >> > ERROR test-io-channel-tls - missing test plan<br>> >> ><br>> >> > Because on win32 those test case are all disabled in the header<br>> >> ><br>> >> > Add qemu_socket_pair for cross platform support, convert file system<br>> >> > handling functions to glib<br>> >> > Add qemu_link function instead posix only link function.<br>> >> > Use send ad recv from qemu that convert Windows Socks error<br>> >> > to errno properly.<br>> >> ><br>> >> > Signed-off-by: Yonggang Luo <<a href="mailto:luoyonggang@gmail.com">luoyonggang@gmail.com</a><br>> > <mailto:<a href="mailto:luoyonggang@gmail.com">luoyonggang@gmail.com</a>>><br>> >> > ---<br>> [...]<br>> >> Where do you've got this code from? It seems like this has been taken<br>> >> from a 3rd party source? E.g.:<br>> >><br>> >> <a href="https://blog.csdn.net/wufuhuai/article/details/79761889">https://blog.csdn.net/wufuhuai/article/details/79761889</a><br>> >><br>> >> What's the license of this new code? ... please clarify such details in<br>> >> the commit description.<br>> ><br>> > The original code have no license information, neither copyleft nor<br>> > copyright, what's your suggestion<br>> > or rewrite it?<br>> > <br>><br>> You can not simply copy code without license information and submit this<br>> as if it was your own! Please never do that again!<br>> With your Signed-off-by line, you basically acknowledge that you've read<br>> and followed the Developer Certificate of Origin:<br>><br>> <a href="https://developercertificate.org/">https://developercertificate.org/</a><br>><br>> If you haven't done that yet, please do it now!<br>><br>> And for this patch here, I don't think that it is acceptable without<br>> proper license information.<br>><br>> Thomas<br>><br>See that, How about using <a href="https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file">https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file</a><div>to act as socketpair? and it's cross-platform, I don't need to add platform-dependent codes.<br><br>--<br> 此致<br>礼<br>罗勇刚<br>Yours<br> sincerely,<br>Yonggang Luo</div></div>
On Mon, Sep 14, 2020 at 11:58:24PM +0800, 罗勇刚(Yonggang Luo) wrote: > On Mon, Sep 14, 2020 at 7:07 PM Thomas Huth <thuth@redhat.com> wrote: > > > > On 14/09/2020 10.19, 罗勇刚(Yonggang Luo) wrote: > > > > > > > > > On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <thuth@redhat.com > > > <mailto:thuth@redhat.com>> wrote: > > >> > > >> On 13/09/2020 00.44, Yonggang Luo wrote: > > >> > Fixes following tests on msys2/mingw > > >> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', > > > 'pkix_asn1_tab.c', > > >> > tasn1, crypto], > > >> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', > > > 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', > > >> > tasn1, crypto], > > >> > 'test-io-channel-tls': ['io-channel-helpers.c', > > > 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', > > >> > tasn1, io, crypto]} > > >> > These tests are failure with: > > >> > ERROR test-crypto-tlscredsx509 - missing test plan > > >> > ERROR test-crypto-tlssession - missing test plan > > >> > ERROR test-io-channel-tls - missing test plan > > >> > > > >> > Because on win32 those test case are all disabled in the header > > >> > > > >> > Add qemu_socket_pair for cross platform support, convert file system > > >> > handling functions to glib > > >> > Add qemu_link function instead posix only link function. > > >> > Use send ad recv from qemu that convert Windows Socks error > > >> > to errno properly. > > >> > > > >> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com > > > <mailto:luoyonggang@gmail.com>> > > >> > --- > > [...] > > >> Where do you've got this code from? It seems like this has been taken > > >> from a 3rd party source? E.g.: > > >> > > >> https://blog.csdn.net/wufuhuai/article/details/79761889 > > >> > > >> What's the license of this new code? ... please clarify such details in > > >> the commit description. > > > > > > The original code have no license information, neither copyleft nor > > > copyright, what's your suggestion > > > or rewrite it? > > > > > > > You can not simply copy code without license information and submit this > > as if it was your own! Please never do that again! > > With your Signed-off-by line, you basically acknowledge that you've read > > and followed the Developer Certificate of Origin: > > > > https://developercertificate.org/ > > > > If you haven't done that yet, please do it now! > > > > And for this patch here, I don't think that it is acceptable without > > proper license information. > > > > Thomas > > > See that, How about using > https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file > to act as socketpair? and it's cross-platform, I don't need to add > platform-dependent codes. That doesn't provide socketpair functionality. QEMU already has its QIOChannel impl that is more advanced, but again that doesn't have socketpair either because Windows lacks that. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
On Tue, Sep 15, 2020 at 12:14 AM Daniel P. Berrangé <berrange@redhat.com> wrote: > > On Mon, Sep 14, 2020 at 11:58:24PM +0800, 罗勇刚(Yonggang Luo) wrote: > > On Mon, Sep 14, 2020 at 7:07 PM Thomas Huth <thuth@redhat.com> wrote: > > > > > > On 14/09/2020 10.19, 罗勇刚(Yonggang Luo) wrote: > > > > > > > > > > > > On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <thuth@redhat.com > > > > <mailto:thuth@redhat.com>> wrote: > > > >> > > > >> On 13/09/2020 00.44, Yonggang Luo wrote: > > > >> > Fixes following tests on msys2/mingw > > > >> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', > > > > 'pkix_asn1_tab.c', > > > >> > tasn1, crypto], > > > >> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', > > > > 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', > > > >> > tasn1, crypto], > > > >> > 'test-io-channel-tls': ['io-channel-helpers.c', > > > > 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', > > > >> > tasn1, io, crypto]} > > > >> > These tests are failure with: > > > >> > ERROR test-crypto-tlscredsx509 - missing test plan > > > >> > ERROR test-crypto-tlssession - missing test plan > > > >> > ERROR test-io-channel-tls - missing test plan > > > >> > > > > >> > Because on win32 those test case are all disabled in the header > > > >> > > > > >> > Add qemu_socket_pair for cross platform support, convert file system > > > >> > handling functions to glib > > > >> > Add qemu_link function instead posix only link function. > > > >> > Use send ad recv from qemu that convert Windows Socks error > > > >> > to errno properly. > > > >> > > > > >> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com > > > > <mailto:luoyonggang@gmail.com>> > > > >> > --- > > > [...] > > > >> Where do you've got this code from? It seems like this has been taken > > > >> from a 3rd party source? E.g.: > > > >> > > > >> https://blog.csdn.net/wufuhuai/article/details/79761889 > > > >> > > > >> What's the license of this new code? ... please clarify such details in > > > >> the commit description. > > > > > > > > The original code have no license information, neither copyleft nor > > > > copyright, what's your suggestion > > > > or rewrite it? > > > > > > > > > > You can not simply copy code without license information and submit this > > > as if it was your own! Please never do that again! > > > With your Signed-off-by line, you basically acknowledge that you've read > > > and followed the Developer Certificate of Origin: > > > > > > https://developercertificate.org/ > > > > > > If you haven't done that yet, please do it now! > > > > > > And for this patch here, I don't think that it is acceptable without > > > proper license information. > > > > > > Thomas > > > > > See that, How about using > > https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file > > to act as socketpair? and it's cross-platform, I don't need to add > > platform-dependent codes. > > That doesn't provide socketpair functionality. QEMU already has its > QIOChannel impl that is more advanced, but again that doesn't have > socketpair either because Windows lacks that. Doesn't need the socketpair functionality, we just need two FIFO, and handle the fifo full empty by raising EAGAIN error at ``` static ssize_t testWrite(const char *buf, size_t len, void *opaque) { int *fd = opaque; int written = send(*fd, buf, len, 0); return written; } static ssize_t testRead(char *buf, size_t len, void *opaque) { int *fd = opaque; int readed = recv(*fd, buf, len, 0); return readed; } ``` > > Regards, > Daniel > -- > |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| > |: https://libvirt.org -o- https://fstop138.berrange.com :| > |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| > -- 此致 礼 罗勇刚 Yours sincerely, Yonggang Luo <div dir="ltr"><br><br>On Tue, Sep 15, 2020 at 12:14 AM Daniel P. Berrangé <<a href="mailto:berrange@redhat.com">berrange@redhat.com</a>> wrote:<br>><br>> On Mon, Sep 14, 2020 at 11:58:24PM +0800, 罗勇刚(Yonggang Luo) wrote:<br>> > On Mon, Sep 14, 2020 at 7:07 PM Thomas Huth <<a href="mailto:thuth@redhat.com">thuth@redhat.com</a>> wrote:<br>> > ><br>> > > On 14/09/2020 10.19, 罗勇刚(Yonggang Luo) wrote:<br>> > > ><br>> > > ><br>> > > > On Mon, Sep 14, 2020 at 3:23 PM Thomas Huth <<a href="mailto:thuth@redhat.com">thuth@redhat.com</a><br>> > > > <mailto:<a href="mailto:thuth@redhat.com">thuth@redhat.com</a>>> wrote:<br>> > > >><br>> > > >> On 13/09/2020 00.44, Yonggang Luo wrote:<br>> > > >> > Fixes following tests on msys2/mingw<br>> > > >> > 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c',<br>> > > > 'pkix_asn1_tab.c',<br>> > > >> > tasn1, crypto],<br>> > > >> > 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c',<br>> > > > 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c',<br>> > > >> > tasn1, crypto],<br>> > > >> > 'test-io-channel-tls': ['io-channel-helpers.c',<br>> > > > 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',<br>> > > >> > tasn1, io, crypto]}<br>> > > >> > These tests are failure with:<br>> > > >> > ERROR test-crypto-tlscredsx509 - missing test plan<br>> > > >> > ERROR test-crypto-tlssession - missing test plan<br>> > > >> > ERROR test-io-channel-tls - missing test plan<br>> > > >> ><br>> > > >> > Because on win32 those test case are all disabled in the header<br>> > > >> ><br>> > > >> > Add qemu_socket_pair for cross platform support, convert file system<br>> > > >> > handling functions to glib<br>> > > >> > Add qemu_link function instead posix only link function.<br>> > > >> > Use send ad recv from qemu that convert Windows Socks error<br>> > > >> > to errno properly.<br>> > > >> ><br>> > > >> > Signed-off-by: Yonggang Luo <<a href="mailto:luoyonggang@gmail.com">luoyonggang@gmail.com</a><br>> > > > <mailto:<a href="mailto:luoyonggang@gmail.com">luoyonggang@gmail.com</a>>><br>> > > >> > ---<br>> > > [...]<br>> > > >> Where do you've got this code from? It seems like this has been taken<br>> > > >> from a 3rd party source? E.g.:<br>> > > >><br>> > > >> <a href="https://blog.csdn.net/wufuhuai/article/details/79761889">https://blog.csdn.net/wufuhuai/article/details/79761889</a><br>> > > >><br>> > > >> What's the license of this new code? ... please clarify such details in<br>> > > >> the commit description.<br>> > > ><br>> > > > The original code have no license information, neither copyleft nor<br>> > > > copyright, what's your suggestion<br>> > > > or rewrite it?<br>> > > ><br>> > ><br>> > > You can not simply copy code without license information and submit this<br>> > > as if it was your own! Please never do that again!<br>> > > With your Signed-off-by line, you basically acknowledge that you've read<br>> > > and followed the Developer Certificate of Origin:<br>> > ><br>> > > <a href="https://developercertificate.org/">https://developercertificate.org/</a><br>> > ><br>> > > If you haven't done that yet, please do it now!<br>> > ><br>> > > And for this patch here, I don't think that it is acceptable without<br>> > > proper license information.<br>> > ><br>> > > Thomas<br>> > ><br>> > See that, How about using<br>> > <a href="https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file">https://developer.gnome.org/glib/stable/glib-IO-Channels.html#g-io-channel-new-file</a><br>> > to act as socketpair? and it's cross-platform, I don't need to add<br>> > platform-dependent codes.<br>><br>> That doesn't provide socketpair functionality. QEMU already has its<br>> QIOChannel impl that is more advanced, but again that doesn't have<br>> socketpair either because Windows lacks that.<br><br>Doesn't need the socketpair functionality, we just need two FIFO, and handle the fifo full empty by raising <br>EAGAIN error at<br>```<br>static ssize_t testWrite(const char *buf, size_t len, void *opaque)<br>{<br> int *fd = opaque;<br> int written = send(*fd, buf, len, 0);<br> return written;<br>}<br><br>static ssize_t testRead(char *buf, size_t len, void *opaque)<br>{<br> int *fd = opaque;<br><br> int readed = recv(*fd, buf, len, 0);<br> return readed;<br>}<br>```<br>><br>> Regards,<br>> Daniel<br>> --<br>> |: <a href="https://berrange.com">https://berrange.com</a> -o- <a href="https://www.flickr.com/photos/dberrange">https://www.flickr.com/photos/dberrange</a> :|<br>> |: <a href="https://libvirt.org">https://libvirt.org</a> -o- <a href="https://fstop138.berrange.com">https://fstop138.berrange.com</a> :|<br>> |: <a href="https://entangle-photo.org">https://entangle-photo.org</a> -o- <a href="https://www.instagram.com/dberrange">https://www.instagram.com/dberrange</a> :|<br>><br><br><br>--<br> 此致<br>礼<br>罗勇刚<br>Yours<br> sincerely,<br>Yonggang Luo</div>
diff --git a/tests/crypto-tls-x509-helpers.c b/tests/crypto-tls-x509-helpers.c index 01b3daf358..c624d8799b 100644 --- a/tests/crypto-tls-x509-helpers.c +++ b/tests/crypto-tls-x509-helpers.c @@ -23,6 +23,8 @@ #include "crypto-tls-x509-helpers.h" #include "crypto/init.h" #include "qemu/sockets.h" +#include <glib.h> +#include <glib/gstdio.h> #ifdef QCRYPTO_HAVE_TLS_TEST_SUPPORT @@ -133,7 +135,7 @@ void test_tls_init(const char *keyfile) void test_tls_cleanup(const char *keyfile) { asn1_delete_structure(&pkix_asn1); - unlink(keyfile); + g_remove(keyfile); } /* @@ -501,8 +503,171 @@ void test_tls_discard_cert(QCryptoTLSTestCertReq *req) req->crt = NULL; if (getenv("QEMU_TEST_DEBUG_CERTS") == NULL) { - unlink(req->filename); + g_remove(req->filename); } } +int qemu_link(const char *exist_path1, const char *new_path2) +{ +#ifdef _WIN32 + g_autofree gchar *current_dir = g_get_current_dir(); + g_autofree gchar *full_path = g_build_filename(current_dir, exist_path1, NULL); + return CreateSymbolicLinkA(new_path2, full_path, 0 | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE) ? 0 : -1; +#else + return link(exist_path1, new_path2); +#endif +} + +#ifdef _WIN32 + +static int __stream_socketpair(struct addrinfo* addr_info, int sock[2]){ + SOCKET listener, client, server; + int opt = 1; + + listener = server = client = INVALID_SOCKET; + listener = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); + if (INVALID_SOCKET == listener) + goto fail; + + setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,(const char*)&opt, sizeof(opt)); + + if(SOCKET_ERROR == bind(listener, addr_info->ai_addr, addr_info->ai_addrlen)) + goto fail; + + if (SOCKET_ERROR == getsockname(listener, addr_info->ai_addr, (int*)&addr_info->ai_addrlen)) + goto fail; + + if(SOCKET_ERROR == listen(listener, 5)) + goto fail; + + client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); + + if (INVALID_SOCKET == client) + goto fail; + + if (SOCKET_ERROR == connect(client,addr_info->ai_addr,addr_info->ai_addrlen)) + goto fail; + + server = accept(listener, 0, 0); + + if (INVALID_SOCKET == server) + goto fail; + + closesocket(listener); + + sock[0] = client; + sock[1] = server; + + return 0; +fail: + if(INVALID_SOCKET!=listener) + closesocket(listener); + if (INVALID_SOCKET!=client) + closesocket(client); + return -1; +} + +static int __dgram_socketpair(struct addrinfo* addr_info, int sock[2]) +{ + SOCKET client, server; + struct addrinfo addr, *result = NULL; + const char* address; + int opt = 1; + + server = client = INVALID_SOCKET; + + server = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); + if (INVALID_SOCKET == server) + goto fail; + + setsockopt(server, SOL_SOCKET,SO_REUSEADDR, (const char*)&opt, sizeof(opt)); + + if(SOCKET_ERROR == bind(server, addr_info->ai_addr, addr_info->ai_addrlen)) + goto fail; + + if (SOCKET_ERROR == getsockname(server, addr_info->ai_addr, (int*)&addr_info->ai_addrlen)) + goto fail; + + client = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); + if (INVALID_SOCKET == client) + goto fail; + + memset(&addr,0,sizeof(addr)); + addr.ai_family = addr_info->ai_family; + addr.ai_socktype = addr_info->ai_socktype; + addr.ai_protocol = addr_info->ai_protocol; + + if (AF_INET6==addr.ai_family) + address = "0:0:0:0:0:0:0:1"; + else + address = "127.0.0.1"; + + if (getaddrinfo(address, "0", &addr, &result)) + goto fail; + + setsockopt(client,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt, sizeof(opt)); + if(SOCKET_ERROR == bind(client, result->ai_addr, result->ai_addrlen)) + goto fail; + + if (SOCKET_ERROR == getsockname(client, result->ai_addr, (int*)&result->ai_addrlen)) + goto fail; + + if (SOCKET_ERROR == connect(server, result->ai_addr, result->ai_addrlen)) + goto fail; + + if (SOCKET_ERROR == connect(client, addr_info->ai_addr, addr_info->ai_addrlen)) + goto fail; + + freeaddrinfo(result); + sock[0] = client; + sock[1] = server; + return 0; + +fail: + if (INVALID_SOCKET!=client) + closesocket(client); + if (INVALID_SOCKET!=server) + closesocket(server); + if (result) + freeaddrinfo(result); + return -1; +} + +int qemu_socketpair(int family, int type, int protocol,int recv[2]){ + const char* address; + struct addrinfo addr_info,*p_addrinfo; + int result = -1; + + if (family == AF_UNIX) + { + family = AF_INET; + } + + memset(&addr_info, 0, sizeof(addr_info)); + addr_info.ai_family = family; + addr_info.ai_socktype = type; + addr_info.ai_protocol = protocol; + if (AF_INET6==family) + address = "0:0:0:0:0:0:0:1"; + else + address = "127.0.0.1"; + + if (0 == getaddrinfo(address, "0", &addr_info, &p_addrinfo)){ + if (SOCK_STREAM == type) + result = __stream_socketpair(p_addrinfo, recv); + else if(SOCK_DGRAM == type) + result = __dgram_socketpair(p_addrinfo, recv); + freeaddrinfo(p_addrinfo); + } + return result; +} + +#else + +int qemu_socketpair(int family, int type, int protocol,int recv[2]) { + return socketpair(family, type, protocol, recv); +} + +#endif + #endif /* QCRYPTO_HAVE_TLS_TEST_SUPPORT */ diff --git a/tests/crypto-tls-x509-helpers.h b/tests/crypto-tls-x509-helpers.h index 08efba4e19..75a902278c 100644 --- a/tests/crypto-tls-x509-helpers.h +++ b/tests/crypto-tls-x509-helpers.h @@ -24,8 +24,9 @@ #include <gnutls/gnutls.h> #include <gnutls/x509.h> -#if !(defined WIN32) && \ - defined(CONFIG_TASN1) +#include "qemu/osdep.h" + +#if defined(CONFIG_TASN1) # define QCRYPTO_HAVE_TLS_TEST_SUPPORT #endif @@ -127,6 +128,10 @@ void test_tls_cleanup(const char *keyfile); extern const ASN1_ARRAY_TYPE pkix_asn1_tab[]; +int qemu_link(const char *exist_path1, const char *new_path2); + +int qemu_socketpair(int family, int type, int protocol,int recv[2]); + #endif /* QCRYPTO_HAVE_TLS_TEST_SUPPORT */ #endif diff --git a/tests/test-crypto-tlscredsx509.c b/tests/test-crypto-tlscredsx509.c index f487349c32..620fbde1ca 100644 --- a/tests/test-crypto-tlscredsx509.c +++ b/tests/test-crypto-tlscredsx509.c @@ -25,6 +25,9 @@ #include "qapi/error.h" #include "qemu/module.h" +#include <glib.h> +#include <glib/gstdio.h> + #ifdef QCRYPTO_HAVE_TLS_TEST_SUPPORT #define WORKDIR "tests/test-crypto-tlscredsx509-work/" @@ -77,34 +80,34 @@ static void test_tls_creds(const void *opaque) QCryptoTLSCreds *creds; #define CERT_DIR "tests/test-crypto-tlscredsx509-certs/" - mkdir(CERT_DIR, 0700); + g_mkdir_with_parents(CERT_DIR, 0700); - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove (CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); if (data->isServer) { - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); + g_remove (CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); + g_remove (CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); } else { - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); + g_remove (CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); + g_remove (CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); } - if (access(data->cacrt, R_OK) == 0) { - g_assert(link(data->cacrt, + if (g_access(data->cacrt, R_OK) == 0) { + g_assert(qemu_link(data->cacrt, CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); } if (data->isServer) { - if (access(data->crt, R_OK) == 0) { - g_assert(link(data->crt, + if (g_access(data->crt, R_OK) == 0) { + g_assert(qemu_link(data->crt, CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT) == 0); } - g_assert(link(KEYFILE, + g_assert(qemu_link(KEYFILE, CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY) == 0); } else { - if (access(data->crt, R_OK) == 0) { - g_assert(link(data->crt, + if (g_access(data->crt, R_OK) == 0) { + g_assert(qemu_link(data->crt, CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT) == 0); } - g_assert(link(KEYFILE, + g_assert(qemu_link(KEYFILE, CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY) == 0); } @@ -121,15 +124,15 @@ static void test_tls_creds(const void *opaque) g_assert(creds != NULL); } - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); if (data->isServer) { - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); + g_remove(CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); + g_remove(CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); } else { - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); - unlink(CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); + g_remove(CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); + g_remove(CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); } - rmdir(CERT_DIR); + g_rmdir(CERT_DIR); if (creds) { object_unparent(OBJECT(creds)); } @@ -143,7 +146,7 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); g_setenv("GNUTLS_FORCE_FIPS_MODE", "2", 1); - mkdir(WORKDIR, 0700); + g_mkdir_with_parents(WORKDIR, 0700); test_tls_init(KEYFILE); @@ -699,7 +702,7 @@ int main(int argc, char **argv) test_tls_discard_cert(&cacertlevel2areq); test_tls_discard_cert(&servercertlevel3areq); test_tls_discard_cert(&clientcertlevel2breq); - unlink(WORKDIR "cacertchain-ctx.pem"); + g_remove(WORKDIR "cacertchain-ctx.pem"); test_tls_cleanup(KEYFILE); rmdir(WORKDIR); diff --git a/tests/test-crypto-tlssession.c b/tests/test-crypto-tlssession.c index 8b2453fa79..f726219593 100644 --- a/tests/test-crypto-tlssession.c +++ b/tests/test-crypto-tlssession.c @@ -28,9 +28,13 @@ #include "qom/object_interfaces.h" #include "qapi/error.h" #include "qemu/module.h" +#include "qemu/main-loop.h" #include "qemu/sockets.h" #include "authz/list.h" +#include <glib.h> +#include <glib/gstdio.h> + #ifdef QCRYPTO_HAVE_TLS_TEST_SUPPORT #define WORKDIR "tests/test-crypto-tlssession-work/" @@ -40,15 +44,16 @@ static ssize_t testWrite(const char *buf, size_t len, void *opaque) { int *fd = opaque; - - return write(*fd, buf, len); + int written = send(*fd, buf, len, 0); + return written; } static ssize_t testRead(char *buf, size_t len, void *opaque) { int *fd = opaque; - return read(*fd, buf, len); + int readed = recv(*fd, buf, len, 0); + return readed; } static QCryptoTLSCreds *test_tls_creds_psk_create( @@ -84,7 +89,7 @@ static void test_crypto_tls_session_psk(void) int ret; /* We'll use this for our fake client-server connection */ - ret = socketpair(AF_UNIX, SOCK_STREAM, 0, channel); + ret = qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, channel); g_assert(ret == 0); /* @@ -238,7 +243,7 @@ static void test_crypto_tls_session_x509(const void *opaque) int ret; /* We'll use this for our fake client-server connection */ - ret = socketpair(AF_UNIX, SOCK_STREAM, 0, channel); + ret = qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, channel); g_assert(ret == 0); /* @@ -251,29 +256,29 @@ static void test_crypto_tls_session_x509(const void *opaque) #define CLIENT_CERT_DIR "tests/test-crypto-tlssession-client/" #define SERVER_CERT_DIR "tests/test-crypto-tlssession-server/" - mkdir(CLIENT_CERT_DIR, 0700); - mkdir(SERVER_CERT_DIR, 0700); + g_mkdir_with_parents(CLIENT_CERT_DIR, 0700); + g_mkdir_with_parents(SERVER_CERT_DIR, 0700); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); - g_assert(link(data->servercacrt, + g_assert(qemu_link(data->servercacrt, SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); - g_assert(link(data->servercrt, + g_assert(qemu_link(data->servercrt, SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT) == 0); - g_assert(link(KEYFILE, + g_assert(qemu_link(KEYFILE, SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY) == 0); - g_assert(link(data->clientcacrt, + g_assert(qemu_link(data->clientcacrt, CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); - g_assert(link(data->clientcrt, + g_assert(qemu_link(data->clientcrt, CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT) == 0); - g_assert(link(KEYFILE, + g_assert(qemu_link(KEYFILE, CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY) == 0); clientCreds = test_tls_creds_x509_create( @@ -369,16 +374,16 @@ static void test_crypto_tls_session_x509(const void *opaque) g_assert(!data->expectClientFail); } - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); - rmdir(CLIENT_CERT_DIR); - rmdir(SERVER_CERT_DIR); + g_rmdir(CLIENT_CERT_DIR); + g_rmdir(SERVER_CERT_DIR); object_unparent(OBJECT(serverCreds)); object_unparent(OBJECT(clientCreds)); @@ -397,10 +402,13 @@ int main(int argc, char **argv) int ret; module_call_init(MODULE_INIT_QOM); + qemu_init_main_loop(&error_abort); + socket_init(); + g_test_init(&argc, &argv, NULL); g_setenv("GNUTLS_FORCE_FIPS_MODE", "2", 1); - mkdir(WORKDIR, 0700); + g_mkdir_with_parents(WORKDIR, 0700); test_tls_init(KEYFILE); test_tls_psk_init(PSKFILE); @@ -640,11 +648,11 @@ int main(int argc, char **argv) test_tls_discard_cert(&cacertlevel2areq); test_tls_discard_cert(&servercertlevel3areq); test_tls_discard_cert(&clientcertlevel2breq); - unlink(WORKDIR "cacertchain-sess.pem"); + g_remove(WORKDIR "cacertchain-sess.pem"); test_tls_psk_cleanup(PSKFILE); test_tls_cleanup(KEYFILE); - rmdir(WORKDIR); + g_rmdir(WORKDIR); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/test-io-channel-tls.c b/tests/test-io-channel-tls.c index ad7554c534..e858716192 100644 --- a/tests/test-io-channel-tls.c +++ b/tests/test-io-channel-tls.c @@ -31,9 +31,13 @@ #include "crypto/tlscredsx509.h" #include "qapi/error.h" #include "qemu/module.h" +#include "qemu/main-loop.h" #include "authz/list.h" #include "qom/object_interfaces.h" +#include <glib.h> +#include <glib/gstdio.h> + #ifdef QCRYPTO_HAVE_TLS_TEST_SUPPORT #define WORKDIR "tests/test-io-channel-tls-work/" @@ -123,33 +127,33 @@ static void test_io_channel_tls(const void *opaque) GMainContext *mainloop; /* We'll use this for our fake client-server connection */ - g_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, channel) == 0); + g_assert(qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, channel) == 0); #define CLIENT_CERT_DIR "tests/test-io-channel-tls-client/" #define SERVER_CERT_DIR "tests/test-io-channel-tls-server/" - mkdir(CLIENT_CERT_DIR, 0700); - mkdir(SERVER_CERT_DIR, 0700); + g_mkdir(CLIENT_CERT_DIR, 0700); + g_mkdir(SERVER_CERT_DIR, 0700); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); - g_assert(link(data->servercacrt, + g_assert(qemu_link(data->servercacrt, SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); - g_assert(link(data->servercrt, + g_assert(qemu_link(data->servercrt, SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT) == 0); - g_assert(link(KEYFILE, + g_assert(qemu_link(KEYFILE, SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY) == 0); - g_assert(link(data->clientcacrt, + g_assert(qemu_link(data->clientcacrt, CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT) == 0); - g_assert(link(data->clientcrt, + g_assert(qemu_link(data->clientcrt, CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT) == 0); - g_assert(link(KEYFILE, + g_assert(qemu_link(KEYFILE, CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY) == 0); clientCreds = test_tls_creds_create( @@ -238,13 +242,13 @@ static void test_io_channel_tls(const void *opaque) QIO_CHANNEL(serverChanTLS)); qio_channel_test_validate(test); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); - unlink(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_CERT); + g_remove(SERVER_CERT_DIR QCRYPTO_TLS_CREDS_X509_SERVER_KEY); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); - unlink(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CA_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_CERT); + g_remove(CLIENT_CERT_DIR QCRYPTO_TLS_CREDS_X509_CLIENT_KEY); rmdir(CLIENT_CERT_DIR); rmdir(SERVER_CERT_DIR); @@ -272,10 +276,13 @@ int main(int argc, char **argv) g_assert(qcrypto_init(NULL) == 0); module_call_init(MODULE_INIT_QOM); + qemu_init_main_loop(&error_abort); + socket_init(); + g_test_init(&argc, &argv, NULL); g_setenv("GNUTLS_FORCE_FIPS_MODE", "2", 1); - mkdir(WORKDIR, 0700); + g_mkdir(WORKDIR, 0700); test_tls_init(KEYFILE);
Fixes following tests on msys2/mingw 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', tasn1, crypto], 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', tasn1, crypto], 'test-io-channel-tls': ['io-channel-helpers.c', 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', tasn1, io, crypto]} These tests are failure with: ERROR test-crypto-tlscredsx509 - missing test plan ERROR test-crypto-tlssession - missing test plan ERROR test-io-channel-tls - missing test plan Because on win32 those test case are all disabled in the header Add qemu_socket_pair for cross platform support, convert file system handling functions to glib Add qemu_link function instead posix only link function. Use send ad recv from qemu that convert Windows Socks error to errno properly. Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> --- tests/crypto-tls-x509-helpers.c | 169 ++++++++++++++++++++++++++++++- tests/crypto-tls-x509-helpers.h | 9 +- tests/test-crypto-tlscredsx509.c | 47 +++++---- tests/test-crypto-tlssession.c | 68 +++++++------ tests/test-io-channel-tls.c | 51 ++++++---- 5 files changed, 266 insertions(+), 78 deletions(-)