Improve error reporting
Subsystems (2)
v7 cover Improve error reporting
v7:
* PATCH 01
-fix the error message. [Daniel P. Berrange]
-adjust the Indentation problem. [Eric Blake]
* PATCH 03
-print a generic message when gethostbyname() failed in parse_host_port(),
drop the misleading ": unkonwn host" part. [Markus Armbruster]
v6:
* PATCH 02
-rename the subject
-drop the "qemu: error: " prefix.
-correct inappropriate error information settings.
* PATCH 03,04
-correct inappropriate error information settings. [Markus Armbruster]
v5:
* PATCH 01 make the commit message more exact about the actual function. [Markus Armbruster]
* PATCH 02, 03, 04 still retains the original function, but specific content and order of each patch has been adjusted substantially,
so that ensure each patch is a completed fix. [Markus Armbruster]
v4:
* PATCH 01 is redoing previous patch 1, replace the fprintf() with error_report() in the 'default' case of net_socket_fd_init() [Markus Armbruster]
v3:
* PATCH 01 is suggested by Markus and Daniel that removes the dubious 'default' case in the net_socket_fd_init(). Jason agreed.
* PATCH 02 is redoing previous patch 4.
* PATCH 04 is redoing previous patch 2, improves sort of error messages.
v2:
* PATCH 02 reworking of patch 2 following Markus's suggestion that convert error_report() in the function called by net_socket_*_init() to Error. Also add many error handling information.
* PATCH 03 net_socket_mcast_create(), net_socket_fd_init_dgram() and net_socket_fd_init() use the function such as fprintf, perror to report an error message. Convert it to Error.
* PATCH 04 parse_host_port() may fail without reporting an error. Now, fix it to set an error when it fails.
Mao Zhongyi (4):
net/socket: Don't treat odd socket type as SOCK_STREAM net/socket: Convert several helper functions to Error net/net: Convert parse_host_port() to Error net/socket: Improve -net socket error reporting
include/qemu/sockets.h | 3 +- net/net.c | 22 +++++-- net/socket.c | 156 ++++++++++++++++++++++++++++--------------------- 3 files changed, 109 insertions(+), 72 deletions(-)
Signature · 1 line
2.9.4
PATCH v7 1/4 net/socket: Don't treat odd socket type as SOCK_STREAM
In net_socket_fd_init(), the 'default' case is odd: it warns, then continues as if the socket type was SOCK_STREAM. The comment explains "this could be a eg. a pty", but that makes no sense. If @fd really was a pty, getsockopt() would fail with ENOTSOCK. If @fd was a socket, but neither SOCK_DGRAM nor SOCK_STREAM. It should not be treated as if it was SOCK_STREAM.
Turn this case into an Error. If there is a genuine reason to support something like SOCK_RAW, it should be explicitly handled.
--- net/socket.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/socket.c +3 -3
@@ -449,9 +449,9 @@ static NetSocketState *net_socket_fd_init(NetClientState *peer,case SOCK_STREAM :return net_socket_fd_init_stream (peer, model, name, fd, is_connected);default : -/* who knows ... this could be a eg. a pty, do warn and continue as stream */ -fprintf (stderr,"qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n" , so_type, fd); -return net_socket_fd_init_stream (peer, model, name, fd, is_connected); +error_report ("socket type=%d for fd=%d must be either" +" SOCK_DGRAM or SOCK_STREAM" , so_type, fd); +closesocket (fd); }return NULL ; }
Signature · 1 line
2.9.4
PATCH v7 2/4 net/socket: Convert several helper functions to Error
In reply to Mao ZhongyiCurrently, net_socket_mcast_create(), net_socket_fd_init_dgram() and net_socket_fd_init() use the function such as fprintf(), perror() to report an error message.
Now, convert these functions to Error.
--- net/socket.c | 81 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 31 deletions(-)
net/socket.c +50 -31
@@ -209,7 +209,9 @@ static void net_socket_send_dgram(void *opaque) } } -static int net_socket_mcast_create (struct sockaddr_in *mcastaddr,struct in_addr *localaddr) +static int net_socket_mcast_create (struct sockaddr_in *mcastaddr, +struct in_addr *localaddr, +Error **errp) {struct ip_mreq imr;int fd;
@@ -221,16 +223,16 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr#endif if (!IN_MULTICAST (ntohl (mcastaddr->sin_addr.s_addr))) { -fprintf (stderr,"qemu: error: specified mcastaddr \"%s\" (0x%08x) " -"does not contain a multicast address\n" , -inet_ntoa (mcastaddr->sin_addr), - (int )ntohl (mcastaddr->sin_addr.s_addr)); +error_setg (errp,"specified mcastaddr %s (0x%08x) " +"does not contain a multicast address" , +inet_ntoa (mcastaddr->sin_addr), + (int )ntohl (mcastaddr->sin_addr.s_addr));return -1 ; } fd =qemu_socket (PF_INET ,SOCK_DGRAM ,0 );if (fd <0 ) { -perror ("socket(PF_INET, SOCK_DGRAM)" ); +error_setg_errno (errp, errno,"failed to create datagram socket" );return -1 ; }
@@ -242,13 +244,15 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr val =1 ; ret =qemu_setsockopt (fd,SOL_SOCKET ,SO_REUSEADDR , &val,sizeof (val));if (ret <0 ) { -perror ("setsockopt(SOL_SOCKET, SO_REUSEADDR)" ); +error_setg_errno (errp, errno,"set the socket 'SO_REUSEADDR'" +" attribute failed" ); goto fail; } ret =bind (fd, (struct sockaddr *)mcastaddr,sizeof (*mcastaddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (mcastaddr->sin_addr)); goto fail; }
@@ -263,7 +267,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_ADD_MEMBERSHIP , &imr,sizeof (struct ip_mreq ));if (ret <0 ) { -perror ("setsockopt(IP_ADD_MEMBERSHIP)" ); +error_setg_errno (errp, errno,"add socket to multicast group %s" +" failed" ,inet_ntoa (imr.imr_multiaddr)); goto fail; }
@@ -272,7 +277,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_MULTICAST_LOOP , &loop,sizeof (loop));if (ret <0 ) { -perror ("setsockopt(SOL_IP, IP_MULTICAST_LOOP)" ); +error_setg_errno (errp, errno,"force multicast message to loopback" +" failed" ); goto fail; }
@@ -281,7 +287,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_MULTICAST_IF , localaddr,sizeof (*localaddr));if (ret <0 ) { -perror ("setsockopt(IP_MULTICAST_IF)" ); +error_setg_errno (errp, errno,"set the default network send " +"interface failed" ); goto fail; } }
@@ -320,7 +327,8 @@ static NetClientInfo net_dgram_socket_info = {static NetSocketState *net_socket_fd_init_dgram (NetClientState *peer,const char *model,const char *name, -int fd,int is_connected) +int fd,int is_connected, +Error **errp) {struct sockaddr_in saddr;int newfd;
@@ -337,14 +345,13 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,if (getsockname (fd, (struct sockaddr *) &saddr, &saddr_len) ==0 ) {/* must be bound */ if (saddr.sin_addr.s_addr ==0 ) { -fprintf (stderr,"qemu: error: init_dgram: fd=%d unbound, " -"cannot setup multicast dst addr\n" , fd); +error_setg (errp,"init_dgram: fd=%d unbound, " +"cannot setup multicast dst addr" , fd); goto err; }/* clone dgram socket */ - newfd =net_socket_mcast_create (&saddr,NULL ); + newfd =net_socket_mcast_create (&saddr,NULL , errp);if (newfd <0 ) { -/* error already reported by net_socket_mcast_create() */ goto err; }/* clone newfd to fd, close newfd */
@@ -352,9 +359,9 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,close (newfd); }else { -fprintf (stderr, -"qemu: error: init_dgram: fd=%d failed getsockname(): %s\n" , - fd,strerror (errno)); +error_setg (errp, +"init_dgram: fd=%d failed getsockname(): %s" , + fd,strerror (errno)); goto err; } }
@@ -432,20 +439,22 @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,static NetSocketState *net_socket_fd_init (NetClientState *peer,const char *model,const char *name, -int fd,int is_connected) +int fd,int is_connected, +Error **errp) {int so_type =-1 , optlen=sizeof (so_type);if (getsockopt (fd,SOL_SOCKET ,SO_TYPE , (char *)&so_type, (socklen_t *)&optlen)<0 ) { -fprintf (stderr,"qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n" , - fd); +error_setg (errp,"getsockopt(SO_TYPE) for fd=%d failed" , + fd);closesocket (fd);return NULL ; }switch (so_type) {case SOCK_DGRAM : -return net_socket_fd_init_dgram (peer, model, name, fd, is_connected); +return net_socket_fd_init_dgram (peer, model, name, fd, is_connected, + errp);case SOCK_STREAM :return net_socket_fd_init_stream (peer, model, name, fd, is_connected);default :
@@ -536,6 +545,7 @@ static int net_socket_connect_init(NetClientState *peer,NetSocketState *s;int fd, connected, ret;struct sockaddr_in saddr; +Error *err =NULL ;if (parse_host_port (&saddr, host_str) <0 )return -1 ;
@@ -567,9 +577,11 @@ static int net_socket_connect_init(NetClientState *peer,break ; } } - s =net_socket_fd_init (peer, model, name, fd, connected); -if (!s) + s =net_socket_fd_init (peer, model, name, fd, connected, &err); +if (!s) { +error_report_err (err);return -1 ; + }snprintf (s->nc.info_str,sizeof (s->nc.info_str),"socket: connect to %s:%d" ,inet_ntoa (saddr.sin_addr),ntohs (saddr.sin_port));
@@ -586,6 +598,7 @@ static int net_socket_mcast_init(NetClientState *peer,int fd;struct sockaddr_in saddr;struct in_addr localaddr, *param_localaddr; +Error *err =NULL ;if (parse_host_port (&saddr, host_str) <0 )return -1 ;
@@ -598,13 +611,17 @@ static int net_socket_mcast_init(NetClientState *peer, param_localaddr =NULL ; } - fd =net_socket_mcast_create (&saddr, param_localaddr); -if (fd <0 ) + fd =net_socket_mcast_create (&saddr, param_localaddr, &err); +if (fd <0 ) { +error_report_err (err);return -1 ; + } - s =net_socket_fd_init (peer, model, name, fd,0 ); -if (!s) + s =net_socket_fd_init (peer, model, name, fd,0 , &err); +if (!s) { +error_report_err (err);return -1 ; + } s->dgram_dst = saddr;
@@ -624,6 +641,7 @@ static int net_socket_udp_init(NetClientState *peer,NetSocketState *s;int fd, ret;struct sockaddr_in laddr, raddr; +Error *err =NULL ;if (parse_host_port (&laddr, lhost) <0 ) {return -1 ;
@@ -652,8 +670,9 @@ static int net_socket_udp_init(NetClientState *peer, }qemu_set_nonblock (fd); - s =net_socket_fd_init (peer, model, name, fd,0 ); + s =net_socket_fd_init (peer, model, name, fd,0 , &err);if (!s) { +error_report_err (err);return -1 ; }
@@ -696,7 +715,7 @@ int net_init_socket(const Netdev *netdev, const char *name,return -1 ; }qemu_set_nonblock (fd); -if (!net_socket_fd_init (peer,"socket" , name, fd,1 )) { +if (!net_socket_fd_init (peer,"socket" , name, fd,1 , errp)) {return -1 ; }return 0 ;
Signature · 1 line
2.9.4
Re: [Qemu-devel] [PATCH v7 2/4] net/socket: Convert several helper functions to Error
Quoted 34 lines · Mao Zhongyi
Currently,
net_socket_mcast_create(),net_socket_fd_init_dgram()andnet_socket_fd_init()use the function such asfprintf(),perror()to report an error message.Now, convert these functions to Error.
Signed-off-by Mao Zhongyi <[email protected]>Reviewed-by Daniel P. Berrange <[email protected]>--- net/socket.c | 81 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 31 deletions(-)net/socket.c +3
-1@@ -209,7 +209,9 @@ static void net_socket_send_dgram(void *opaque) } } -static int net_socket_mcast_create (struct sockaddr_in *mcastaddr,struct in_addr *localaddr) +static int net_socket_mcast_create (struct sockaddr_in *mcastaddr, +struct in_addr *localaddr, +Error **errp) {struct ip_mreq imr;int fd;@@ -221,16 +223,16 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr#endif if (!IN_MULTICAST (ntohl (mcastaddr->sin_addr.s_addr))) {
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 231
Quoted 10 lines
net/socket.c +4
-4-fprintf (stderr,"qemu: error: specified mcastaddr \"%s\" (0x%08x) " -"does not contain a multicast address\n" , -inet_ntoa (mcastaddr->sin_addr), - (int )ntohl (mcastaddr->sin_addr.s_addr)); +error_setg (errp,"specified mcastaddr %s (0x%08x) " +"does not contain a multicast address" , +inet_ntoa (mcastaddr->sin_addr), + (int )ntohl (mcastaddr->sin_addr.s_addr));return -1 ;
You could drop the empty line here, and ...
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 232
Quoted 1 line
net/socket.c +0
-0}
... maybe insert one here.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 235
Quoted 4 lines
net/socket.c +1
-1fd =qemu_socket (PF_INET ,SOCK_DGRAM ,0 );if (fd <0 ) { -perror ("socket(PF_INET, SOCK_DGRAM)" ); +error_setg_errno (errp, errno,"failed to create datagram socket" );
I suggested "can't create datagram socket" in my review of v5. I prefer "can't <do something>" over "failed to <do something>" myself, but grep shows more strings starting "failed to" than with "can't". I guess reporting "failed to <do something>" is more common. Okay.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 248
Quoted 10 lines
net/socket.c +2
-1return -1 ; }@@ -242,13 +244,15 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr val =1 ; ret =qemu_setsockopt (fd,SOL_SOCKET ,SO_REUSEADDR , &val,sizeof (val));if (ret <0 ) { -perror ("setsockopt(SOL_SOCKET, SO_REUSEADDR)" ); +error_setg_errno (errp, errno,"set the socket 'SO_REUSEADDR'" +" attribute failed" );
Adapting my review of v5 to the next instance: I'm not a native speaker, but "set FOO failed" doesn't feel right to me. Where's the subject? "Create" is a verb. "Setting FOO failed" has a subject, but doesn't feel right. What about "can't set socket option SO_REUSEADDR"?
Also, please avoid breaking the line in the middle of an argument when you could just as well break it between arguments, like this:
error_setg_errno(errp, errno,
"can't set socket attribute SO_REUSEADDR");net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 255
Quoted 8 lines
net/socket.c +2
-1goto fail; } ret =bind (fd, (struct sockaddr *)mcastaddr,sizeof (*mcastaddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (mcastaddr->sin_addr));
Likewise, "can't bind ip=%s to socket".
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 271
Quoted 10 lines
net/socket.c +2
-1goto fail; }@@ -263,7 +267,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_ADD_MEMBERSHIP , &imr,sizeof (struct ip_mreq ));if (ret <0 ) { -perror ("setsockopt(IP_ADD_MEMBERSHIP)" ); +error_setg_errno (errp, errno,"add socket to multicast group %s" +" failed" ,inet_ntoa (imr.imr_multiaddr));
Likewise.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 281
Quoted 10 lines
net/socket.c +2
-1goto fail; }@@ -272,7 +277,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_MULTICAST_LOOP , &loop,sizeof (loop));if (ret <0 ) { -perror ("setsockopt(SOL_IP, IP_MULTICAST_LOOP)" ); +error_setg_errno (errp, errno,"force multicast message to loopback" +" failed" );
Likwise.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 291
Quoted 10 lines
net/socket.c +2
-1goto fail; }@@ -281,7 +287,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_MULTICAST_IF , localaddr,sizeof (*localaddr));if (ret <0 ) { -perror ("setsockopt(IP_MULTICAST_IF)" ); +error_setg_errno (errp, errno,"set the default network send " +"interface failed" );
Likewise.
Quoted 14 lines
net/socket.c +2
-1goto fail; } }@@ -320,7 +327,8 @@ static NetClientInfo net_dgram_socket_info = {static NetSocketState *net_socket_fd_init_dgram (NetClientState *peer,const char *model,const char *name, -int fd,int is_connected) +int fd,int is_connected, +Error **errp) {struct sockaddr_in saddr;int newfd;
net/socket.c static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer, · line 349
Quoted 7 lines
net/socket.c +2
-2@@ -337,14 +345,13 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,if (getsockname (fd, (struct sockaddr *) &saddr, &saddr_len) ==0 ) {/* must be bound */ if (saddr.sin_addr.s_addr ==0 ) { -fprintf (stderr,"qemu: error: init_dgram: fd=%d unbound, " -"cannot setup multicast dst addr\n" , fd); +error_setg (errp,"init_dgram: fd=%d unbound, " +"cannot setup multicast dst addr" , fd);
Yet another awful error message: "init_dgram" and the value of @fd are useful to a developer, but not to the user, and "dst addr" aren't even words. What about "can't setup multicast destination address"?
Aside: I wonder whether this is actually a programming error. How can it happen? Mao, I don't expect you to answer this :)
Quoted 11 lines
net/socket.c +1
-2goto err; }/* clone dgram socket */ - newfd =net_socket_mcast_create (&saddr,NULL ); + newfd =net_socket_mcast_create (&saddr,NULL , errp);if (newfd <0 ) { -/* error already reported by net_socket_mcast_create() */ goto err; }/* clone newfd to fd, close newfd */
net/socket.c static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer, · line 364
Quoted 9 lines
net/socket.c +3
-3@@ -352,9 +359,9 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,close (newfd); }else { -fprintf (stderr, -"qemu: error: init_dgram: fd=%d failed getsockname(): %s\n" , - fd,strerror (errno)); +error_setg (errp, +"init_dgram: fd=%d failed getsockname(): %s" , + fd,strerror (errno));
Similarly awful error message. What about "can't get socket name"?
error_setg_errno() instead of strerror(), please.
Quoted 9 lines
net/socket.c +1
-1goto err; } }@@ -432,20 +439,22 @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer, static NetSocketState *net_socket_fd_init(NetClientState *peer, const char *model, const char *name, -int fd,int is_connected) + int fd, int is_connected,
net/socket.c static NetSocketState *net_socket_fd_init_stream(NetClientState *peer, · line 450
Quoted 10 lines
net/socket.c +3
-2+ Error **errp) {int so_type =-1 , optlen=sizeof (so_type);if (getsockopt (fd,SOL_SOCKET ,SO_TYPE , (char *)&so_type, (socklen_t *)&optlen)<0 ) { -fprintf (stderr,"qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n" , - fd); +error_setg (errp,"getsockopt(SO_TYPE) for fd=%d failed" , + fd);
Another awful one. What about "can't get socket option SO_TYPE"?
Quoted 83 lines
net/socket.c +19
-8closesocket (fd);return NULL ; }switch (so_type) {case SOCK_DGRAM : -return net_socket_fd_init_dgram (peer, model, name, fd, is_connected); +return net_socket_fd_init_dgram (peer, model, name, fd, is_connected, + errp);case SOCK_STREAM :return net_socket_fd_init_stream (peer, model, name, fd, is_connected);default :@@ -536,6 +545,7 @@ static int net_socket_connect_init(NetClientState *peer,NetSocketState *s;int fd, connected, ret;struct sockaddr_in saddr; +Error *err =NULL ;if (parse_host_port (&saddr, host_str) <0 )return -1 ;@@ -567,9 +577,11 @@ static int net_socket_connect_init(NetClientState *peer,break ; } } - s =net_socket_fd_init (peer, model, name, fd, connected); -if (!s) + s =net_socket_fd_init (peer, model, name, fd, connected, &err); +if (!s) { +error_report_err (err);return -1 ; + }snprintf (s->nc.info_str,sizeof (s->nc.info_str),"socket: connect to %s:%d" ,inet_ntoa (saddr.sin_addr),ntohs (saddr.sin_port));@@ -586,6 +598,7 @@ static int net_socket_mcast_init(NetClientState *peer,int fd;struct sockaddr_in saddr;struct in_addr localaddr, *param_localaddr; +Error *err =NULL ;if (parse_host_port (&saddr, host_str) <0 )return -1 ;@@ -598,13 +611,17 @@ static int net_socket_mcast_init(NetClientState *peer, param_localaddr =NULL ; } - fd =net_socket_mcast_create (&saddr, param_localaddr); -if (fd <0 ) + fd =net_socket_mcast_create (&saddr, param_localaddr, &err); +if (fd <0 ) { +error_report_err (err);return -1 ; + } - s =net_socket_fd_init (peer, model, name, fd,0 ); -if (!s) + s =net_socket_fd_init (peer, model, name, fd,0 , &err); +if (!s) { +error_report_err (err);return -1 ; + } s->dgram_dst = saddr;@@ -624,6 +641,7 @@ static int net_socket_udp_init(NetClientState *peer,NetSocketState *s;int fd, ret;struct sockaddr_in laddr, raddr; +Error *err =NULL ;if (parse_host_port (&laddr, lhost) <0 ) {return -1 ;@@ -652,8 +670,9 @@ static int net_socket_udp_init(NetClientState *peer, }qemu_set_nonblock (fd); - s =net_socket_fd_init (peer, model, name, fd,0 ); + s =net_socket_fd_init (peer, model, name, fd,0 , &err);if (!s) { +error_report_err (err);return -1 ; }
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 721
Quoted 8 lines
net/socket.c +1
-1@@ -696,7 +715,7 @@ int net_init_socket(const Netdev *netdev, const char *name,return -1 ; }qemu_set_nonblock (fd); -if (!net_socket_fd_init (peer,"socket" , name, fd,1 )) { +if (!net_socket_fd_init (peer,"socket" , name, fd,1 , errp)) {return -1 ; }return 0 ;
Looks good to me otherwise.
Re: [Qemu-devel] [PATCH v7 2/4] net/socket: Convert several helper functions to Error
Hi, Markus
Quoted 35 lines · Markus Armbruster
Quoted 33 lines · Mao Zhongyi
Currently,
net_socket_mcast_create(),net_socket_fd_init_dgram()andnet_socket_fd_init()use the function such asfprintf(),perror()to report an error message.Now, convert these functions to Error.
Signed-off-by Mao Zhongyi <[email protected]>Reviewed-by Daniel P. Berrange <[email protected]>--- net/socket.c | 81 +++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 31 deletions(-)net/socket.c +3
-1@@ -209,7 +209,9 @@ static void net_socket_send_dgram(void *opaque) } } -static int net_socket_mcast_create (struct sockaddr_in *mcastaddr,struct in_addr *localaddr) +static int net_socket_mcast_create (struct sockaddr_in *mcastaddr, +struct in_addr *localaddr, +Error **errp) {struct ip_mreq imr;int fd;@@ -221,16 +223,16 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr#endif
Quoted 13 lines
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 231
Quoted 11 lines
net/socket.c +4
-4if (!IN_MULTICAST (ntohl (mcastaddr->sin_addr.s_addr))) { -fprintf (stderr,"qemu: error: specified mcastaddr \"%s\" (0x%08x) " -"does not contain a multicast address\n" , -inet_ntoa (mcastaddr->sin_addr), - (int )ntohl (mcastaddr->sin_addr.s_addr)); +error_setg (errp,"specified mcastaddr %s (0x%08x) " +"does not contain a multicast address" , +inet_ntoa (mcastaddr->sin_addr), + (int )ntohl (mcastaddr->sin_addr.s_addr));return -1 ;You could drop the empty line here, and ...
OK, I see.
Quoted 10 lines
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 232
Quoted 2 lines
net/socket.c +0
-0}... maybe insert one here.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 235
Quoted 4 lines
net/socket.c +1
-1fd =qemu_socket (PF_INET ,SOCK_DGRAM ,0 );if (fd <0 ) { -perror ("socket(PF_INET, SOCK_DGRAM)" ); +error_setg_errno (errp, errno,"failed to create datagram socket" );
Quoted 5 lines
I suggested "can't create datagram socket" in my review of v5. I prefer "can't <do something>" over "failed to <do something>" myself, but grep shows more strings starting "failed to" than with "can't". I guess reporting "failed to <do something>" is more common. Okay.
Yes, I also prefer "can't <do something>", but I found the "failed to <do something>" in source code more generic and thus borrowed from it. I think both of these are ok, it's depends on individual style. I decided to follow my heart and use "can't ..." in the next version, thanks.
Quoted 15 lines
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 248
Quoted 10 lines
net/socket.c +2
-1return -1 ; }@@ -242,13 +244,15 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr val =1 ; ret =qemu_setsockopt (fd,SOL_SOCKET ,SO_REUSEADDR , &val,sizeof (val));if (ret <0 ) { -perror ("setsockopt(SOL_SOCKET, SO_REUSEADDR)" ); +error_setg_errno (errp, errno,"set the socket 'SO_REUSEADDR'" +" attribute failed" );Adapting my review of v5 to the next instance: I'm not a native speaker, but "set FOO failed" doesn't feel right to me. Where's the subject? "Create" is a verb. "Setting FOO failed" has a subject, but doesn't feel right. What about "can't set socket option
SO_REUSEADDR"?
I‘ll examine all the similar issues and fix them completely in the next version.
Quoted 7 lines
Also, please avoid breaking the line in the middle of an argument when you could just as well break it between arguments, like this:
error_setg_errno(errp, errno, "can't set socket attribute SO_REUSEADDR");
Yes, it is more reasonable than before. But sometimes if the argument is so long that it has to break the line in the middle of an argument.
Quoted 67 lines
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 255
Quoted 8 lines
net/socket.c +2
-1goto fail; } ret =bind (fd, (struct sockaddr *)mcastaddr,sizeof (*mcastaddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (mcastaddr->sin_addr));Likewise, "can't bind ip=%s to socket".
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 271
Quoted 10 lines
net/socket.c +2
-1goto fail; }@@ -263,7 +267,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_ADD_MEMBERSHIP , &imr,sizeof (struct ip_mreq ));if (ret <0 ) { -perror ("setsockopt(IP_ADD_MEMBERSHIP)" ); +error_setg_errno (errp, errno,"add socket to multicast group %s" +" failed" ,inet_ntoa (imr.imr_multiaddr));Likewise.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 281
Quoted 10 lines
net/socket.c +2
-1goto fail; }@@ -272,7 +277,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_MULTICAST_LOOP , &loop,sizeof (loop));if (ret <0 ) { -perror ("setsockopt(SOL_IP, IP_MULTICAST_LOOP)" ); +error_setg_errno (errp, errno,"force multicast message to loopback" +" failed" );Likwise.
net/socket.c static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr · line 291
Quoted 10 lines
net/socket.c +2
-1goto fail; }@@ -281,7 +287,8 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr ret =qemu_setsockopt (fd,IPPROTO_IP ,IP_MULTICAST_IF , localaddr,sizeof (*localaddr));if (ret <0 ) { -perror ("setsockopt(IP_MULTICAST_IF)" ); +error_setg_errno (errp, errno,"set the default network send " +"interface failed" );Likewise.
Quoted 17 lines
net/socket.c +2
-1goto fail; } }@@ -320,7 +327,8 @@ static NetClientInfo net_dgram_socket_info = {static NetSocketState *net_socket_fd_init_dgram (NetClientState *peer,const char *model,const char *name, -int fd,int is_connected) +int fd,int is_connected, +Error **errp) {struct sockaddr_in saddr;int newfd;@@ -337,14 +345,13 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,if (getsockname (fd, (struct sockaddr *) &saddr, &saddr_len) ==0 ) {/* must be bound */ if (saddr.sin_addr.s_addr ==0 ) {
Quoted 9 lines
net/socket.c static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer, · line 349
Quoted 4 lines
net/socket.c +2
-2-fprintf (stderr,"qemu: error: init_dgram: fd=%d unbound, " -"cannot setup multicast dst addr\n" , fd); +error_setg (errp,"init_dgram: fd=%d unbound, " +"cannot setup multicast dst addr" , fd);Yet another awful error message: "
init_dgram" and the value of @fd are useful to a developer, but not to the user, and "dst addr" aren't even words. What about "can't setup multicast destination address"?
OK, I see.
Quoted 26 lines
Aside: I wonder whether this is actually a programming error. How can it happen? Mao, I don't expect you to answer this :)
Quoted 11 lines
net/socket.c +1
-2goto err; }/* clone dgram socket */ - newfd =net_socket_mcast_create (&saddr,NULL ); + newfd =net_socket_mcast_create (&saddr,NULL , errp);if (newfd <0 ) { -/* error already reported by net_socket_mcast_create() */ goto err; }/* clone newfd to fd, close newfd */ net/socket.c static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer, · line 364
Quoted 9 lines
net/socket.c +3
-3@@ -352,9 +359,9 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,close (newfd); }else { -fprintf (stderr, -"qemu: error: init_dgram: fd=%d failed getsockname(): %s\n" , - fd,strerror (errno)); +error_setg (errp, +"init_dgram: fd=%d failed getsockname(): %s" , + fd,strerror (errno));Similarly awful error message. What about "can't get socket name"?
Quoted 2 lines
error_setg_errno()instead ofstrerror(), please.
OK, I will.
Quoted 13 lines
Quoted 13 lines
net/socket.c +2
-1goto err; } }@@ -432,20 +439,22 @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,static NetSocketState *net_socket_fd_init (NetClientState *peer,const char *model,const char *name, -int fd,int is_connected) +int fd,int is_connected, +Error **errp) {int so_type =-1 , optlen=sizeof (so_type);
Quoted 8 lines
net/socket.c static NetSocketState *net_socket_fd_init_stream(NetClientState *peer, · line 450
Quoted 6 lines
net/socket.c +2
-2if (getsockopt (fd,SOL_SOCKET ,SO_TYPE , (char *)&so_type, (socklen_t *)&optlen)<0 ) { -fprintf (stderr,"qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n" , - fd); +error_setg (errp,"getsockopt(SO_TYPE) for fd=%d failed" , + fd);Another awful one. What about "can't get socket option
SO_TYPE"?
OK, I will.
Quoted 83 lines
Quoted 83 lines
net/socket.c +19
-8closesocket (fd);return NULL ; }switch (so_type) {case SOCK_DGRAM : -return net_socket_fd_init_dgram (peer, model, name, fd, is_connected); +return net_socket_fd_init_dgram (peer, model, name, fd, is_connected, + errp);case SOCK_STREAM :return net_socket_fd_init_stream (peer, model, name, fd, is_connected);default :@@ -536,6 +545,7 @@ static int net_socket_connect_init(NetClientState *peer,NetSocketState *s;int fd, connected, ret;struct sockaddr_in saddr; +Error *err =NULL ;if (parse_host_port (&saddr, host_str) <0 )return -1 ;@@ -567,9 +577,11 @@ static int net_socket_connect_init(NetClientState *peer,break ; } } - s =net_socket_fd_init (peer, model, name, fd, connected); -if (!s) + s =net_socket_fd_init (peer, model, name, fd, connected, &err); +if (!s) { +error_report_err (err);return -1 ; + }snprintf (s->nc.info_str,sizeof (s->nc.info_str),"socket: connect to %s:%d" ,inet_ntoa (saddr.sin_addr),ntohs (saddr.sin_port));@@ -586,6 +598,7 @@ static int net_socket_mcast_init(NetClientState *peer,int fd;struct sockaddr_in saddr;struct in_addr localaddr, *param_localaddr; +Error *err =NULL ;if (parse_host_port (&saddr, host_str) <0 )return -1 ;@@ -598,13 +611,17 @@ static int net_socket_mcast_init(NetClientState *peer, param_localaddr =NULL ; } - fd =net_socket_mcast_create (&saddr, param_localaddr); -if (fd <0 ) + fd =net_socket_mcast_create (&saddr, param_localaddr, &err); +if (fd <0 ) { +error_report_err (err);return -1 ; + } - s =net_socket_fd_init (peer, model, name, fd,0 ); -if (!s) + s =net_socket_fd_init (peer, model, name, fd,0 , &err); +if (!s) { +error_report_err (err);return -1 ; + } s->dgram_dst = saddr;@@ -624,6 +641,7 @@ static int net_socket_udp_init(NetClientState *peer,NetSocketState *s;int fd, ret;struct sockaddr_in laddr, raddr; +Error *err =NULL ;if (parse_host_port (&laddr, lhost) <0 ) {return -1 ;@@ -652,8 +670,9 @@ static int net_socket_udp_init(NetClientState *peer, }qemu_set_nonblock (fd); - s =net_socket_fd_init (peer, model, name, fd,0 ); + s =net_socket_fd_init (peer, model, name, fd,0 , &err);if (!s) { +error_report_err (err);return -1 ; }
Quoted 12 lines
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 721
Quoted 9 lines
net/socket.c +1
-1@@ -696,7 +715,7 @@ int net_init_socket(const Netdev *netdev, const char *name,return -1 ; }qemu_set_nonblock (fd); -if (!net_socket_fd_init (peer,"socket" , name, fd,1 )) { +if (!net_socket_fd_init (peer,"socket" , name, fd,1 , errp)) {return -1 ; }return 0 ;Looks good to me otherwise.
Thank you for your patient explanation.
I'm sorry to bother you with these minor questions. I‘ll be more careful to avoid similar problems.
Thanks again,
Mao
PATCH v7 3/4 net/net: Convert parse_host_port() to Error
In reply to Mao Zhongyi--- include/qemu/sockets.h | 3 ++- net/net.c | 22 +++++++++++++++++----- net/socket.c | 19 ++++++++++++++----- 3 files changed, 33 insertions(+), 11 deletions(-)
include/qemu/sockets.h +2 -1
@@ -53,7 +53,8 @@ void socket_listen_cleanup(int fd, Error **errp);int socket_dgram (SocketAddress *remote,SocketAddress *local,Error **errp);/* Old, ipv4 only bits. Don't use for new code. */ -int parse_host_port (struct sockaddr_in *saddr,const char *str); +int parse_host_port (struct sockaddr_in *saddr,const char *str, +Error **errp);int socket_init (void );/**
net/net.c +17 -5
@@ -100,7 +100,8 @@ static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)return 0 ; } -int parse_host_port (struct sockaddr_in *saddr,const char *str) +int parse_host_port (struct sockaddr_in *saddr,const char *str, +Error **errp) {char buf[512 ];struct hostent *he;
@@ -108,24 +109,35 @@ int parse_host_port(struct sockaddr_in *saddr, const char *str)int port; p = str; -if (get_str_sep (buf,sizeof (buf), &p,':' ) <0 ) +if (get_str_sep (buf,sizeof (buf), &p,':' ) <0 ) { +error_setg (errp,"host address '%s' doesn't contain ':' " +"separating host from port" , str);return -1 ; + } saddr->sin_family =AF_INET ;if (buf[0 ] =='\0' ) { saddr->sin_addr.s_addr =0 ; }else {if (qemu_isdigit (buf[0 ])) { -if (!inet_aton (buf, &saddr->sin_addr)) +if (!inet_aton (buf, &saddr->sin_addr)) { +error_setg (errp,"host address '%s' is not a valid " +"IPv4 address" , buf);return -1 ; + } }else { -if ((he =gethostbyname (buf)) ==NULL ) + he =gethostbyname (buf); +if (he ==NULL ) { +error_setg (errp,"can't resolve host address '%s'" , buf);return -1 ; + } saddr->sin_addr = *(struct in_addr *)he->h_addr; } } port =strtol (p, (char **)&r,0 ); -if (r == p) +if (r == p) { +error_setg (errp,"port number '%s' is invalid" , p);return -1 ; + } saddr->sin_port =htons (port);return 0 ; }
net/socket.c +14 -5
@@ -500,9 +500,12 @@ static int net_socket_listen_init(NetClientState *peer,NetSocketState *s;struct sockaddr_in saddr;int fd, ret; +Error *err =NULL ; -if (parse_host_port (&saddr, host_str) <0 ) +if (parse_host_port (&saddr, host_str, &err) <0 ) { +error_report_err (err);return -1 ; + } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) {
@@ -547,8 +550,10 @@ static int net_socket_connect_init(NetClientState *peer,struct sockaddr_in saddr;Error *err =NULL ; -if (parse_host_port (&saddr, host_str) <0 ) +if (parse_host_port (&saddr, host_str, &err) <0 ) { +error_report_err (err);return -1 ; + } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) {
@@ -600,8 +605,10 @@ static int net_socket_mcast_init(NetClientState *peer,struct in_addr localaddr, *param_localaddr;Error *err =NULL ; -if (parse_host_port (&saddr, host_str) <0 ) +if (parse_host_port (&saddr, host_str, &err) <0 ) { +error_report_err (err);return -1 ; + }if (localaddr_str !=NULL ) {if (inet_aton (localaddr_str, &localaddr) ==0 )
@@ -643,11 +650,13 @@ static int net_socket_udp_init(NetClientState *peer,struct sockaddr_in laddr, raddr;Error *err =NULL ; -if (parse_host_port (&laddr, lhost) <0 ) { +if (parse_host_port (&laddr, lhost, &err) <0 ) { +error_report_err (err);return -1 ; } -if (parse_host_port (&raddr, rhost) <0 ) { +if (parse_host_port (&raddr, rhost, &err) <0 ) { +error_report_err (err);return -1 ; }
Signature · 1 line
2.9.4
Re: [Qemu-devel] [PATCH v7 3/4] net/net: Convert parse_host_port() to Error
Quoted 7 lines · Mao Zhongyi
PATCH v7 4/4 net/socket: Improve -net socket error reporting
In reply to Mao ZhongyiWhen -net socket fails, it first reports a specific error, then a generic one, like this:
$ qemu-system-x86_64 -net socket,
qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=, mcast= or udp= is required
qemu-system-x86_64: -net socket: Device 'socket' could not be initializedConvert net_socket_*_init() to Error to get rid of the superfluous second error message. After the patch, the effect like this:
$ qemu-system-x86_64 -net socket,
qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=, mcast= or udp= is requiredAt the same time, add many explicit error handling message when it fails.
--- net/socket.c | 94 +++++++++++++++++++++++++++++------------------------------- 1 file changed, 45 insertions(+), 49 deletions(-)
net/socket.c +45 -49
@@ -494,22 +494,21 @@ static void net_socket_accept(void *opaque)static int net_socket_listen_init (NetClientState *peer,const char *model,const char *name, -const char *host_str) +const char *host_str, +Error **errp) {NetClientState *nc;NetSocketState *s;struct sockaddr_in saddr;int fd, ret; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) { -perror ("socket" ); +error_setg_errno (errp, errno,"failed to create stream socket" );return -1 ; }qemu_set_nonblock (fd);
@@ -518,13 +517,14 @@ static int net_socket_listen_init(NetClientState *peer, ret =bind (fd, (struct sockaddr *)&saddr,sizeof (saddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (saddr.sin_addr));closesocket (fd);return -1 ; } ret =listen (fd,0 );if (ret <0 ) { -perror ("listen" ); +error_setg_errno (errp, errno,"listen socket failed" );closesocket (fd);return -1 ; }
@@ -543,21 +543,20 @@ static int net_socket_listen_init(NetClientState *peer,static int net_socket_connect_init (NetClientState *peer,const char *model,const char *name, -const char *host_str) +const char *host_str, +Error **errp) {NetSocketState *s;int fd, connected, ret;struct sockaddr_in saddr; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) { -perror ("socket" ); +error_setg_errno (errp, errno,"failed to create stream socket" );return -1 ; }qemu_set_nonblock (fd);
@@ -573,7 +572,7 @@ static int net_socket_connect_init(NetClientState *peer, errno == EINVAL) { break; } else { -perror ("connect" ); +error_setg_errno (errp, errno,"connection failed" );closesocket (fd);return -1 ; }
@@ -582,9 +581,8 @@ static int net_socket_connect_init(NetClientState *peer,break ; } } - s =net_socket_fd_init (peer, model, name, fd, connected, &err); + s =net_socket_fd_init (peer, model, name, fd, connected, errp);if (!s) { -error_report_err (err);return -1 ; } snprintf(s->nc.info_str, sizeof(s->nc.info_str),
@@ -597,36 +595,36 @@ static int net_socket_mcast_init(NetClientState *peer,const char *model, const char *name, const char *host_str, - const char *localaddr_str) + const char *localaddr_str, + Error **errp) { NetSocketState *s;int fd;struct sockaddr_in saddr;struct in_addr localaddr, *param_localaddr; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; }if (localaddr_str !=NULL ) { -if (inet_aton (localaddr_str, &localaddr) ==0 ) +if (inet_aton (localaddr_str, &localaddr) ==0 ) { +error_setg (errp,"localaddr '%s' is not a valid IPv4 address" , + localaddr_str);return -1 ; + } param_localaddr = &localaddr; }else { param_localaddr =NULL ; } - fd =net_socket_mcast_create (&saddr, param_localaddr, &err); + fd =net_socket_mcast_create (&saddr, param_localaddr, errp);if (fd <0 ) { -error_report_err (err);return -1 ; } - s =net_socket_fd_init (peer, model, name, fd,0 , &err); + s =net_socket_fd_init (peer, model, name, fd,0 , errp);if (!s) { -error_report_err (err);return -1 ; }
@@ -643,45 +641,45 @@ static int net_socket_udp_init(NetClientState *peer,const char *model, const char *name, const char *rhost, - const char *lhost) + const char *lhost, + Error **errp) { NetSocketState *s;int fd, ret;struct sockaddr_in laddr, raddr; -Error *err =NULL ; -if (parse_host_port (&laddr, lhost, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&laddr, lhost, errp) <0 ) {return -1 ; } -if (parse_host_port (&raddr, rhost, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&raddr, rhost, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_DGRAM ,0 );if (fd <0 ) { -perror ("socket(PF_INET, SOCK_DGRAM)" ); +error_setg_errno (errp, errno,"failed to create datagram socket" );return -1 ; } ret =socket_set_fast_reuse (fd);if (ret <0 ) { +error_setg_errno (errp, errno,"set the socket 'SO_REUSEADDR'" +" attribute failed" );closesocket (fd);return -1 ; } ret =bind (fd, (struct sockaddr *)&laddr,sizeof (laddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (laddr.sin_addr));closesocket (fd);return -1 ; }qemu_set_nonblock (fd); - s =net_socket_fd_init (peer, model, name, fd,0 , &err); + s =net_socket_fd_init (peer, model, name, fd,0 , errp);if (!s) { -error_report_err (err);return -1 ; }
@@ -696,8 +694,6 @@ static int net_socket_udp_init(NetClientState *peer,int net_init_socket (const Netdev *netdev,const char *name,NetClientState *peer,Error **errp) { -/* FIXME error_setg(errp, ...) on failure */ -Error *err =NULL ;const NetdevSocketOptions *sock;assert (netdev->type ==NET_CLIENT_DRIVER_SOCKET );
@@ -705,22 +701,21 @@ int net_init_socket(const Netdev *netdev, const char *name,if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mcast + sock->has_udp !=1 ) { -error_report ("exactly one of fd=, listen=, connect=, mcast= or udp=" -" is required" ); +error_setg (errp,"exactly one of fd=, listen=, connect=, mcast= or udp=" +" is required" );return -1 ; }if (sock->has_localaddr && !sock->has_mcast && !sock->has_udp) { -error_report ("localaddr= is only valid with mcast= or udp=" ); +error_setg (errp,"localaddr= is only valid with mcast= or udp=" );return -1 ; }if (sock->has_fd) {int fd; - fd =monitor_fd_param (cur_mon, sock->fd, &err); + fd =monitor_fd_param (cur_mon, sock->fd, errp);if (fd ==-1 ) { -error_report_err (err);return -1 ; }qemu_set_nonblock (fd);
@@ -731,15 +726,16 @@ int net_init_socket(const Netdev *netdev, const char *name, }if (sock->has_listen) { -if (net_socket_listen_init (peer,"socket" , name, sock->listen) ==-1 ) { +if (net_socket_listen_init (peer,"socket" , name, + sock->listen, errp) ==-1 ) {return -1 ; }return 0 ; }if (sock->has_connect) { -if (net_socket_connect_init (peer,"socket" , name, sock->connect) == --1 ) { +if (net_socket_connect_init (peer,"socket" , name, + sock->connect, errp) ==-1 ) {return -1 ; }return 0 ;
@@ -748,8 +744,8 @@ int net_init_socket(const Netdev *netdev, const char *name,if (sock->has_mcast) {/* if sock->localaddr is missing, it has been initialized to "all bits * zero" */ -if (net_socket_mcast_init (peer,"socket" , name, sock->mcast, - sock->localaddr) ==-1 ) { +if (net_socket_mcast_init (peer,"socket" , name, + sock->mcast, sock->localaddr, errp) ==-1 ) {return -1 ; }return 0 ;
@@ -757,11 +753,11 @@ int net_init_socket(const Netdev *netdev, const char *name,assert (sock->has_udp);if (!sock->has_localaddr) { -error_report ("localaddr= is mandatory with udp=" ); +error_setg (errp,"localaddr= is mandatory with udp=" );return -1 ; } -if (net_socket_udp_init (peer,"socket" , name, sock->udp, sock->localaddr) == --1 ) { +if (net_socket_udp_init (peer,"socket" , name, + sock->udp, sock->localaddr, errp) ==-1 ) {return -1 ; }return 0 ;
Signature · 1 line
2.9.4
Re: [Qemu-devel] [PATCH v7 4/4] net/socket: Improve -net socket error reporting
Quoted 55 lines · Mao Zhongyi
When -net socket fails, it first reports a specific error, then a generic one, like this:
$ qemu-system-x86_64 -net socket, qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=, mcast= or udp= is required qemu-system-x86_64: -net socket: Device 'socket' could not be initializedConvert net_socket_*_init() to Error to get rid of the superfluous second error message. After the patch, the effect like this:
$ qemu-system-x86_64 -net socket, qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=, mcast= or udp= is requiredAt the same time, add many explicit error handling message when it fails.
Signed-off-by Mao Zhongyi <[email protected]>--- net/socket.c | 94 +++++++++++++++++++++++++++++------------------------------- 1 file changed, 45 insertions(+), 49 deletions(-)net/socket.c +4
-5@@ -494,22 +494,21 @@ static void net_socket_accept(void *opaque)static int net_socket_listen_init (NetClientState *peer,const char *model,const char *name, -const char *host_str) +const char *host_str, +Error **errp) {NetClientState *nc;NetSocketState *s;struct sockaddr_in saddr;int fd, ret; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) { -perror ("socket" ); +error_setg_errno (errp, errno,"failed to create stream socket" );return -1 ; }qemu_set_nonblock (fd);
net/socket.c static int net_socket_listen_init(NetClientState *peer, · line 521
Quoted 6 lines
net/socket.c +2
-1@@ -518,13 +517,14 @@ static int net_socket_listen_init(NetClientState *peer, ret =bind (fd, (struct sockaddr *)&saddr,sizeof (saddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (saddr.sin_addr));
Comment on the same error message in PATCH 2 applies.
net/socket.c static int net_socket_listen_init(NetClientState *peer, · line 527
Quoted 7 lines
net/socket.c +1
-1closesocket (fd);return -1 ; } ret =listen (fd,0 );if (ret <0 ) { -perror ("listen" ); +error_setg_errno (errp, errno,"listen socket failed" );
Suggest "can't listen on socket".
Quoted 30 lines
net/socket.c +4
-5closesocket (fd);return -1 ; }@@ -543,21 +543,20 @@ static int net_socket_listen_init(NetClientState *peer,static int net_socket_connect_init (NetClientState *peer,const char *model,const char *name, -const char *host_str) +const char *host_str, +Error **errp) {NetSocketState *s;int fd, connected, ret;struct sockaddr_in saddr; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) { -perror ("socket" ); +error_setg_errno (errp, errno,"failed to create stream socket" );return -1 ; }qemu_set_nonblock (fd);
net/socket.c static int net_socket_connect_init(NetClientState *peer, · line 575
Quoted 5 lines
net/socket.c +1
-1@@ -573,7 +572,7 @@ static int net_socket_connect_init(NetClientState *peer, errno == EINVAL) { break; } else { -perror ("connect" ); +error_setg_errno (errp, errno,"connection failed" );
Suggest "can't connect socket".
Quoted 79 lines
net/socket.c +13
-15closesocket (fd);return -1 ; }@@ -582,9 +581,8 @@ static int net_socket_connect_init(NetClientState *peer,break ; } } - s =net_socket_fd_init (peer, model, name, fd, connected, &err); + s =net_socket_fd_init (peer, model, name, fd, connected, errp);if (!s) { -error_report_err (err);return -1 ; } snprintf(s->nc.info_str, sizeof(s->nc.info_str),@@ -597,36 +595,36 @@ static int net_socket_mcast_init(NetClientState *peer,const char *model, const char *name, const char *host_str, - const char *localaddr_str) + const char *localaddr_str, + Error **errp) { NetSocketState *s;int fd;struct sockaddr_in saddr;struct in_addr localaddr, *param_localaddr; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; }if (localaddr_str !=NULL ) { -if (inet_aton (localaddr_str, &localaddr) ==0 ) +if (inet_aton (localaddr_str, &localaddr) ==0 ) { +error_setg (errp,"localaddr '%s' is not a valid IPv4 address" , + localaddr_str);return -1 ; + } param_localaddr = &localaddr; }else { param_localaddr =NULL ; } - fd =net_socket_mcast_create (&saddr, param_localaddr, &err); + fd =net_socket_mcast_create (&saddr, param_localaddr, errp);if (fd <0 ) { -error_report_err (err);return -1 ; } - s =net_socket_fd_init (peer, model, name, fd,0 , &err); + s =net_socket_fd_init (peer, model, name, fd,0 , errp);if (!s) { -error_report_err (err);return -1 ; }@@ -643,45 +641,45 @@ static int net_socket_udp_init(NetClientState *peer,const char *model, const char *name, const char *rhost, - const char *lhost) + const char *lhost, + Error **errp) { NetSocketState *s;int fd, ret;struct sockaddr_in laddr, raddr; -Error *err =NULL ; -if (parse_host_port (&laddr, lhost, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&laddr, lhost, errp) <0 ) {return -1 ; }
net/socket.c static int net_socket_udp_init(NetClientState *peer, · line 661
Quoted 10 lines
net/socket.c +2
-3-if (parse_host_port (&raddr, rhost, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&raddr, rhost, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_DGRAM ,0 );if (fd <0 ) { -perror ("socket(PF_INET, SOCK_DGRAM)" ); +error_setg_errno (errp, errno,"failed to create datagram socket" );
Comment on the same error message in PATCH 2 applies.
net/socket.c static int net_socket_udp_init(NetClientState *peer, · line 668
Quoted 7 lines
net/socket.c +2
-0return -1 ; } ret =socket_set_fast_reuse (fd);if (ret <0 ) { +error_setg_errno (errp, errno,"set the socket 'SO_REUSEADDR'" +" attribute failed" );
Comment on the same error message in PATCH 2 applies.
net/socket.c static int net_socket_udp_init(NetClientState *peer, · line 675
Quoted 8 lines
net/socket.c +2
-1closesocket (fd);return -1 ; } ret =bind (fd, (struct sockaddr *)&laddr,sizeof (laddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (laddr.sin_addr));
Likewise.
Quoted 49 lines
net/socket.c +5
-9closesocket (fd);return -1 ; }qemu_set_nonblock (fd); - s =net_socket_fd_init (peer, model, name, fd,0 , &err); + s =net_socket_fd_init (peer, model, name, fd,0 , errp);if (!s) { -error_report_err (err);return -1 ; }@@ -696,8 +694,6 @@ static int net_socket_udp_init(NetClientState *peer,int net_init_socket (const Netdev *netdev,const char *name,NetClientState *peer,Error **errp) { -/* FIXME error_setg(errp, ...) on failure */ -Error *err =NULL ;const NetdevSocketOptions *sock;assert (netdev->type ==NET_CLIENT_DRIVER_SOCKET );@@ -705,22 +701,21 @@ int net_init_socket(const Netdev *netdev, const char *name,if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mcast + sock->has_udp !=1 ) { -error_report ("exactly one of fd=, listen=, connect=, mcast= or udp=" -" is required" ); +error_setg (errp,"exactly one of fd=, listen=, connect=, mcast= or udp=" +" is required" );return -1 ; }if (sock->has_localaddr && !sock->has_mcast && !sock->has_udp) { -error_report ("localaddr= is only valid with mcast= or udp=" ); +error_setg (errp,"localaddr= is only valid with mcast= or udp=" );return -1 ; }if (sock->has_fd) {int fd; - fd =monitor_fd_param (cur_mon, sock->fd, &err); + fd =monitor_fd_param (cur_mon, sock->fd, errp);if (fd ==-1 ) { -error_report_err (err);return -1 ; }qemu_set_nonblock (fd);
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 730
Quoted 6 lines
net/socket.c +2
-1@@ -731,15 +726,16 @@ int net_init_socket(const Netdev *netdev, const char *name, }if (sock->has_listen) { -if (net_socket_listen_init (peer,"socket" , name, sock->listen) ==-1 ) { +if (net_socket_listen_init (peer,"socket" , name, + sock->listen, errp) ==-1 ) {
Please avoid breaking the line in the middle of an operator's operand when you could just as well break it at the operator, like this:
if (net_socket_listen_init(peer, "socket", name, sock->listen, errp)
== -1) {Since you're touching this line anyway, I suggest to replace == -1 by the more idiomatic < 0.
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 738
Quoted 10 lines
net/socket.c +2
-2return -1 ; }return 0 ; }if (sock->has_connect) { -if (net_socket_connect_init (peer,"socket" , name, sock->connect) == --1 ) { +if (net_socket_connect_init (peer,"socket" , name, + sock->connect, errp) ==-1 ) {
Likewise.
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 748
Quoted 11 lines
net/socket.c +2
-2return -1 ; }return 0 ;@@ -748,8 +744,8 @@ int net_init_socket(const Netdev *netdev, const char *name,if (sock->has_mcast) {/* if sock->localaddr is missing, it has been initialized to "all bits * zero" */ -if (net_socket_mcast_init (peer,"socket" , name, sock->mcast, - sock->localaddr) ==-1 ) { +if (net_socket_mcast_init (peer,"socket" , name, + sock->mcast, sock->localaddr, errp) ==-1 ) {
Likewise.
Quoted 5 lines
net/socket.c +0
-0return -1 ; }return 0 ;@@ -757,11 +753,11 @@ int net_init_socket(const Netdev *netdev, const char *name,
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 760
Quoted 10 lines
net/socket.c +3
-3assert (sock->has_udp);if (!sock->has_localaddr) { -error_report ("localaddr= is mandatory with udp=" ); +error_setg (errp,"localaddr= is mandatory with udp=" );return -1 ; } -if (net_socket_udp_init (peer,"socket" , name, sock->udp, sock->localaddr) == --1 ) { +if (net_socket_udp_init (peer,"socket" , name, + sock->udp, sock->localaddr, errp) ==-1 ) {
Likewise.
Quoted 3 lines
net/socket.c +0
-0return -1 ; }return 0 ;
Re: [Qemu-devel] [PATCH v7 4/4] net/socket: Improve -net socket error reporting
Quoted 58 lines · Markus Armbruster
Quoted 56 lines · Mao Zhongyi
When -net socket fails, it first reports a specific error, then a generic one, like this:
$ qemu-system-x86_64 -net socket, qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=, mcast= or udp= is required qemu-system-x86_64: -net socket: Device 'socket' could not be initializedConvert net_socket_*_init() to Error to get rid of the superfluous second error message. After the patch, the effect like this:
$ qemu-system-x86_64 -net socket, qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=, mcast= or udp= is requiredAt the same time, add many explicit error handling message when it fails.
Signed-off-by Mao Zhongyi <[email protected]>--- net/socket.c | 94 +++++++++++++++++++++++++++++------------------------------- 1 file changed, 45 insertions(+), 49 deletions(-)net/socket.c +4
-5@@ -494,22 +494,21 @@ static void net_socket_accept(void *opaque)static int net_socket_listen_init (NetClientState *peer,const char *model,const char *name, -const char *host_str) +const char *host_str, +Error **errp) {NetClientState *nc;NetSocketState *s;struct sockaddr_in saddr;int fd, ret; -Error *err =NULL ; -if (parse_host_port (&saddr, host_str, &err) <0 ) { -error_report_err (err); +if (parse_host_port (&saddr, host_str, errp) <0 ) {return -1 ; } fd =qemu_socket (PF_INET ,SOCK_STREAM ,0 );if (fd <0 ) { -perror ("socket" ); +error_setg_errno (errp, errno,"failed to create stream socket" );return -1 ; }qemu_set_nonblock (fd);@@ -518,13 +517,14 @@ static int net_socket_listen_init(NetClientState *peer,
Quoted 7 lines
net/socket.c static int net_socket_listen_init(NetClientState *peer, · line 521
Quoted 5 lines
net/socket.c +2
-1ret =bind (fd, (struct sockaddr *)&saddr,sizeof (saddr));if (ret <0 ) { -perror ("bind" ); +error_setg_errno (errp, errno,"bind ip=%s to socket failed" , +inet_ntoa (saddr.sin_addr));Comment on the same error message in PATCH 2 applies.
OK, I will fix the similar problems right away.
Quoted 10 lines
net/socket.c static int net_socket_listen_init(NetClientState *peer, · line 527
Quoted 8 lines
net/socket.c +1
-1closesocket (fd);return -1 ; } ret =listen (fd,0 );if (ret <0 ) { -perror ("listen" ); +error_setg_errno (errp, errno,"listen socket failed" );Suggest "can't listen on socket".
OK, I will.
Quoted 1 line
Quoted 1 line
net/socket.c +0
-1- fd =net_socket_mcast_create (&saddr, param_localaddr, &err);
[...]
Quoted 5 lines
net/socket.c int net_init_socket(const Netdev *netdev, const char *name, · line 730
Quoted 4 lines
if (sock->has_listen) {net/socket.c +2
-1-if (net_socket_listen_init (peer,"socket" , name, sock->listen) ==-1 ) { +if (net_socket_listen_init (peer,"socket" , name, + sock->listen, errp) ==-1 ) {
Quoted 9 lines
Please avoid breaking the line in the middle of an operator's operand when you could just as well break it at the operator, like this:
if (net_socket_listen_init(peer, "socket", name, sock->listen, errp) == -1) {Since you're touching this line anyway, I suggest to replace == -1 by the more idiomatic < 0.
OK, I see.
Thanks,
Mao