about summary refs log tree commit diff
path: root/bounce.c
diff options
context:
space:
mode:
authormultiplexd <multi@in-addr.xyz>2020-02-17 19:46:02 +0000
committerJune McEnroe <june@causal.agency>2020-02-18 16:11:57 -0500
commit91e38abd714d5dda2764022ea370d7dde73a55cc (patch)
tree03d4b9966168ca631c7c6093e51dfe888f8e1bbe /bounce.c
parentUse Xr for the first "pounce" in README (diff)
downloadpounce-91e38abd714d5dda2764022ea370d7dde73a55cc.tar.gz
pounce-91e38abd714d5dda2764022ea370d7dde73a55cc.zip
Implement source address selection
This commit introduces a '-S' command line option and a "bind" configuration
file option for selecting the source address when making outbound TCP
connections (similar to the corresponding option in catgirl(1)).
Diffstat (limited to 'bounce.c')
-rw-r--r--bounce.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/bounce.c b/bounce.c
index eef6c12..19e2dd4 100644
--- a/bounce.c
+++ b/bounce.c
@@ -258,6 +258,7 @@ int main(int argc, char *argv[]) {
 	bool insecure = false;
 	const char *clientCert = NULL;
 	const char *clientPriv = NULL;
+	const char *serverBindHost = NULL;
 
 	const char *host = NULL;
 	const char *port = "6697";
@@ -271,7 +272,7 @@ int main(int argc, char *argv[]) {
 	const char *join = NULL;
 	const char *quit = "connection reset by purr";
 
-	const char *Opts = "!A:C:H:K:NP:U:W:a:c:ef:g:h:j:k:n:p:q:r:s:u:vw:xy:";
+	const char *Opts = "!A:C:H:K:NP:S:U:W:a:c:ef:g:h:j:k:n:p:q:r:s:u:vw:xy:";
 	const struct option LongOpts[] = {
 		{ "insecure", no_argument, NULL, '!' },
 		{ "local-ca", required_argument, NULL, 'A' },
@@ -280,6 +281,7 @@ int main(int argc, char *argv[]) {
 		{ "local-priv", required_argument, NULL, 'K' },
 		{ "no-names", no_argument, NULL, 'N' },
 		{ "local-port", required_argument, NULL, 'P' },
+		{ "bind", required_argument, NULL, 'S' },
 		{ "local-path", required_argument, NULL, 'U' },
 		{ "local-pass", required_argument, NULL, 'W' },
 		{ "sasl-plain", required_argument, NULL, 'a' },
@@ -321,6 +323,7 @@ int main(int argc, char *argv[]) {
 			break; case 'K': strlcpy(privPath, optarg, sizeof(privPath));
 			break; case 'N': stateNoNames = true;
 			break; case 'P': bindPort = optarg;
+			break; case 'S': serverBindHost = optarg;
 			break; case 'U': strlcpy(bindPath, optarg, sizeof(bindPath));
 			break; case 'W': clientPass = optarg;
 			break; case 'a': sasl = true; plain = optarg;
@@ -403,7 +406,7 @@ int main(int argc, char *argv[]) {
 		: localBind(bind, ARRAY_LEN(bind), bindHost, bindPort);
 
 	serverConfig(insecure, clientCert, clientPriv);
-	int server = serverConnect(host, port);
+	int server = serverConnect(serverBindHost, host, port);
 
 #ifdef __FreeBSD__
 	int error = cap_enter();