upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/btftunnel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/btftunnel.cpp')
-rw-r--r--src/btftunnel.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/btftunnel.cpp b/src/btftunnel.cpp
index 65c4b89..63d178b 100644
--- a/src/btftunnel.cpp
+++ b/src/btftunnel.cpp
@@ -23,6 +23,7 @@ typedef int SOCKET;
23#define SD_BOTH SHUT_RDWR 23#define SD_BOTH SHUT_RDWR
24#endif 24#endif
25#endif 25#endif
26#include "sockcount.h"
26#include <cstring> 27#include <cstring>
27#include <vector> 28#include <vector>
28#include <thread> 29#include <thread>
@@ -39,7 +40,7 @@ bool TunnelInit()
39// Returns app end and pump end; both are ordinary full-duplex TCP sockets. 40// Returns app end and pump end; both are ordinary full-duplex TCP sockets.
40static bool MakeLocalPair(btf_socket_t& appEnd, btf_socket_t& pumpEnd) 41static bool MakeLocalPair(btf_socket_t& appEnd, btf_socket_t& pumpEnd)
41{ 42{
42 SOCKET listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 43 SOCKET listener = BtfSocketTag(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), SOCK_PAIR_LISTEN);
43 if (listener == INVALID_SOCKET) return false; 44 if (listener == INVALID_SOCKET) return false;
44 45
45 struct sockaddr_in addr; 46 struct sockaddr_in addr;
@@ -47,23 +48,23 @@ static bool MakeLocalPair(btf_socket_t& appEnd, btf_socket_t& pumpEnd)
47 addr.sin_family = AF_INET; 48 addr.sin_family = AF_INET;
48 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 49 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
49 addr.sin_port = 0; // ephemeral 50 addr.sin_port = 0; // ephemeral
50 if (bind(listener, (struct sockaddr*)&addr, sizeof(addr)) != 0) { closesocket(listener); return false; } 51 if (bind(listener, (struct sockaddr*)&addr, sizeof(addr)) != 0) { BtfCloseSocket(listener); return false; }
51 if (listen(listener, 1) != 0) { closesocket(listener); return false; } 52 if (listen(listener, 1) != 0) { BtfCloseSocket(listener); return false; }
52 53
53#ifdef _WIN32 54#ifdef _WIN32
54 int len = sizeof(addr); 55 int len = sizeof(addr);
55#else 56#else
56 socklen_t len = sizeof(addr); 57 socklen_t len = sizeof(addr);
57#endif 58#endif
58 if (getsockname(listener, (struct sockaddr*)&addr, &len) != 0) { closesocket(listener); return false; } 59 if (getsockname(listener, (struct sockaddr*)&addr, &len) != 0) { BtfCloseSocket(listener); return false; }
59 60
60 SOCKET a = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 61 SOCKET a = BtfSocketTag(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), SOCK_PAIR_APP);
61 if (a == INVALID_SOCKET) { closesocket(listener); return false; } 62 if (a == INVALID_SOCKET) { BtfCloseSocket(listener); return false; }
62 if (connect(a, (struct sockaddr*)&addr, sizeof(addr)) != 0) { closesocket(a); closesocket(listener); return false; } 63 if (connect(a, (struct sockaddr*)&addr, sizeof(addr)) != 0) { BtfCloseSocket(a); BtfCloseSocket(listener); return false; }
63 64
64 SOCKET b = accept(listener, NULL, NULL); 65 SOCKET b = BtfSocketTag(accept(listener, NULL, NULL), SOCK_PAIR_PUMP);
65 closesocket(listener); 66 BtfCloseSocket(listener);
66 if (b == INVALID_SOCKET) { closesocket(a); return false; } 67 if (b == INVALID_SOCKET) { BtfCloseSocket(a); return false; }
67 68
68 appEnd = a; 69 appEnd = a;
69 pumpEnd = b; 70 pumpEnd = b;
@@ -129,7 +130,7 @@ static btf_socket_t StartTunnel(RvSocket rv, const unsigned char shared[32])
129 std::thread(PumpOut, pumpEnd, rv, key).detach(); 130 std::thread(PumpOut, pumpEnd, rv, key).detach();
130 std::thread([pumpEnd, rv, key]() { 131 std::thread([pumpEnd, rv, key]() {
131 PumpIn(pumpEnd, rv, key); 132 PumpIn(pumpEnd, rv, key);
132 closesocket(pumpEnd); 133 BtfCloseSocket(pumpEnd);
133 RvClose(rv); 134 RvClose(rv);
134 }).detach(); 135 }).detach();
135 return appEnd; 136 return appEnd;