Diff for /qemu/migration-tcp.c between versions 1.1.1.6 and 1.1.1.7

version 1.1.1.6, 2018/04/24 19:16:32 version 1.1.1.7, 2018/04/24 19:33:27
Line 9 Line 9
  * This work is licensed under the terms of the GNU GPL, version 2.  See   * This work is licensed under the terms of the GNU GPL, version 2.  See
  * the COPYING file in the top-level directory.   * the COPYING file in the top-level directory.
  *   *
    * Contributions after 2012-01-13 are licensed under the terms of the
    * GNU GPL, version 2 or (at your option) any later version.
  */   */
   
 #include "qemu-common.h"  #include "qemu-common.h"
Line 40  static int socket_write(MigrationState * Line 42  static int socket_write(MigrationState *
   
 static int tcp_close(MigrationState *s)  static int tcp_close(MigrationState *s)
 {  {
       int r = 0;
     DPRINTF("tcp_close\n");      DPRINTF("tcp_close\n");
     if (s->fd != -1) {      if (s->fd != -1) {
         close(s->fd);          if (close(s->fd) < 0) {
               r = -errno;
           }
         s->fd = -1;          s->fd = -1;
     }      }
     return 0;      return r;
 }  }
   
 static void tcp_wait_for_connect(void *opaque)  static void tcp_wait_for_connect(void *opaque)
Line 74  static void tcp_wait_for_connect(void *o Line 79  static void tcp_wait_for_connect(void *o
     }      }
 }  }
   
 int tcp_start_outgoing_migration(MigrationState *s, const char *host_port)  int tcp_start_outgoing_migration(MigrationState *s, const char *host_port,
                                    Error **errp)
 {  {
     struct sockaddr_in addr;  
     int ret;  
   
     ret = parse_host_port(&addr, host_port);  
     if (ret < 0) {  
         return ret;  
     }  
   
     s->get_error = socket_errno;      s->get_error = socket_errno;
     s->write = socket_write;      s->write = socket_write;
     s->close = tcp_close;      s->close = tcp_close;
   
     s->fd = qemu_socket(PF_INET, SOCK_STREAM, 0);      s->fd = inet_connect(host_port, false, errp);
     if (s->fd == -1) {  
         DPRINTF("Unable to open socket");  
         return -socket_error();  
     }  
   
     socket_set_nonblock(s->fd);  
   
     do {  
         ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr));  
         if (ret == -1) {  
             ret = -socket_error();  
         }  
         if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) {  
             qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s);  
             return 0;  
         }  
     } while (ret == -EINTR);  
   
     if (ret < 0) {      if (!error_is_set(errp)) {
           migrate_fd_connect(s);
       } else if (error_is_type(*errp, QERR_SOCKET_CONNECT_IN_PROGRESS)) {
           DPRINTF("connect in progress\n");
           qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s);
       } else if (error_is_type(*errp, QERR_SOCKET_CREATE_FAILED)) {
           DPRINTF("connect failed\n");
           return -1;
       } else if (error_is_type(*errp, QERR_SOCKET_CONNECT_FAILED)) {
         DPRINTF("connect failed\n");          DPRINTF("connect failed\n");
         migrate_fd_error(s);          migrate_fd_error(s);
         return ret;          return -1;
       } else {
           DPRINTF("unknown error\n");
           return -1;
     }      }
     migrate_fd_connect(s);  
     return 0;      return 0;
 }  }
   
Line 150  out2: Line 142  out2:
     close(s);      close(s);
 }  }
   
 int tcp_start_incoming_migration(const char *host_port)  int tcp_start_incoming_migration(const char *host_port, Error **errp)
 {  {
     struct sockaddr_in addr;  
     int val;  
     int s;      int s;
   
     DPRINTF("Attempting to start an incoming migration\n");      s = inet_listen(host_port, NULL, 256, SOCK_STREAM, 0, errp);
   
     if (parse_host_port(&addr, host_port) < 0) {  
         fprintf(stderr, "invalid host/port combination: %s\n", host_port);  
         return -EINVAL;  
     }  
   
     s = qemu_socket(PF_INET, SOCK_STREAM, 0);      if (s < 0) {
     if (s == -1) {          return -1;
         return -socket_error();  
     }  
   
     val = 1;  
     setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));  
   
     if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) {  
         goto err;  
     }  
     if (listen(s, 1) == -1) {  
         goto err;  
     }      }
   
     qemu_set_fd_handler2(s, NULL, tcp_accept_incoming_migration, NULL,      qemu_set_fd_handler2(s, NULL, tcp_accept_incoming_migration, NULL,
                          (void *)(intptr_t)s);                           (void *)(intptr_t)s);
   
     return 0;      return 0;
   
 err:  
     close(s);  
     return -socket_error();  
 }  }

Removed from v.1.1.1.6  
changed lines
  Added in v.1.1.1.7


unix.superglobalmegacorp.com