return -1;
if (as > bs)
return +1;
+ if (a < b)
+ return -1;
+ if (a > b)
+ return +1;
return 0;
}
family = AF_INET;
}
+ /*
+ * Remove the socket from the tree before we overwrite its
+ * internal socket id, because that forms part of the tree's
+ * sorting criterion. We'll add it back before exiting this
+ * function, whether we changed anything or not.
+ */
+ del234(sktree, sock);
+
s = p_socket(family, SOCK_STREAM, 0);
sock->s = s;
sock->writable = 1;
}
- add234(sktree, sock);
-
err = 0;
ret:
+
+ /*
+ * No matter what happened, put the socket back in the tree.
+ */
+ add234(sktree, sock);
+
if (err)
plug_log(sock->plug, 1, sock->addr, sock->port, sock->error, err);
return err;
#ifndef NO_IPV6
if (isa.ss_family == AF_INET &&
s->localhost_only &&
- !ipv4_is_local_addr(((struct sockaddr_in *)&isa)->sin_addr)) {
+ !ipv4_is_local_addr(((struct sockaddr_in *)&isa)->sin_addr))
#else
- if (s->localhost_only && !ipv4_is_local_addr(isa.sin_addr)) {
+ if (s->localhost_only && !ipv4_is_local_addr(isa.sin_addr))
#endif
+ {
p_closesocket(t); /* dodgy WinSock let nonlocal through */
} else if (plug_accepting(s->plug, (void*)t)) {
p_closesocket(t); /* denied or error */
s->frozen_readable = 0;
}
+void socket_reselect_all(void)
+{
+ Actual_Socket s;
+ int i;
+
+ for (i = 0; (s = index234(sktree, i)) != NULL; i++) {
+ if (!s->frozen)
+ do_select(s->s, 1);
+ }
+}
+
/*
* For Plink: enumerate all sockets currently active.
*/
return 0;
}
-SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname)
+SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
+ char **canonicalname)
{
SockAddr ret = snew(struct SockAddr_tag);
memset(ret, 0, sizeof(struct SockAddr_tag));