Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/rofl0r/proxychains-ng.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Filippov <alekseyf@google.com>2015-01-23 19:14:28 +0300
committerAleksey Filippov <alekseyf@google.com>2015-01-23 19:14:37 +0300
commit8dd08e2cd29b2b0c1174adac4935e256b38c08b7 (patch)
treef2e22cf2957638caad4b6afeee45e33df35173e2
parentea51cdac29026b94eeb00baefb568b82b9d05ca2 (diff)
add sendto hook to handle MSG_FASTOPEN flag
-rw-r--r--src/core.h4
-rw-r--r--src/libproxychains.c17
-rw-r--r--tests/test_sendto.c62
3 files changed, 83 insertions, 0 deletions
diff --git a/src/core.h b/src/core.h
index c4dcf8f..564df20 100644
--- a/src/core.h
+++ b/src/core.h
@@ -95,6 +95,10 @@ typedef int (*getaddrinfo_t)(const char *, const char *, const struct addrinfo *
typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *,
socklen_t, char *, socklen_t, int);
+typedef ssize_t (*sendto_t) (int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen);
+
+
extern connect_t true_connect;
extern gethostbyname_t true_gethostbyname;
diff --git a/src/libproxychains.c b/src/libproxychains.c
index fb5e43f..07a9865 100644
--- a/src/libproxychains.c
+++ b/src/libproxychains.c
@@ -52,6 +52,7 @@ getaddrinfo_t true_getaddrinfo;
freeaddrinfo_t true_freeaddrinfo;
getnameinfo_t true_getnameinfo;
gethostbyaddr_t true_gethostbyaddr;
+sendto_t true_sendto;
int tcp_read_time_out;
int tcp_connect_time_out;
@@ -113,6 +114,7 @@ static void do_init(void) {
proxychains_write_log(LOG_PREFIX "DLL init: proxychains-ng %s\n", proxychains_get_version());
SETUP_SYM(connect);
+ SETUP_SYM(sendto);
SETUP_SYM(gethostbyname);
SETUP_SYM(getaddrinfo);
SETUP_SYM(freeaddrinfo);
@@ -479,3 +481,18 @@ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) {
}
return NULL;
}
+
+ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen) {
+#ifdef MSG_FASTOPEN
+ if (flags & MSG_FASTOPEN) {
+ if (!connect(sockfd, dest_addr, addrlen) && errno != EINPROGRESS) {
+ return -1;
+ }
+ dest_addr = NULL;
+ addrlen = 0;
+ flags &= ~MSG_FASTOPEN;
+ }
+#endif
+ return true_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
+}
diff --git a/tests/test_sendto.c b/tests/test_sendto.c
new file mode 100644
index 000000000..77d2e9c
--- /dev/null
+++ b/tests/test_sendto.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+void error(const char *msg)
+{
+ perror(msg);
+ exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+ if (argc < 4) {
+ printf("Usage: %s host port method(connect or sendto)\n", argv[0]);
+ return 1;
+ }
+ const char *hostname = argv[1];
+ const int portno = atoi(argv[2]);
+ const char *method = argv[3];
+ char request[BUFSIZ];
+ sprintf(request, "GET / HTTP/1.0\r\nHost: %s\r\n\r\n", hostname);
+ int sockfd, n;
+ struct sockaddr_in serv_addr;
+ struct hostent *server;
+
+ char buffer[BUFSIZ];
+ sockfd = socket(AF_INET, SOCK_STREAM, 0);
+ if (sockfd < 0) error("ERROR opening socket");
+ server = gethostbyname(hostname);
+ if (server == NULL) {
+ fprintf(stderr, "%s: no such host\n", hostname);
+ return 1;
+ }
+ memset(&serv_addr, 0, sizeof(serv_addr));
+ serv_addr.sin_family = AF_INET;
+ memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
+ serv_addr.sin_port = htons(portno);
+ if (!strcmp(method, "connect")) {
+ if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
+ error("connect");
+ n = send(sockfd, request, strlen(request), 0);
+ } else if (!strcmp(method, "sendto")) {
+ n = sendto(sockfd, request, strlen(request), MSG_FASTOPEN, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
+ } else {
+ printf("Unknown method %s\n", method);
+ return 1;
+ }
+ if (n < 0)
+ error("send");
+ memset(buffer, 0, BUFSIZ);
+ n = read(sockfd, buffer, BUFSIZ - 1);
+ if (n < 0)
+ error("ERROR reading from socket");
+ printf("%s\n", buffer);
+ close(sockfd);
+ return 0;
+}