penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

commit 4e5195e2690719938c1541568f2ca7e38f7cbab4

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-05-27T16:45:38Z
subjectMoved tcp-specific call back into tcp_route
commit 4e5195e2690719938c1541568f2ca7e38f7cbab4
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-05-27T16:45:38Z

    Moved tcp-specific call back into tcp_route
---
 src/proxy_proto_v2.c | 34 ----------------------------------
 src/proxy_proto_v2.h | 21 +++++----------------
 src/tcp_route.c      | 20 ++++++++++++++++----
 3 files changed, 21 insertions(+), 54 deletions(-)

diff --git a/src/proxy_proto_v2.c b/src/proxy_proto_v2.c
index 3a60c99..864e544 100644
--- a/src/proxy_proto_v2.c
+++ b/src/proxy_proto_v2.c
@@ -1,5 +1,3 @@
-#include <event2/bufferevent.h>
-
 #include <errno.h>
 #include <stdint.h>
 #include <string.h>
@@ -126,35 +124,3 @@ int proxy_v2_build(
 		return -EAFNOSUPPORT;
 	}
 }
-
-int proxy_v2_write_bufferevent(
-	struct bufferevent *bev,
-	const struct sockaddr *src,
-	socklen_t src_len,
-	const struct sockaddr *dst,
-	socklen_t dst_len,
-	int sock_type
-) {
-	unsigned char hdr[256];
-	size_t hdr_len = 0;
-
-	int rc = proxy_v2_build(
-		hdr,
-		sizeof(hdr),
-		src,
-		src_len,
-		dst,
-		dst_len,
-		sock_type,
-		&hdr_len
-	);
-	if (rc != 0) {
-		return rc;
-	}
-
-	if (bufferevent_write(bev, hdr, hdr_len) < 0) {
-		return -EIO;
-	}
-
-	return 0;
-}
diff --git a/src/proxy_proto_v2.h b/src/proxy_proto_v2.h
index 9a2e579..1ad8be6 100644
--- a/src/proxy_proto_v2.h
+++ b/src/proxy_proto_v2.h
@@ -5,14 +5,12 @@
 
 #define PP2_VERSION_CMD_PROXY 0x21
 
-#define PP2_FAM_INET		  0x10
-#define PP2_FAM_INET6		 0x20
-#define PP2_FAM_UNIX		  0x30
+#define PP2_FAM_INET     0x10
+#define PP2_FAM_INET6    0x20
+#define PP2_FAM_UNIX     0x30
 
-#define PP2_TRANS_STREAM	  0x01
-#define PP2_TRANS_DGRAM	   0x02
-
-struct bufferevent;
+#define PP2_TRANS_STREAM 0x01
+#define PP2_TRANS_DGRAM  0x02
 
 int proxy_v2_build(
 	unsigned char *buf,
@@ -25,13 +23,4 @@ int proxy_v2_build(
 	size_t *out_len
 );
 
-int proxy_v2_write_bufferevent(
-	struct bufferevent *bev,
-	const struct sockaddr *src,
-	socklen_t src_len,
-	const struct sockaddr *dst,
-	socklen_t dst_len,
-	int sock_type
-);
-
 #endif
diff --git a/src/tcp_route.c b/src/tcp_route.c
index 5394c46..0ac1451 100644
--- a/src/tcp_route.c
+++ b/src/tcp_route.c
@@ -323,15 +323,27 @@ static void worker_adopt_client_fd(struct worker *w, struct accepted_client *ac)
 			return;
 		}
 
-		int rc = proxy_v2_write_bufferevent(
-			conn->upstream,
+		unsigned char hdr[256];
+		size_t hdr_len = 0;
+
+		int rc = proxy_v2_build(
+			hdr,
+			sizeof(hdr),
 			(const struct sockaddr *)&ac->peer_addr,
 			ac->peer_addr_len,
-			(struct sockaddr *)&local_addr,
+			(const struct sockaddr *)&local_addr,
 			local_len,
-			SOCK_STREAM
+			SOCK_STREAM,
+			&hdr_len
 		);
 
+		if (rc == 0) {
+			rc = bufferevent_write(conn->upstream, hdr, hdr_len);
+			if (rc < 0) {
+				rc = -EIO;
+			}
+		}
+
 		if (rc < 0) {
 			LOG_ERROR("failed to write PROXY v2 header", "err", _LOGV(strerror(-rc)));
 			free_conn(conn);