static int vsock_listen_saddr(VsockSocketAddress *vaddr, Error **errp) { struct sockaddr_vm svm; int slisten; if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) { return -1; } slisten = qemu_socket(AF_VSOCK, SOCK_STREAM, 0); if (slisten < 0) { error_setg_errno(errp, errno, "Failed to create socket"); return -1; } if (bind(slisten, (const struct sockaddr *)&svm, sizeof(svm)) != 0) { error_setg_errno(errp, errno, "Failed to bind socket"); closesocket(slisten); return -1; } if (listen(slisten, 1) != 0) { error_setg_errno(errp, errno, "Failed to listen on socket"); closesocket(slisten); return -1; } return slisten; }
static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp, NonBlockingConnectHandler *callback, void *opaque) { struct sockaddr_vm svm; int sock = -1; bool in_progress; ConnectState *connect_state = NULL; if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) { return -1; } if (callback != NULL) { connect_state = g_malloc0(sizeof(*connect_state)); connect_state->callback = callback; connect_state->opaque = opaque; } sock = vsock_connect_addr(&svm, &in_progress, connect_state, errp); if (sock < 0) { /* do nothing */ } else if (in_progress) { /* wait_for_connect() will do the rest */ return sock; } else { if (callback) { callback(sock, NULL, opaque); } } g_free(connect_state); return sock; }
static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp) { struct sockaddr_vm svm; int sock = -1; if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) { return -1; } sock = vsock_connect_addr(&svm, errp); return sock; }