static int librdf_storage_tstore_open(librdf_storage* storage, librdf_model* model) { librdf_storage_tstore_instance *context=(librdf_storage_tstore_instance*)storage->instance; if(context->host) context->rdfsql=rs_connect_remote(context->host, context->db, context->user, context->password, context->model); else context->rdfsql=rs_connect(context->db, context->user, context->password, context->model); if(!context->rdfsql) return 1; return 0; }
// nonblocking connect is described in detail in chapter 15.4 of stevens unix network programming bool IPv4Socket::connect_nb(const std::string &host, uint16_t port) { LOG_DEBUG("IPv4Socket::connect_nb "<< host.c_str() << ":" << port); connectionInProgress_ = true; struct sockaddr *saddr = 0; struct sockaddr_in inaddr; setup_sockaddr_v4_(inaddr, host, port); socklen_t len = sizeof(sockaddr_in); saddr = (struct sockaddr *) &inaddr; setNonBlocking(); int res = rs_connect(sock_, saddr, len); if (res == 0) { connectionInProgress_ = false; clearNonBlocking(); return true; } const int err = getErrorNumber(); #ifdef WIN32 if (err == WSAEWOULDBLOCK) return true; if (err != WSAEINPROGRESS && err != WSAEINTR) { #else if (err != EINPROGRESS && err != EINTR) { #endif std::stringstream ss; ss << host << ":" << port; std::string str = ss.str(); throw ConnectionRefusedError("Failure to connect to", str.c_str(), err); }; return false; } }
static int client_connect(void) { struct rdma_addrinfo *rai = NULL; struct addrinfo *ai; struct pollfd fds; int ret, err; socklen_t len; ret = use_rgai ? rdma_getaddrinfo(dst_addr, port, &rai_hints, &rai) : getaddrinfo(dst_addr, port, &ai_hints, &ai); if (ret) { perror("getaddrinfo"); return ret; } rs = rai ? rs_socket(rai->ai_family, SOCK_STREAM, 0) : rs_socket(ai->ai_family, SOCK_STREAM, 0); if (rs < 0) { perror("rsocket"); ret = rs; goto free; } set_options(rs); /* TODO: bind client to src_addr */ if (rai && rai->ai_route) { ret = rs_setsockopt(rs, SOL_RDMA, RDMA_ROUTE, rai->ai_route, rai->ai_route_len); if (ret) { perror("rsetsockopt RDMA_ROUTE"); goto close; } } ret = rai ? rs_connect(rs, rai->ai_dst_addr, rai->ai_dst_len) : rs_connect(rs, ai->ai_addr, ai->ai_addrlen); if (ret && (errno != EINPROGRESS)) { perror("rconnect"); goto close; } if (ret && (errno == EINPROGRESS)) { fds.fd = rs; fds.events = POLLOUT; ret = do_poll(&fds, poll_timeout); if (ret) goto close; len = sizeof err; ret = rs_getsockopt(rs, SOL_SOCKET, SO_ERROR, &err, &len); if (ret) goto close; if (err) { ret = -1; errno = err; perror("async rconnect"); } } close: if (ret) rs_close(rs); free: if (rai) rdma_freeaddrinfo(rai); else freeaddrinfo(ai); return ret; }