heartbeat

Simple server monitor system using encrypted messages over udp
git clone https://noulin.net/git/heartbeat.git
Log | Files | Refs | README

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:
Mheartbeat.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");