VPP-574: fix VPP hang during security group configuration on a suspended VM

The unix connect() in vhost-user driver in VPP is blocking, and
a non-expedient accept() on the other side causes the entire VPP to hang.

Solution: set the nonblocking flag for the socket fd before calling
connect(), and set the socket back to blocking after the accept() succeeds.

Change-Id: Ia5ee782037eeffabdad71db8241f476a048a4f6f
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
diff --git a/src/vnet/devices/virtio/vhost-user.c b/src/vnet/devices/virtio/vhost-user.c
index f9bbae4..3fbcee9 100644
--- a/src/vnet/devices/virtio/vhost-user.c
+++ b/src/vnet/devices/virtio/vhost-user.c
@@ -2325,9 +2325,13 @@
 		  strncpy (sun.sun_path, (char *) vui->sock_filename,
 			   sizeof (sun.sun_path) - 1);
 
+		  /* Avoid hanging VPP if the other end does not accept */
+		  fcntl(sockfd, F_SETFL, O_NONBLOCK);
 		  if (connect (sockfd, (struct sockaddr *) &sun,
 			       sizeof (struct sockaddr_un)) == 0)
 		    {
+		      /* Set the socket to blocking as it was before */
+		      fcntl(sockfd, F_SETFL, 0);
 		      vui->sock_errno = 0;
 		      template.file_descriptor = sockfd;
 		      template.private_data =