commit 67211e6cd7818f8a91c76063a6ae49110be20319
parent f966b137279ee388aef1422f0f26724d0dabfaa2
Author: Remy Noulin <loader2x@gmail.com>
Date: Sun, 23 Jul 2023 08:31:03 +0200
check used port with /proc/net/tcp instead of bind
when bind is not good because it prevents the real server from starting
when heartbeat binds to the port.
heartbeat.c | 52 +++++++++++++++++++++++++++++++++++++---------------
1 file changed, 37 insertions(+), 15 deletions(-)
Diffstat:
| M | heartbeat.c | | | 52 | +++++++++++++++++++++++++++++++++++++--------------- |
1 file changed, 37 insertions(+), 15 deletions(-)
diff --git a/heartbeat.c b/heartbeat.c
@@ -869,23 +869,45 @@ void probe(char *cfgfile, char *secretFile, char *publicFile, char *loggerPublic
logE("Invalid probe at index %d", iI(probes));
XFailure;
}
+ // check all used ports tcp and tcp6
+ staticBitsetT(usedPortst, u64 , 65536);
+ usedPortst usedPorts;
+ staticBitsetInit(&usedPorts);
+ cleanAllocateSmallArray(tcp);
+ readFileG(tcp, "/proc/net/tcp");
+ delElemG(tcp, 0);
+ iter(tcp, L) {
+ castS(l, L);
+ // 0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 14737 1 ffff8d88f5265800 100 0 0 10 0
+ cleanSmallArrayP(ll) = splitG(l, ' ');
+ compactG(ll);
+ //logVarG(ll);
+ char *localAddr = $(ll, 1);
+ char *portStart = localAddr + 8;
+ *portStart = 'x';
+ u16 port = parseHex(portStart-1);
+ //logVarG(port);
+ staticBitset1(&usedPorts, port);
+ }
+ emptyG(tcp);
+ readFileG(tcp, "/proc/net/tcp6");
+ delElemG(tcp, 0);
+ iter(tcp, L) {
+ castS(l, L);
+ // 0: 00000000000000000000000000000000:0050 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 12592 1 ffff8d88f6b7c940 100 0 0 10 0
+ cleanSmallArrayP(ll) = splitG(l, ' ');
+ compactG(ll);
+ //logVarG(ll);
+ char *localAddr = $(ll, 1);
+ char *portStart = localAddr + 32;
+ *portStart = 'x';
+ u16 port = parseHex(portStart-1);
+ //logVarG(port);
+ staticBitset1(&usedPorts, port);
+ }
if (hasG(p, "port")) {
- // try to bind
- int sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock < 0){
+ if (not staticBitsetGet(&usedPorts, u$(p, "port")))
msg.status |= 1UL << iI(probes);
- }
- else {
- struct sockaddr_in server;
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = INADDR_ANY;
- server.sin_port = htons((u16)u$(p, "port"));
- if (bind(sock, (struct sockaddr *) &server, sizeof(server)) == 0) {
- // bind successful
- msg.status |= 1UL << iI(probes);
- }
- close(sock);
- }
}
elif (hasG(p, "if")) {
// TODO("check if network interface is down");