+ return 0;
+}
+
+void rpc_set_autoreconnect(struct rpc_context *rpc)
+{
+ assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
+ rpc->auto_reconnect = 1;
+}
+
+void rpc_unset_autoreconnect(struct rpc_context *rpc)
+{
+ assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
+ rpc->auto_reconnect = 0;
+}
+
+static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_storage *s)
+{
+ int socksize;
+
+ assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
+ 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;
+ }
+
+ /* 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.
+ *
+ * On Windows, there is no concept of privileged ports. Thus
+ * binding will usually succeed.
+ */
+ {
+ struct sockaddr_in sin;
+ static int portOfs = 0;
+ const int firstPort = 512; /* >= 512 according to Sun docs */
+ const int portCount = IPPORT_RESERVED - firstPort;
+ int startOfs, port, rc;
+
+ if (portOfs == 0) {
+ portOfs = time(NULL) % 400;