@@ -1298,7 +1298,14 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
1298
1298
std::string host_out;
1299
1299
uint16_t port_out{0 };
1300
1300
if (!SplitHostPort (socket_addr, port_out, host_out)) {
1301
+ #if HAVE_SOCKADDR_UN
1302
+ // Allow unix domain sockets for -proxy and -onion e.g. unix:/some/file/path
1303
+ if ((port_option != " -proxy" && port_option != " -onion" ) || socket_addr.find (ADDR_PREFIX_UNIX) != 0 ) {
1304
+ return InitError (InvalidPortErrMsg (port_option, socket_addr));
1305
+ }
1306
+ #else
1301
1307
return InitError (InvalidPortErrMsg (port_option, socket_addr));
1308
+ #endif
1302
1309
}
1303
1310
}
1304
1311
}
@@ -1365,12 +1372,18 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
1365
1372
// -noproxy (or -proxy=0) as well as the empty string can be used to not set a proxy, this is the default
1366
1373
std::string proxyArg = args.GetArg (" -proxy" , " " );
1367
1374
if (proxyArg != " " && proxyArg != " 0" ) {
1368
- const std::optional<CService> proxyAddr{Lookup (proxyArg, 9050 , fNameLookup )};
1369
- if (!proxyAddr.has_value ()) {
1370
- return InitError (strprintf (_ (" Invalid -proxy address or hostname: '%s'" ), proxyArg));
1375
+ Proxy addrProxy;
1376
+ if (IsUnixSocketPath (proxyArg)) {
1377
+ addrProxy = Proxy (proxyArg, proxyRandomize);
1378
+ } else {
1379
+ const std::optional<CService> proxyAddr{Lookup (proxyArg, 9050 , fNameLookup )};
1380
+ if (!proxyAddr.has_value ()) {
1381
+ return InitError (strprintf (_ (" Invalid -proxy address or hostname: '%s'" ), proxyArg));
1382
+ }
1383
+
1384
+ addrProxy = Proxy (proxyAddr.value (), proxyRandomize);
1371
1385
}
1372
1386
1373
- Proxy addrProxy = Proxy (proxyAddr.value (), proxyRandomize);
1374
1387
if (!addrProxy.IsValid ())
1375
1388
return InitError (strprintf (_ (" Invalid -proxy address or hostname: '%s'" ), proxyArg));
1376
1389
@@ -1396,11 +1409,16 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
1396
1409
" reaching the Tor network is explicitly forbidden: -onion=0" ));
1397
1410
}
1398
1411
} else {
1399
- const std::optional<CService> addr{Lookup (onionArg, 9050 , fNameLookup )};
1400
- if (!addr.has_value () || !addr->IsValid ()) {
1401
- return InitError (strprintf (_ (" Invalid -onion address or hostname: '%s'" ), onionArg));
1412
+ if (IsUnixSocketPath (onionArg)) {
1413
+ onion_proxy = Proxy (onionArg, proxyRandomize);
1414
+ } else {
1415
+ const std::optional<CService> addr{Lookup (onionArg, 9050 , fNameLookup )};
1416
+ if (!addr.has_value () || !addr->IsValid ()) {
1417
+ return InitError (strprintf (_ (" Invalid -onion address or hostname: '%s'" ), onionArg));
1418
+ }
1419
+
1420
+ onion_proxy = Proxy (addr.value (), proxyRandomize);
1402
1421
}
1403
- onion_proxy = Proxy{addr.value (), proxyRandomize};
1404
1422
}
1405
1423
}
1406
1424
0 commit comments