aboutsummaryrefslogtreecommitdiff
path: root/sshnodelay.c
diff options
context:
space:
mode:
Diffstat (limited to 'sshnodelay.c')
-rw-r--r--sshnodelay.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sshnodelay.c b/sshnodelay.c
index 7518089..e1d9220 100644
--- a/sshnodelay.c
+++ b/sshnodelay.c
@@ -5,6 +5,32 @@
#include <netinet/in.h>
#include <netinet/tcp.h>
+#if __APPLE__
+
+int custom_connect(int sock, const struct sockaddr *addr, socklen_t addrlen);
+
+typedef struct interpose_s {
+ void *new_func;
+ void *orig_func;
+} interpose_t;
+
+static const interpose_t interposers[] \
+ __attribute__ ((section("__DATA, __interpose"))) = {
+ { (void *)custom_connect, (void *)connect },
+};
+
+int custom_connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
+{
+ int res = connect(sock, addr, addrlen);
+ if (!res && addr->sa_family == AF_INET) {
+ int opt = 1;
+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
+ }
+ return res;
+}
+
+#else /* !__APPLE__ */
+
int connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
{
int (*next_connect)(int, const struct sockaddr *, socklen_t) =
@@ -16,3 +42,5 @@ int connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
}
return res;
}
+
+#endif /* !__APPLE__ */