int unix_connect_opts(QemuOpts *opts) { SockAddress un; const char *path = qemu_opt_get(opts, "path"); int ret, sock; sock = socket_create_unix(SOCKET_STREAM); if (sock < 0) { perror("socket(unix)"); return -1; } sock_address_init_unix(&un, path); ret = socket_connect(sock, &un); sock_address_done(&un); if (ret < 0) { fprintf(stderr, "connect(unix:%s): %s\n", path, errno_str); return -1; } if (sockets_debug) fprintf(stderr, "connect(unix:%s): OK\n", path); return sock; }
AsyncSocketConnector* async_socket_connector_new(const SockAddress* address, int retry_to, asc_event_cb cb, void* cb_opaque, Looper* looper) { AsyncSocketConnector* connector; if (cb == NULL) { W("No callback for AsyncSocketConnector for socket '%s'", sock_address_to_string(address)); errno = EINVAL; return NULL; } ANEW0(connector); connector->fd = -1; connector->retry_to = retry_to; connector->on_connected_cb = cb; connector->on_connected_cb_opaque = cb_opaque; connector->ref_count = 1; /* Copy socket address. */ #ifdef _WIN32 connector->address = *address; #else if (sock_address_get_family(address) == SOCKET_UNIX) { sock_address_init_unix(&connector->address, sock_address_get_path(address)); } else { connector->address = *address; } #endif /* Create a looper for asynchronous I/O. */ if (looper == NULL) { connector->looper = looper_newCore(); if (connector->looper == NULL) { E("Unable to create I/O looper for AsyncSocketConnector for socket '%s'", _asc_socket_string(connector)); cb(cb_opaque, connector, ASIO_STATE_FAILED); _async_socket_connector_free(connector); return NULL; } connector->owns_looper = 1; } else { connector->looper = looper; connector->owns_looper = 0; } /* Create a timer that will be used for connection retries. */ loopTimer_init(connector->connector_timer, connector->looper, _on_async_socket_connector_retry, connector); T("ASC %s: New connector object", _asc_socket_string(connector)); return connector; }
void* netPipe_initUnix( void* hwpipe, void* _looper, const char* args ) { /* Build SockAddress from arguments. Acceptable formats are: * * <path> */ SockAddress address; void* ret; if (args == NULL || args[0] == '\0') { D("%s: Missing address!", __FUNCTION__); return NULL; } D("%s: Address is '%s'", __FUNCTION__, args); sock_address_init_unix(&address, args); ret = netPipe_initFromAddress(hwpipe, &address, _looper); sock_address_done(&address); return ret; }