+ return 0;
+}
+
+void rpc_set_autoreconnect(struct rpc_context *rpc)
+{
+ rpc->auto_reconnect = 1;
+}
+
+void rpc_unset_autoreconnect(struct rpc_context *rpc)
+{
+ rpc->auto_reconnect = 0;
+}
+
+static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_storage *s)
+{
+ int socksize;
+
+ switch (s->ss_family) {
+ case AF_INET:
+ socksize = sizeof(struct sockaddr_in);
+ rpc->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ break;
+ default:
+ rpc_set_error(rpc, "Can not handle AF_FAMILY:%d", s->ss_family);
+ return -1;
+ }
+
+ if (rpc->fd == -1) {
+ rpc_set_error(rpc, "Failed to open socket");
+ return -1;
+ }
+
+
+#if !defined(WIN32)
+ /* Some systems allow you to set capabilities on an executable
+ * to allow the file to be executed with privilege to bind to
+ * privileged system ports, even if the user is not root.
+ *
+ * Opportunistically try to bind the socket to a low numbered
+ * system port in the hope that the user is either root or the
+ * executable has the CAP_NET_BIND_SERVICE.
+ *
+ * As soon as we fail the bind() with EACCES we know we will never
+ * be able to bind to a system port so we terminate the loop.
+ *
+ * On linux, use
+ * sudo setcap 'cap_net_bind_service=+ep' /path/executable
+ * to make the executable able to bind to a system port.
+ */
+ if (1) {
+ static int port = 200;
+ int i;
+ int one = 1;
+
+ setsockopt(rpc->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
+
+ for (i = 0; i < 500; i++) {
+ struct sockaddr_in sin;
+
+ if(++port > 700) port = 200;
+
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_port = htons(port);
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = 0;
+
+ if (bind(rpc->fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) != 0 && errno != EACCES) {
+ /* we didnt get EACCES, so try again */
+ continue;
+ }
+ break;