diff --git a/block/nbd.c b/block/nbd.c index 3d711b27352a3236b33cd5c1305e7f56723913a6..eff683c8df114ab0a7dd7d372909a23f02734446 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -415,7 +415,7 @@ static int nbd_establish_connection(BlockDriverState *bs) /* Now that we're connected, set the socket to be non-blocking and * kick the reply mechanism. */ - socket_set_nonblock(sock); + qemu_set_nonblock(sock); qemu_aio_set_fd_handler(sock, nbd_reply_ready, NULL, nbd_have_request, s); diff --git a/block/sheepdog.c b/block/sheepdog.c index bb67c4c071981d5f991ffeca5cb9c53d917b59f8..987018e20cede10611d13cd82aa796c7c65bb945 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -471,7 +471,7 @@ static int connect_to_sdog(BDRVSheepdogState *s) qerror_report_err(err); error_free(err); } else { - socket_set_nonblock(fd); + qemu_set_nonblock(fd); } return fd; diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index d225f6dd74f1d7e8ac88af465c4a8b4f43b57778..c5174d76a70365b3f873dc677ae15fc065742cb2 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -37,8 +37,8 @@ int qemu_socket(int domain, int type, int protocol); int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen); int socket_set_cork(int fd, int v); int socket_set_nodelay(int fd); -void socket_set_block(int fd); -void socket_set_nonblock(int fd); +void qemu_set_block(int fd); +void qemu_set_nonblock(int fd); int send_all(int fd, const void *buf, int len1); int recv_all(int fd, void *buf, int len1, bool single_read); diff --git a/migration.c b/migration.c index 7fb21473916b2e04f79834a3de242adcac456462..3b4b467c320ba56beae7abe7d517952ccca2b096 100644 --- a/migration.c +++ b/migration.c @@ -121,7 +121,7 @@ void process_incoming_migration(QEMUFile *f) int fd = qemu_get_fd(f); assert(fd != -1); - socket_set_nonblock(fd); + qemu_set_nonblock(fd); qemu_coroutine_enter(co, f); } diff --git a/nbd.c b/nbd.c index d1a67eeaf4a5a00dcdffc39837fa9d266b24d1ae..85187fff9fad83e29cce5a8e2113a027d902aa81 100644 --- a/nbd.c +++ b/nbd.c @@ -386,7 +386,7 @@ static int nbd_send_negotiate(NBDClient *client) [28 .. 151] reserved (0) */ - socket_set_block(csock); + qemu_set_block(csock); rc = -EINVAL; TRACE("Beginning negotiation."); @@ -429,7 +429,7 @@ static int nbd_send_negotiate(NBDClient *client) TRACE("Negotiation succeeded."); rc = 0; fail: - socket_set_nonblock(csock); + qemu_set_nonblock(csock); return rc; } @@ -443,7 +443,7 @@ int nbd_receive_negotiate(int csock, const char *name, uint32_t *flags, TRACE("Receiving negotiation."); - socket_set_block(csock); + qemu_set_block(csock); rc = -EINVAL; if (read_sync(csock, buf, 8) != 8) { @@ -558,7 +558,7 @@ int nbd_receive_negotiate(int csock, const char *name, uint32_t *flags, rc = 0; fail: - socket_set_nonblock(csock); + qemu_set_nonblock(csock); return rc; } diff --git a/net/socket.c b/net/socket.c index 6c3752b88a132127b13f346b0112cdb599a14bbd..87af1d3d3962af07d5bce870974aa1194f168ff2 100644 --- a/net/socket.c +++ b/net/socket.c @@ -308,7 +308,7 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr } } - socket_set_nonblock(fd); + qemu_set_nonblock(fd); return fd; fail: if (fd >= 0) @@ -519,7 +519,7 @@ static int net_socket_listen_init(NetClientState *peer, perror("socket"); return -1; } - socket_set_nonblock(fd); + qemu_set_nonblock(fd); /* allow fast reuse */ val = 1; @@ -565,7 +565,7 @@ static int net_socket_connect_init(NetClientState *peer, perror("socket"); return -1; } - socket_set_nonblock(fd); + qemu_set_nonblock(fd); connected = 0; for(;;) { @@ -674,6 +674,7 @@ static int net_socket_udp_init(NetClientState *peer, closesocket(fd); return -1; } + qemu_set_nonblock(fd); s = net_socket_fd_init(peer, model, name, fd, 0); if (!s) { @@ -712,7 +713,11 @@ int net_init_socket(const NetClientOptions *opts, const char *name, int fd; fd = monitor_handle_fd_param(cur_mon, sock->fd); - if (fd == -1 || !net_socket_fd_init(peer, "socket", name, fd, 1)) { + if (fd == -1) { + return -1; + } + qemu_set_nonblock(fd); + if (!net_socket_fd_init(peer, "socket", name, fd, 1)) { return -1; } return 0; diff --git a/qemu-char.c b/qemu-char.c index 7acbf53ef602c47293e02ab572eec9f37dacc93d..505a773330fda0e4a08f75f659726c010049daed 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2444,6 +2444,9 @@ static void unix_process_msgfd(CharDriverState *chr, struct msghdr *msg) if (fd < 0) continue; + /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */ + qemu_set_block(fd); + #ifndef MSG_CMSG_CLOEXEC qemu_set_cloexec(fd); #endif @@ -2574,7 +2577,7 @@ static int tcp_chr_add_client(CharDriverState *chr, int fd) if (s->fd != -1) return -1; - socket_set_nonblock(fd); + qemu_set_nonblock(fd); if (s->do_nodelay) socket_set_nodelay(fd); s->fd = fd; @@ -2726,7 +2729,7 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay, printf("QEMU waiting for connection on: %s\n", chr->filename); tcp_chr_accept(s->listen_chan, G_IO_IN, chr); - socket_set_nonblock(s->listen_fd); + qemu_set_nonblock(s->listen_fd); } return chr; } @@ -2768,7 +2771,7 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts *opts) } if (!is_waitconnect) - socket_set_nonblock(fd); + qemu_set_nonblock(fd); chr = qemu_chr_open_socket_fd(fd, do_nodelay, is_listen, is_telnet, is_waitconnect, &local_err); @@ -3657,7 +3660,7 @@ static CharDriverState *qmp_chardev_open_serial(ChardevHostdev *serial, if (error_is_set(errp)) { return NULL; } - socket_set_nonblock(fd); + qemu_set_nonblock(fd); return qemu_chr_open_tty_fd(fd); #else error_setg(errp, "character device backend type 'serial' not supported"); diff --git a/savevm.c b/savevm.c index 406caa90e5b7878fae900cf5a972e19b5dbdcf3f..b1d8988c78a75dc3e059c7b2a853391e1f7e5cb2 100644 --- a/savevm.c +++ b/savevm.c @@ -422,7 +422,7 @@ QEMUFile *qemu_fopen_socket(int fd, const char *mode) s->fd = fd; if (mode[0] == 'w') { - socket_set_block(s->fd); + qemu_set_block(s->fd); s->file = qemu_fopen_ops(s, &socket_write_ops); } else { s->file = qemu_fopen_ops(s, &socket_read_ops); diff --git a/slirp/misc.c b/slirp/misc.c index 6b9c2c405b6a4ff4bfc8565032f5b9c4f9484cdb..8ecced547f3cf2c002dfa7d2f4ac0943864d2ec2 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -215,7 +215,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty) qemu_setsockopt(so->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); opt = 1; qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); - socket_set_nonblock(so->s); + qemu_set_nonblock(so->s); /* Append the telnet options now */ if (so->so_m != NULL && do_pty == 1) { diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 84a6bb560b6766f1ff26854971f1676c4fcbb68b..e98ce1a50c37c068d35272316078593cbb82732e 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -336,7 +336,7 @@ int tcp_fconnect(struct socket *so) int opt, s=so->s; struct sockaddr_in addr; - socket_set_nonblock(s); + qemu_set_nonblock(s); opt = 1; qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); opt = 1; @@ -425,7 +425,7 @@ void tcp_connect(struct socket *inso) tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } - socket_set_nonblock(s); + qemu_set_nonblock(s); opt = 1; qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); opt = 1; diff --git a/ui/vnc.c b/ui/vnc.c index bbe1e0f179c46ac05a0567b34c80145969c911cf..5ddb6966259128431683dce29c7c988008600fcf 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -2732,7 +2732,7 @@ static void vnc_connect(VncDisplay *vd, int csock, int skipauth, bool websocket) VNC_DEBUG("New client on socket %d\n", csock); vd->dcl.idle = 0; - socket_set_nonblock(vs->csock); + qemu_set_nonblock(vs->csock); #ifdef CONFIG_VNC_WS if (websocket) { vs->websocket = 1; diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 433dd6888bf73af6808045e75e734eaa64bfb555..4e4b8196beb6b9ad185a824164c2a7df8fbce756 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -134,14 +134,14 @@ void qemu_vfree(void *ptr) free(ptr); } -void socket_set_block(int fd) +void qemu_set_block(int fd) { int f; f = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, f & ~O_NONBLOCK); } -void socket_set_nonblock(int fd) +void qemu_set_nonblock(int fd) { int f; f = fcntl(fd, F_GETFL); diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 640194c0cf7a7037702b8209edd706ec700262cd..dcfa0c2918ab303abd594ba20befa6f0b5dcb345 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -100,14 +100,14 @@ struct tm *localtime_r(const time_t *timep, struct tm *result) return p; } -void socket_set_block(int fd) +void qemu_set_block(int fd) { unsigned long opt = 0; WSAEventSelect(fd, NULL, 0); ioctlsocket(fd, FIONBIO, &opt); } -void socket_set_nonblock(int fd) +void qemu_set_nonblock(int fd) { unsigned long opt = 1; ioctlsocket(fd, FIONBIO, &opt); diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index b6b78f503a4ff4ae14fd470dc9b47906c7d73942..94581aa236c4f5046d83f136460a29f8d1f5d102 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -277,7 +277,7 @@ static int inet_connect_addr(struct addrinfo *addr, bool *in_progress, } qemu_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (connect_state != NULL) { - socket_set_nonblock(sock); + qemu_set_nonblock(sock); } /* connect to peer */ do { @@ -737,7 +737,7 @@ int unix_connect_opts(QemuOpts *opts, Error **errp, connect_state = g_malloc0(sizeof(*connect_state)); connect_state->callback = callback; connect_state->opaque = opaque; - socket_set_nonblock(sock); + qemu_set_nonblock(sock); } memset(&un, 0, sizeof(un)); @@ -910,6 +910,7 @@ int socket_connect(SocketAddress *addr, Error **errp, case SOCKET_ADDRESS_KIND_FD: fd = monitor_get_fd(cur_mon, addr->fd->str, errp); if (callback) { + qemu_set_nonblock(fd); callback(fd, opaque); } break;