[Qemu-devel] [PATCH] net/socket: change net_socket_listen_init to use qemu-socket functions

Zihan Yang posted 1 patch 6 years, 2 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/1517473228-8402-1-git-send-email-whois.zihan.yang@gmail.com
Test checkpatch passed
Test docker-build@min-glib passed
Test docker-mingw@fedora passed
Test docker-quick@centos6 passed
Test ppc passed
Test s390x passed
net/socket.c | 30 +++++++++---------------------
1 file changed, 9 insertions(+), 21 deletions(-)
[Qemu-devel] [PATCH] net/socket: change net_socket_listen_init to use qemu-socket functions
Posted by Zihan Yang 6 years, 2 months ago
net_socket_listen_init directly uses parse_host_port, bind and listen,
change it to use functions in include/qemu/sockets.h

Signed-off-by: Zihan Yang <whois.zihan.yang@gmail.com>
---
 net/socket.c | 30 +++++++++---------------------
 1 file changed, 9 insertions(+), 21 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index 6917fbc..e4b1f47 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -494,36 +494,24 @@ static int net_socket_listen_init(NetClientState *peer,
 {
     NetClientState *nc;
     NetSocketState *s;
-    struct sockaddr_in saddr;
-    int fd, ret;
+    SocketAddress *saddr;
+    Error *local_err = NULL;
+    int fd;
 
-    if (parse_host_port(&saddr, host_str, errp) < 0) {
+    saddr = socket_parse(host_str, &local_err);
+    if (NULL != local_err) {
+        error_setg_errno(errp, errno, "socket_parse failed");
         return -1;
     }
 
-    fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
+    fd = socket_listen(saddr, errp);
     if (fd < 0) {
-        error_setg_errno(errp, errno, "can't create stream socket");
+        error_setg_errno(errp, errno, "can't listen on address");
+        qapi_free_SocketAddress(saddr);
         return -1;
     }
     qemu_set_nonblock(fd);
 
-    socket_set_fast_reuse(fd);
-
-    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
-    if (ret < 0) {
-        error_setg_errno(errp, errno, "can't bind ip=%s to socket",
-                         inet_ntoa(saddr.sin_addr));
-        closesocket(fd);
-        return -1;
-    }
-    ret = listen(fd, 0);
-    if (ret < 0) {
-        error_setg_errno(errp, errno, "can't listen on socket");
-        closesocket(fd);
-        return -1;
-    }
-
     nc = qemu_new_net_client(&net_socket_info, peer, model, name);
     s = DO_UPCAST(NetSocketState, nc, nc);
     s->fd = -1;
-- 
2.7.4


Re: [Qemu-devel] [PATCH] net/socket: change net_socket_listen_init to use qemu-socket functions
Posted by Jason Wang 6 years, 2 months ago

On 2018年02月01日 16:20, Zihan Yang wrote:
> net_socket_listen_init directly uses parse_host_port, bind and listen,
> change it to use functions in include/qemu/sockets.h
>
> Signed-off-by: Zihan Yang <whois.zihan.yang@gmail.com>
> ---
>   net/socket.c | 30 +++++++++---------------------
>   1 file changed, 9 insertions(+), 21 deletions(-)
>
> diff --git a/net/socket.c b/net/socket.c
> index 6917fbc..e4b1f47 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -494,36 +494,24 @@ static int net_socket_listen_init(NetClientState *peer,
>   {
>       NetClientState *nc;
>       NetSocketState *s;
> -    struct sockaddr_in saddr;
> -    int fd, ret;
> +    SocketAddress *saddr;
> +    Error *local_err = NULL;
> +    int fd;
>   
> -    if (parse_host_port(&saddr, host_str, errp) < 0) {
> +    saddr = socket_parse(host_str, &local_err);
> +    if (NULL != local_err) {
> +        error_setg_errno(errp, errno, "socket_parse failed");
>           return -1;
>       }
>   
> -    fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
> +    fd = socket_listen(saddr, errp);
>       if (fd < 0) {
> -        error_setg_errno(errp, errno, "can't create stream socket");
> +        error_setg_errno(errp, errno, "can't listen on address");
> +        qapi_free_SocketAddress(saddr);
>           return -1;
>       }
>       qemu_set_nonblock(fd);
>   
> -    socket_set_fast_reuse(fd);
> -
> -    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
> -    if (ret < 0) {
> -        error_setg_errno(errp, errno, "can't bind ip=%s to socket",
> -                         inet_ntoa(saddr.sin_addr));
> -        closesocket(fd);
> -        return -1;
> -    }
> -    ret = listen(fd, 0);
> -    if (ret < 0) {
> -        error_setg_errno(errp, errno, "can't listen on socket");
> -        closesocket(fd);
> -        return -1;
> -    }
> -
>       nc = qemu_new_net_client(&net_socket_info, peer, model, name);
>       s = DO_UPCAST(NetSocketState, nc, nc);
>       s->fd = -1;

This allows more kinds of socket to be created with listen= e.g unix 
domain socket or vsock but it doesn't allow such kinds of socket to be 
created with connect=.

And change to use socket_()* is tricky especially the connect part. You 
may have a look at:

6701e5514bea Revert "Change net/socket.c to use socket_*() functions" again
616018352c24 Revert "Change net/socket.c to use socket_*() functions"

Thanks