+int rpc_connect_async(struct rpc_context *rpc, const char *server, int port, rpc_cb cb, void *private_data)
+{
+ struct sockaddr_in *sin = (struct sockaddr_in *)&rpc->s;
+
+ if (rpc->fd != -1) {
+ rpc_set_error(rpc, "Trying to connect while already connected");
+ return -1;
+ }
+
+ if (rpc->is_udp != 0) {
+ rpc_set_error(rpc, "Trying to connect on UDP socket");
+ return -1;
+ }
+
+ rpc->auto_reconnect = 0;
+
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons(port);
+ if (inet_pton(AF_INET, server, &sin->sin_addr) != 1) {
+ rpc_set_error(rpc, "Not a valid server ip address");
+ return -1;
+ }
+
+
+ switch (rpc->s.ss_family) {
+ case AF_INET:
+#ifdef HAVE_SOCKADDR_LEN
+ sin->sin_len = sizeof(struct sockaddr_in);
+#endif
+ break;
+ }
+
+ rpc->connect_cb = cb;
+ rpc->connect_data = private_data;
+
+ if (rpc_connect_sockaddr_async(rpc, &rpc->s) != 0) {
+ return -1;
+ }
+
+ return 0;
+}
+